Skip to content

feat(pubmed): implementar GroupList/Group/GroupName/IndividualName#1246

Open
Rossi-Luciano wants to merge 4 commits into
scieloorg:masterfrom
Rossi-Luciano:feat/1237-pubmed-group-list
Open

feat(pubmed): implementar GroupList/Group/GroupName/IndividualName#1246
Rossi-Luciano wants to merge 4 commits into
scieloorg:masterfrom
Rossi-Luciano:feat/1237-pubmed-group-list

Conversation

@Rossi-Luciano

Copy link
Copy Markdown
Collaborator

Nota: esta branch parte de feat/1236-pubmed-suffix-collective-name (PR #1245, ainda não mergeado), porque depende diretamente da lógica de exclusividade Author (nome pessoal vs. CollectiveName) implementada lá. O diff abaixo inclui os commits do #1245 até ele ser mergeado em master — depois disso, o diff deste PR encolhe automaticamente para só as mudanças novas de GroupList.

O que esse PR faz?

Implementa GroupList/Group/GroupName/IndividualName no conversor SPS → PubMed XML para artigos com autoria em grupo, seguindo o padrão SPS 1.10:

<contrib-group>
   <contrib contrib-type="author" id="collab">
     <collab>The SciELO Group</collab>
   </contrib>
</contrib-group>
<contrib-group content-type="collab-list">
    <contrib contrib-type="author" rid="collab">
      <name>...</name>
    </contrib>
    ...
</contrib-group>

Antes deste PR, xml_pubmed_author_list achatava os membros do collab-list como Author comuns dentro de AuthorList, duplicando a autoria do grupo sem nenhuma referência ao grupo em si. Agora:

  • xml_pubmed_author_list exclui da AuthorList os contribs com contrib-group-type == "collab-list" (mantém neles apenas o Author com CollectiveName, do PR feat(pubmed): adicionar Suffix e CollectiveName em AuthorList #1245).
  • Nova função xml_pubmed_group_list monta GroupList/Group/GroupName/IndividualName a partir desses mesmos contribs, reaproveitando add_first_name, add_last_name, add_suffix, add_affiliations, add_orcid — o dado já vem com a chave contrib-group-type exposta pelo model article_contribs.TextContribs.main_contribs, não precisou alterar nenhum model.
  • Chamada de xml_pubmed_group_list inserida logo após xml_pubmed_author_list no pipeline, seguindo a ordem exigida pela DTD do PubMed (AuthorList?, GroupList?, PublicationType*).

Limitação conhecida: se um artigo tiver mais de um grupo de autoria simultâneo (mais de um <collab> isolado), este PR não distingue qual collab-list pertence a qual grupo — todos os membros do(s) collab-list são colocados sob um único Group. Não há exemplo desse cenário nem no guia SPS 1.10 nem nos arquivos de teste; o padrão observado sempre tem um grupo só por artigo.

Onde a revisão poderia começar?

packtools/sps/formats/pubmed.py: xml_pubmed_author_list (filtro adicionado no início), e as funções novas get_group_members, get_group_name, add_individual_name, xml_pubmed_group_list.

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 (51 passed: 48 do PR feat(pubmed): adicionar Suffix e CollectiveName em AuthorList #1245 + 3 novos aqui).
  2. Testar o cenário de grupo:
    from lxml import etree as ET
    from packtools.sps.formats import pubmed
    
    xml_tree = ET.fromstring('''
    <article xmlns:mml="http://www.w3.org/1998/Math/MathML"
             xmlns:xlink="http://www.w3.org/1999/xlink" article-type="research-article"
             dtd-version="1.1" specific-use="sps-1.9" xml:lang="en">
      <front><article-meta>
        <contrib-group>
          <contrib contrib-type="author" id="collab">
            <collab>The SciELO Group</collab>
            <xref ref-type="author-notes" rid="fn1">1</xref>
          </contrib>
        </contrib-group>
        <contrib-group content-type="collab-list">
          <contrib contrib-type="author" rid="collab">
            <contrib-id contrib-id-type="orcid">0000-0001-0002-0003</contrib-id>
            <name><surname>Esteves</surname><given-names>Felipe</given-names></name>
            <xref ref-type="aff" rid="aff1">1</xref>
          </contrib>
          <contrib contrib-type="author" rid="collab">
            <name><surname>Souza</surname><given-names>Joyce</given-names></name>
            <xref ref-type="aff" rid="aff1">1</xref>
          </contrib>
        </contrib-group>
        <aff id="aff1"><institution content-type="original">Uni X</institution></aff>
      </article-meta></front>
    </article>
    ''')
    xml_pubmed = ET.fromstring('<Article/>')
    pubmed.xml_pubmed_author_list(xml_pubmed, xml_tree)
    pubmed.xml_pubmed_group_list(xml_pubmed, xml_tree)
    print(ET.tostring(xml_pubmed, pretty_print=True).decode())
    Resultado esperado: AuthorList com um único Author/CollectiveName, e GroupList/Group com GroupName + 2 IndividualName (Felipe Esteves, Joyce Souza), cada um com afiliação e ORCID quando disponível.
  3. Rodar contra um artigo real sem autoria em grupo (tests/samples/0034-7094-rba-69-03-0227.xml) para confirmar que AuthorList não muda e GroupList simplesmente não é gerado.

Algum cenário de contexto que queira dar?

Última peça da quebra de autoria da #1226/#1236 em sub-issues.

Quais são tickets relevantes?

Closes #1237. Depende de #1245 (#1236). Relacionado a #1226 (issue-mãe).

Referências

  • DTD oficial do PubMed: GroupList (Group+), Group (GroupName?, IndividualName+), IndividualName (FirstName, MiddleName?, LastName, Suffix?, affiliation, Identifier*)https://dtd.nlm.nih.gov/ncbi/pubmed/in/PubMed.dtd
  • Guia SciELO SPS 1.10, seção <contrib>: exemplo "Autores pertencentes a um grupo"

Implementa add_suffix e add_collective_name em
packtools/sps/formats/pubmed.py, usando dados já expostos pelo model
article_contribs.Contrib (contrib_name["suffix"] e collab).

A DTD do PubMed exige que <Author> tenha nome pessoal
(FirstName/MiddleName/LastName/Suffix) OU CollectiveName, nunca os
dois: (((FirstName, MiddleName?, LastName, Suffix?, Initials?) |
CollectiveName), affiliation, Identifier*). xml_pubmed_author_list
agora respeita essa exclusividade: contribs com <collab> (sem <name>)
geram só CollectiveName, os demais geram FirstName/LastName/Suffix
como antes.

Corrige também um bug em get_affiliations: contribs sem afiliação
vinculada (comum no caso de CollectiveName, cujo único xref costuma
ser para author-notes) não tinham a chave "affs" no dict, causando
TypeError ao iterar author_reg.get("affs"). Agora usa
`or []` como fallback.

Refs scieloorg#1226, scieloorg#1236
Para autoria em grupo no padrão SPS 1.10:

  <contrib-group>
     <contrib contrib-type="author" id="collab">
       <collab>The SciELO Group</collab>
     </contrib>
  </contrib-group>
  <contrib-group content-type="collab-list">
      <contrib contrib-type="author" rid="collab">
        <name>...</name>
      </contrib>
      ...
  </contrib-group>

xml_pubmed_author_list agora exclui de AuthorList os contribs de
contrib-group[@Content-Type="collab-list"] (antes ficavam achatados
como Author comuns, duplicando a autoria do grupo). Uma nova função
xml_pubmed_group_list monta GroupList/Group/GroupName/IndividualName
a partir desses mesmos contribs, reaproveitando add_first_name,
add_last_name, add_suffix, add_affiliations e add_orcid (mesma forma
de dict usada em AuthorList, já expõe contrib-group-type via
article_contribs.TextContribs.main_contribs).

GroupName vem do <collab> do contrib-group irmão (sem
content-type). Segue a ordem exigida pela DTD do PubMed dentro de
Article: AuthorList?, GroupList?, PublicationType*.

Refs scieloorg#1226, scieloorg#1237
@Rossi-Luciano

Copy link
Copy Markdown
Collaborator Author

Validado localmente contra a DTD oficial do PubMed (https://dtd.nlm.nih.gov/ncbi/pubmed/in/PubMed.dtd, via lxml.etree.DTD), combinando esta branch com o #1243 (#1234, necessário porque a DTD exige a raiz ArticleSet):

(O validador linkado na issue-mãe #1226 não serve para este formato — ver comentário em #1226.)

A DTD do PubMed exige FirstName e LastName sempre juntos em Author
(nenhum dos dois é opcional isoladamente):
  Author (((FirstName, MiddleName?, LastName, Suffix?, Initials?) | CollectiveName), ...)

Encontrado ao validar a saída da CLI em lote (scieloorg#1241) contra a DTD real
usando tests/samples/example.xml: um contrib tem <given-names> mas não
tem <surname>, gerando <Author><FirstName>...</FirstName>...</Author>
sem <LastName> — inválido segundo a DTD (confirmado empiricamente:
Author só com FirstName ou só com LastName sempre falha a validação).

add_first_name e add_last_name agora caem para o outro campo quando o
esperado está ausente, duplicando o único nome disponível em ambos —
preserva a identificação do autor em vez de descartá-lo ou gerar XML
inválido.

Refs scieloorg#1226, scieloorg#1236
@Rossi-Luciano

Copy link
Copy Markdown
Collaborator Author

Atualizado com o merge do #1245 (#1236), que ganhou um fix adicional (duplicar FirstName/LastName quando <surname> ou <given-names> está ausente — achado durante a validação da #1241). Suíte: 52/52 passando.

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: corrigir Author vazio e implementar GroupList/Group/IndividualName para autoria em grupo

2 participants