-
Notifications
You must be signed in to change notification settings - Fork 23
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feat: build xml elements #720
base: master
Are you sure you want to change the base?
Conversation
This reverts commit 1d0129c.
journal_ids = journal_meta_elem.findall("journal-id") | ||
self.assertEqual(len(journal_ids), 2) | ||
self.assertEqual(journal_ids[0].get("journal-id-type"), "nlm-ta") | ||
self.assertEqual(journal_ids[0].text, "Braz J Med Biol Res") | ||
self.assertEqual(journal_ids[1].get("journal-id-type"), "publisher-id") | ||
self.assertEqual(journal_ids[1].text, "bjmbr") | ||
|
||
# Verifica o grupo de títulos <journal-title-group> | ||
journal_title_group = journal_meta_elem.find("journal-title-group") | ||
self.assertIsNotNone(journal_title_group) | ||
|
||
# Verifica se <journal-title> foi criado corretamente |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Rossi-Luciano o ideal é que cada método de teste tenha 1 assert. O motivo disto é que se houver failure, o teste vai parar no primeiro failure.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Rossi-Luciano adicione casos de usos mais diversos que seriam o que acontece na ausência de alguns valores ou chaves do dicionário, ou o que ocorre se o usuário fornece chaves diferentes das esperadas?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Rossi-Luciano ficou muito bom. Mas veja as melhorias nos testes, principalmente a questão de tratar a ausência de chaves esperadas e inesperadas no dicionário.
name_elem.append(surname_elem) # Adiciona <surname> ao <name> | ||
if "surname" in data: # Adiciona <surname> somente se estiver presente no dicionário | ||
surname_elem = ET.Element("surname") | ||
surname_elem.text = data.get("surname", "") # Mesmo se for vazio, cria o elemento |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
surname_elem.text = data.get("surname", "")
Este código não atribui ""
para {"surname": None}
In [1]: d = {"a": None}
In [2]: d.get("a", "")
In [3]: print(d.get("a", ""))
None
No lugar disso, use:
surname_elem.text = data["surname"] or ""
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Rossi-Luciano mas me parece, vendo os testes, que se você colocar apenas surname_elem.text = data["surname"]
é o suficiente
if rid is not None: | ||
xref_elem.set("rid", rid) | ||
if text is not None: | ||
xref_elem.text = text |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Rossi-Luciano combinamos que se o valor do atributo é None, o atributo aparece com valor de ""
. Neste trecho você está condicionando a inserção do atributo rid ao valor. Além disso, como rid é obrigarório, use o acesso direto à chave e não .get(key)
Por que não fez:
xref_elem = ET.Element("xref", attrib={"ref-type": "aff", "rid": rid or ""})
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ou melhor ainda:
# rid é obrigatório, a ausência da chave deveria levantar exceção
xref_elem = ET.Element("xref", attrib={"ref-type": "aff", "rid": xref_data["rid"]})
journal_title_elem = ET.Element("journal-title") | ||
journal_title_elem.text = data.get('journal_title', '') | ||
journal_title_group.append(journal_title_elem) # Adiciona <journal-title> ao <journal-title-group> | ||
journal_title_elem.text = data.get('journal_title', '') or '' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Rossi-Luciano use: journal_title_elem.text = data.get('journal_title') or ''
Isso resolve tanto a ausência de chave quanto de valor da chave. Faça uma busca por ', '') or ''
e corrija
"""Método auxiliar para construção e comparação do XML gerado""" | ||
journal_meta_elem = build_journal_meta(self.empty_data) | ||
generated_xml_str = ET.tostring(journal_meta_elem, encoding="unicode", method="xml") | ||
self.assertEqual(generated_xml_str.strip(), expected_xml_str.strip()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Rossi-Luciano uma dúvida minha: se der falha, você conseguirá facilmente identificar onde, sendo que este método é chamado em todos os métodos de teste?
# Cria e adiciona o <name> com <surname> e <given-names> | ||
name_elem = ET.Element("name") | ||
# Cria e adiciona o <name> com <surname> e <given-names> somente se existirem no dicionário | ||
if "surname" in data or "given_names" in data: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Rossi-Luciano adicione prefix e suffix. Consulte a documentação para conferir se já exigência de ordem
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Rossi-Luciano considerar também o contrib com collab
journal_title_elem = ET.Element("journal-title") | ||
journal_title_elem.text = data.get('journal_title', '') or '' | ||
journal_title_group.append(journal_title_elem) | ||
if 'journal_title' in data: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Rossi-Luciano aqui vc já testou que a chave existe, então na linha 44, use data['journal_title']
|
||
# Cria e adiciona o <name> com <surname> e <given-names> somente se existirem no dicionário | ||
if "surname" in data or "given_names" in data: | ||
if any(key in data for key in ("surname", "given_names", "prefix", "suffix")): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Rossi-Luciano
Pode usar o seguinte:
if any(data.get(key) for key in ("surname", "given_names", "prefix", "suffix")):
O que esse PR faz?
Este PR introduz três funções que geram estruturas XML usando a biblioteca
xml.etree.ElementTree
. Ele visa resolver a necessidade de criação dinâmica de elementos XML, tais como<article>
,<contrib>,
e<journal-meta>
, com base em dados de entrada.Onde a revisão poderia começar?
A revisão pode começar pelos arquivos que contêm as seguintes funções:
build_article_node()
no arquivoarticle.py
build_contrib_author()
no arquivocontrib.py
build_journal_meta()
no arquivojournal_meta.py
Como este poderia ser testado manualmente?
Crie um script Python para importar as funções dos arquivos relevantes.
Forneça dados de entrada similares aos exemplos abaixo e execute as funções para gerar o XML.
Exemplo de dados para
build_article_node
:Exemplo de dados para
build_contrib_author
:Exemplo de dados para
build_journal_meta
:Algum cenário de contexto que queira dar?
NA
Screenshots
NA
Quais são tickets relevantes?
NA
Referências
NA