Skip to content

feat(pubmed): envolver saída em ArticleSet/DOCTYPE e corrigir ordem dos elementos#1243

Open
Rossi-Luciano wants to merge 1 commit into
scieloorg:masterfrom
Rossi-Luciano:feat/1234-pubmed-article-set-envelope
Open

feat(pubmed): envolver saída em ArticleSet/DOCTYPE e corrigir ordem dos elementos#1243
Rossi-Luciano wants to merge 1 commit into
scieloorg:masterfrom
Rossi-Luciano:feat/1234-pubmed-article-set-envelope

Conversation

@Rossi-Luciano

Copy link
Copy Markdown
Collaborator

O que esse PR faz?

Adiciona o envelope <!DOCTYPE ArticleSet ...> + <ArticleSet> exigido pela DTD do PubMed à saída de packtools/sps/formats/pubmed.py, que hoje gera um <Article> solto e inválido segundo a DTD oficial.

  • Extrai a construção do <Article> (antes inline em pipeline_pubmed) para build_pubmed_article(xml_tree).
  • Adiciona pipeline_pubmed_set(xml_trees, pretty_print=True), que agrupa N artigos num único <ArticleSet> — pré-requisito para o processamento em lote da CLI (Pubmed XML: CLI em lote (.zip) e registro como comando instalável #1241).
  • Mantém pipeline_pubmed(xml_tree, pretty_print=True) com a assinatura original (delega para pipeline_pubmed_set([xml_tree], ...)), então nenhum código que já chama essa função quebra.

Ao validar a saída contra a DTD oficial real do PubMed (não o validador web citado na issue-mãe, que é para outro formato — ver seção de contexto), apareceram 2 bugs no pipeline existente, corrigidos neste PR:

  • Abstract/OtherAbstract precisavam vir antes de CopyrightInformation/CoiStatement/ObjectList/ReferenceList no <Article> — a DTD exige essa ordem (Abstract?, OtherAbstract*, CopyrightInformation?, CoiStatement?, ObjectList?, ReferenceList*), e o pipeline gerava na ordem inversa.
  • xml_pubmed_vernacular_title_pipe nunca era chamado dentro do pipeline, apesar de implementado e coberto por teste próprio (test_xml_pubmed_vernacular_title_pipe) — código morto por falta de wiring.

Onde a revisão poderia começar?

packtools/sps/formats/pubmed.py, a partir da constante PUBMED_DOCTYPE até o fim do arquivo: xml_pubmed_article_set_pipe, build_pubmed_article, pipeline_pubmed_set, pipeline_pubmed. Nenhuma função de pipe individual (xml_pubmed_X_pipe) foi alterada — só a orquestração e ordem em volta delas.

Como este poderia ser testado manualmente?

  1. Rodar a suíte: source .venv/bin/activate && python -m pytest tests/sps/formats/test_pubmed.py -v (48 passed: 46 originais + 2 novos cobrindo o envelope).
  2. Gerar um XML real via CLI:
    python -m packtools.sps.formats.pubmed_generator \
      -i tests/samples/0034-7094-rba-69-03-0227.xml \
      -o /tmp/saida.pubmed.xml
    
    Confirmar visualmente que a saída tem DOCTYPE + <ArticleSet><Article>...</Article></ArticleSet>, não um <Article> solto.
  3. Validar contra a DTD oficial:
    curl -o /tmp/PubMed.dtd https://dtd.nlm.nih.gov/ncbi/pubmed/in/PubMed.dtd
    python3 - <<'PY'
    from lxml import etree as ET
    dtd = ET.DTD('/tmp/PubMed.dtd')
    doc = ET.parse('/tmp/saida.pubmed.xml')
    print('VALID:', dtd.validate(doc))
    for err in dtd.error_log:
        print(err)
    PY
    
    Resultado obtido: VALID: True, tanto para artigo único quanto para pipeline_pubmed_set com 2 artigos no mesmo ArticleSet.

Algum cenário de contexto que queira dar?

A #1226 pede um conversor completo SPS 1.10 → PubMed XML. O módulo já existia (pubmed.py/pubmed_generator.py, 46 testes) mas não do zero — o trabalho foi quebrado em 8 sub-issues (#1234#1241), sendo esta a primeira (#1234), pré-requisito estrutural para o processamento em lote (#1241).

O link do validador referenciado na #1226 (ncbi.nlm.nih.gov/projects/linkout/doc/file-validator.html) é para XML de LinkOut (outro sistema NCBI, de outro formato) — colar a saída deste pipeline lá retorna "Unknown file content", que não é sinal de erro no XML gerado. A validação real precisa ser feita contra a DTD do PubMed ArticleSet (https://dtd.nlm.nih.gov/ncbi/pubmed/in/PubMed.dtd, a mesma referenciada no DOCTYPE que este PR adiciona), via lxml.etree.DTD ou xmllint --dtdvalid. Foi assim que os 2 bugs de ordenação/wiring corrigidos aqui foram encontrados.

Um terceiro achado da validação (Journal/PubDate obrigatório na DTD, mas ausente quando o artigo fonte não tem data reconhecida) ficou fora do escopo deste PR e virou a #1242.

Screenshots

Não se aplica — mudança em geração de XML, sem interface gráfica.

Quais são tickets relevantes?

Closes #1234. Relacionado a #1226 (issue-mãe), #1241 (depende deste PR), #1242 (achado durante a validação, escopo separado).

Referências

…os elementos

pipeline_pubmed() gerava um <Article> solto, sem o envelope <ArticleSet>
e DOCTYPE exigidos pela DTD do PubMed. Extrai a construção do <Article>
para build_pubmed_article() e adiciona pipeline_pubmed_set() para
agrupar múltiplos artigos num único <ArticleSet> (pré-requisito da scieloorg#1241).

Validação contra a DTD oficial (lxml.etree.DTD +
https://dtd.nlm.nih.gov/ncbi/pubmed/in/PubMed.dtd) expôs 2 bugs no
pipeline, corrigidos aqui: Abstract/OtherAbstract precisavam vir antes
de CopyrightInformation/CoiStatement/ObjectList/ReferenceList, e
VernacularTitle nunca era chamado apesar de implementado e testado.

Refs scieloorg#1226, scieloorg#1234
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: adicionar envelope ArticleSet/FileHeader + DOCTYPE

2 participants