Skip to content

fix(pubmed): trata ausência de PubDate como erro em vez de gerar Journal inválido#1250

Open
Rossi-Luciano wants to merge 2 commits into
scieloorg:masterfrom
Rossi-Luciano:feat/1242-pubmed-pubdate-required
Open

fix(pubmed): trata ausência de PubDate como erro em vez de gerar Journal inválido#1250
Rossi-Luciano wants to merge 2 commits into
scieloorg:masterfrom
Rossi-Luciano:feat/1242-pubmed-pubdate-required

Conversation

@Rossi-Luciano

Copy link
Copy Markdown
Contributor

O que esse PR faz?

Resolve #1242. Journal/PubDate é obrigatório na DTD oficial do PubMed ((PublisherName, JournalTitle, Issn, Volume?, Issue?, PubDate) — sem ?), mas xml_pubmed_pub_date_pipe só preenche a tag <PubDate> quando encontra uma data reconhecida (dates.ArticleDates(xml_tree).article_date). Quando o artigo fonte não tem essa data, a tag ficava ausente e o Journal gerado era inválido segundo a DTD.

Conforme decisão do responsável pela issue: em vez de tentar um fallback para outra data (collection_date etc.) ou gerar XML tecnicamente inválido, o comportamento correto é não gerar o XML e informar ao usuário a obrigatoriedade da data.

  • packtools/sps/formats/pubmed.py: nova exceção MissingRequiredPubDateError; pipeline_pubmed verifica se Journal/PubDate foi preenchido e levanta a exceção com uma mensagem explicando a obrigatoriedade na DTD, caso não encontre data. xml_pubmed_pub_date_pipe isolada não muda de comportamento (mantém os testes existentes, incluindo test_xml_pubmed_pub_date_pipe_without_date).
  • packtools/sps/formats/pubmed_generator.py: o CLI captura a exceção, imprime Erro: ... em stderr e sai com código 1, sem escrever arquivo de saída.
  • 2 novos testes em tests/sps/formats/test_pubmed.py cobrindo os dois caminhos (com e sem data).

Onde a revisão poderia começar?

packtools/sps/formats/pubmed.py, na função pipeline_pubmed (verificação logo após xml_pubmed_pub_date_pipe).

Como este poderia ser testado manualmente?

python -m packtools.sps.formats.pubmed_generator -i <xml sem pub-date> -o saida.xml

Deve imprimir Erro: Journal/PubDate é obrigatório... em stderr, sair com código 1, e não criar saida.xml.

Algum cenário de contexto que queira dar?

