fix(pubmed): trata ausência de PubDate como erro em vez de gerar Journal inválido#1250
fix(pubmed): trata ausência de PubDate como erro em vez de gerar Journal inválido#1250Rossi-Luciano wants to merge 2 commits into
Conversation
…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>
| 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." | ||
| ) |
There was a problem hiding this comment.
@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
There was a problem hiding this comment.
@robertatakenaka faz sentido, obrigado pelo apontamento. Duas mudanças:
-
O check agora mora dentro de
xml_pubmed_pub_date_pipe(a função que constrói o elemento), em vez de solto empipeline_pubmeddepois do fato.MissingRequiredPubDateErrorvirouMissingRequiredElementError(element_path), genérica, para poder ser reaproveitada por outros elementos. -
Conferi a DTD oficial e você está certa que isso não deveria ser só do
PubDate:Journalexige tambémPublisherName,JournalTitleeIssn(<!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 deAuthor/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.
…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.
…mentError Segue o refactor de scieloorg#1250/scieloorg#1234 que generalizou a exceção de required-PubDate. Sem mudança de comportamento.
…mentError Segue o refactor de scieloorg#1250/scieloorg#1234 que generalizou a exceção de required-PubDate. Sem mudança de comportamento.
…mentError Segue o refactor de scieloorg#1250/scieloorg#1234 que generalizou a exceção de required-PubDate. Sem mudança de comportamento.
O que esse PR faz?
Resolve #1242.
Journal/PubDateé obrigatório na DTD oficial do PubMed ((PublisherName, JournalTitle, Issn, Volume?, Issue?, PubDate)— sem?), masxml_pubmed_pub_date_pipesó 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 oJournalgerado era inválido segundo a DTD.Conforme decisão do responsável pela issue: em vez de tentar um fallback para outra data (
collection_dateetc.) 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çãoMissingRequiredPubDateError;pipeline_pubmedverifica seJournal/PubDatefoi preenchido e levanta a exceção com uma mensagem explicando a obrigatoriedade na DTD, caso não encontre data.xml_pubmed_pub_date_pipeisolada não muda de comportamento (mantém os testes existentes, incluindotest_xml_pubmed_pub_date_pipe_without_date).packtools/sps/formats/pubmed_generator.py: o CLI captura a exceção, imprimeErro: ...em stderr e sai com código 1, sem escrever arquivo de saída.tests/sps/formats/test_pubmed.pycobrindo os dois caminhos (com e sem data).Onde a revisão poderia começar?
packtools/sps/formats/pubmed.py, na funçãopipeline_pubmed(verificação logo apósxml_pubmed_pub_date_pipe).Como este poderia ser testado manualmente?
Deve imprimir
Erro: Journal/PubDate é obrigatório...em stderr, sair com código 1, e não criarsaida.xml.Algum cenário de contexto que queira dar?
Encontrado ao validar a saída de
pipeline_pubmedcontra a DTD oficial (https://dtd.nlm.nih.gov/ncbi/pubmed/in/PubMed.dtd) vialxml.etree.DTD, reproduzido com um artigo sempub-date. Ao reconciliar este PR com #1234/#1241 (pipeline_pubmed_set/CLI em lote), a mesma checagem precisará ser replicada embuild_pubmed_articlepara que um artigo sem data seja pulado (com aviso) em vez de derrubar oArticleSetinteiro.Quais são tickets relevantes?
Resolve #1242. Parte de #1226.
Referências
DTD oficial: https://dtd.nlm.nih.gov/ncbi/pubmed/in/PubMed.dtd