Encontrado ao validar a saída de pipeline_pubmed contra a DTD oficial (https://dtd.nlm.nih.gov/ncbi/pubmed/in/PubMed.dtd) via lxml.etree.DTD, reproduzido com um artigo sem pub-date. Ao reconciliar este PR com #1234/#1241 (pipeline_pubmed_set/CLI em lote), a mesma checagem precisará ser replicada em build_pubmed_article para que um artigo sem data seja pulado (com aviso) em vez de derrubar o ArticleSet inteiro.

Quais são tickets relevantes?

Resolve #1242. Parte de #1226.

Referências

DTD oficial: https://dtd.nlm.nih.gov/ncbi/pubmed/in/PubMed.dtd

…nal inválido

Journal/PubDate é obrigatório na DTD do PubMed ((..., PubDate), sem
"?"), mas xml_pubmed_pub_date_pipe só preenche a tag quando encontra
uma data reconhecida. pipeline_pubmed agora levanta
MissingRequiredPubDateError quando isso não acontece, e o CLI
(pubmed_generator) informa o erro ao usuário e não escreve saída,
em vez de gerar um Journal inválido segundo a DTD.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Comment thread packtools/sps/formats/pubmed.py Outdated
Comment on lines +274 to +278
if xml_pubmed.find("Journal/PubDate") is None:
raise MissingRequiredPubDateError(
"Journal/PubDate é obrigatório na DTD do PubMed e não foi "
"possível determinar uma data de publicação para este artigo."
)

@robertatakenaka robertatakenaka Jul 6, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Rossi-Luciano o tratamento de erro deveria ser feito dentro da função que cria o elemento. Mas note que se o elemento não foi criado o problema não é da saída mas sim da entrada.

Além disso, o tratamento tem que ser padrão, porque só da data está tendo este tratamento? Todos os elementos obrigatórios também deveria ser verificados. Para os elementos opcionais vale lembrar que apesar de opcionais se existir é obrigatório. Então, valeria um WARNING caso sinta falta do elemento. Indica uma proatividade do sistema

@Rossi-Luciano Rossi-Luciano Jul 10, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@robertatakenaka faz sentido, obrigado pelo apontamento. Duas mudanças:

  1. O check agora mora dentro de xml_pubmed_pub_date_pipe (a função que constrói o elemento), em vez de solto em pipeline_pubmed depois do fato. MissingRequiredPubDateError virou MissingRequiredElementError(element_path), genérica, para poder ser reaproveitada por outros elementos.

  2. Conferi a DTD oficial e você está certa que isso não deveria ser só do PubDate: Journal exige também PublisherName, JournalTitle e Issn (<!ELEMENT Journal (PublisherName, JournalTitle, Issn, Volume?, Issue?, PubDate)>) — hoje esses três são gerados silenciosamente ausentes se o dado de origem não existir, sem warning nem erro. Abri a Pubmed XML: validar demais elementos obrigatórios de Journal (PublisherName, JournalTitle, Issn) + warning para opcionais incompletos #1254 como sub-issue de Implementar função e utilitário de CLI para conversão de SciELO XML (SPS 1.10) para PubMed XML #1226 para tratar isso (mesmo padrão de required-check nos três + um mecanismo de WARNING para os elementos opcionais que, quando presentes, têm sub-requisitos incompletos — como o caso de Author/FirstName-LastName já resolvido em feat(pubmed): adicionar Suffix e CollectiveName em AuthorList #1245). Preferi não inflar esta PR com esse escopo maior.

Commit com a mudança: 400156f.

…el error

Endereça o comentário de review da @robertatakenaka na scieloorg#1250: o check
de obrigatoriedade deve morar na função que constrói o elemento
(xml_pubmed_pub_date_pipe), não solto em pipeline_pubmed depois do
fato -- e a ausência do elemento é um problema do dado de entrada, não
da geração de saída. MissingRequiredPubDateError vira
MissingRequiredElementError(element_path), já pronta para ser reusada
pelos outros elementos obrigatórios de Journal (PublisherName,
JournalTitle, Issn) numa issue de acompanhamento.
Rossi-Luciano added a commit to Rossi-Luciano/packtools that referenced this pull request Jul 10, 2026
…el error

Per review on scieloorg#1250: the required-element check belongs to the pipe
function that builds the element, not bolted on after the fact in
build_pubmed_article -- and a missing element reflects incomplete
source data, not a transform bug. MissingRequiredPubDateError becomes
MissingRequiredElementError(element_path), raised directly inside
xml_pubmed_pub_date_pipe, ready to be reused for the other DTD-required
Journal children (PublisherName, JournalTitle, Issn) in a follow-up.
Rossi-Luciano added a commit to Rossi-Luciano/packtools that referenced this pull request Jul 10, 2026
…mentError

Segue o refactor de scieloorg#1250/scieloorg#1234 que generalizou a exceção de
required-PubDate. Sem mudança de comportamento.
Rossi-Luciano added a commit to Rossi-Luciano/packtools that referenced this pull request Jul 10, 2026
…mentError

Segue o refactor de scieloorg#1250/scieloorg#1234 que generalizou a exceção de
required-PubDate. Sem mudança de comportamento.
Rossi-Luciano added a commit to Rossi-Luciano/packtools that referenced this pull request Jul 10, 2026
…mentError

Segue o refactor de scieloorg#1250/scieloorg#1234 que generalizou a exceção de
required-PubDate. Sem mudança de comportamento.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Pubmed XML: Journal/PubDate é obrigatório na DTD mas pode ficar ausente na saída

2 participants