Commit e702cb2
authored
Corrige/Melhora PidProviderXML devido a um bug e uma melhoria packtools 4.16.11 (#1469)
* Corrigir extração de dados do XML para tolerar mudanças de versão do packtools
Adiciona fix_get_article_data() e fix_get_data_to_compare() como camadas de compatibilidade em torno de xml_with_pre.get_article_data() e xml_adapter.get_data_to_compare(), já que o formato retornado por esses métodos mudou entre versões do packtools (partial_body -> body_fragment; z_partial_body -> body_fragment_fingerprint).
fix_get_article_data() remove a chave legada 'partial_body' do dict retornado.
fix_get_data_to_compare() força a chave 'z_partial_body' a vir de xml_with_pre.body_fragment_fingerprint, independente do que get_data_to_compare() retornar.
Em QueryBuilderPidProviderXML:
- z_partial_body agora é lido diretamente de xml_adapter.xml_with_pre.z_partial_body (hash legado), não mais de xml_adapter.data.
- z_body (body_fingerprint, hash do corpo inteiro) deixou de ser usado — removido de __init__ e de partial_body_query.
- partial_body_query agora combina apenas z_partial_body (legado) e z_body_fragment (body_fragment_fingerprint), como set, caindo em isnull=True quando nenhum dos dois existe.
- validate_input_data passa a checar a chave 'body_fragment' (novo nome) em vez de 'partial_body'.
* Usar as funções de compatibilidade do packtools em PidProviderXML
Substitui as chamadas diretas a xml_with_pre.get_article_data() e xml_adapter.get_data_to_compare() por fix_get_article_data() e fix_get_data_to_compare(), garantindo que os dados usados em readable_data, no diff de conflito de pid v3 e nas comparações de registro fiquem normalizados entre versões do packtools.
Também corrige get_registered_versions() para usar body_fragment_fingerprint (novo fingerprint) em vez do atributo antigo z_partial_body diretamente no dict de readable_data.
* Realinhar testes de QueryBuilderPidProviderXML com o comportamento real do código
O arquivo de testes anterior descrevia um refactor que não estava implementado no código-fonte atual, fazendo 13 de 55 testes falharem. Principais ajustes:
- make_xml_adapter() passa a configurar z_partial_body diretamente em xml_with_pre (não mais em adapter.data), e usa 'body_fragment' como chave do dict de get_article_data(), incluindo uma chave 'partial_body' só para exercitar o pop feito por fix_get_article_data().
- Remove body_fingerprint (corpo inteiro) das comparações de partial_body_query e article_data_query, já que esse fingerprint não é mais usado.
- Adiciona testes cobrindo validate_input_data com a chave 'body_fragment' e o caso de branco.
- Ajusta CompareTests para refletir que compare() usa input_data.get(label) e não pula labels ausentes, incluindo o caso de ZeroDivisionError quando registered_items é vazio.
* Ajustar asserção de select_record para o novo formato de dados de comparação
get_best_match() agora recebe um dict de comparação que inclui a chave 'z_partial_body' (adicionada por fix_get_data_to_compare), então a asserção passa a usar ANY para esse valor em vez de comparar apenas por {'title': 'Foo'}.
* Documentar funções e atributos de query_params.py
Adiciona docstrings que faltavam (compare, compare_lists, compare_items, get_score, zero_to_none, fix_get_article_data) e corrige documentação desatualizada:
- __init__ de QueryBuilderPidProviderXML: o comentário ainda descrevia um atributo z_body/body_fingerprint (fingerprint do corpo INTEIRO do artigo) que não é mais atribuído no código atual; substituído por uma docstring listando os atributos realmente definidos (z_body_fragment, z_partial_body, adapter_data, xml_with_pre_data).
- partial_body_query: corrige a referência de onde vem o hash legado, que dizia vir de xml_adapter.z_partial_body mas na verdade é lido de xml_adapter.xml_with_pre.z_partial_body (via self.z_partial_body).
- validate_input_data, pkg_name_list, article_data_query e get_article_data_query passam a ter docstrings explicando o comportamento.
- Remove comentários de linha redundantes em pkg_name_list e identifier_queries que só repetiam o que o código já deixa claro, agora que a lógica está descrita na docstring do método.
* Corrige o acesso a z_partial_body
* Ajusta comparação de dados para maior precisão no pareamento de XML
- Renomeia a chave 'z_partial_body' para 'body_fragment_fingerprint' em fix_get_data_to_compare, alinhando o nome ao valor efetivamente comparado.
- fix_get_article_data passa a priorizar xml_with_pre.readable_data quando disponível, caindo para get_article_data(max_length=300) como fallback.
- compare_items passa a incluir 'input_data' na resposta quando o score não é 1, permitindo rastrear o valor comparado em caso de divergência.
* Aprimora rastreabilidade e robustez do processo de pareamento de PidProviderXML
- Substitui os campos 'created'/'updated'/'record_status' fixos por uma property record_status, que calcula o estado do registro ('created' ou 'updated') com base na diferença de tempo entre criação e atualização.
- Adiciona 'ppx_id' ao dicionário de dados retornado.
- get_readable_data remove 'partial_body' do dado armazenado antes de retorná-lo.
- data_to_compare passa a incluir article_titles e body_fragment apenas quando presentes, e usa body_fragment_fingerprint no lugar de z_partial_body.
- get_best_match passa a usar um limiar de aceitação dinâmico (min_rate), reduzido para 0.49 quando há poucos dados disponíveis para comparação, e retorna também a resposta detalhada de cada comparação junto ao dado do candidato.
- Evita processar atualização quando o registro correspondente não possui readable_data.
- is_equal_to é considerado falso quando o registro não possui readable_data, evitando falso positivo de igualdade.
- Melhora a mensagem de erro de PidProviderXMLPidV3ConflictError, tornando-a mais informativa sobre o resultado do pareamento.
* Adiciona testes de configuração do Pid Provider
Cobre PidProviderSetting (ex.: record_all_registration_events e
demais opções configuráveis via Wagtail Admin). Mensagem gerada a
partir do nome do arquivo — ajustar detalhes de implementação após
revisão do conteúdo.
* Adiciona testes de XMLVersion
Cobre o modelo XMLVersion (versionamento de XML associado a
PidProviderXML). Mensagem gerada a partir do nome do arquivo —
ajustar detalhes de implementação após revisão do conteúdo.
* Adiciona testes de URL de XML no Pid Provider
Cobre geração/resolução de URLs associadas ao XML registrado.
Mensagem gerada a partir do nome do arquivo — ajustar detalhes de
implementação após revisão do conteúdo.
* Adiciona testes de PIDs alternativos (other_pid)
Cobre o relacionamento OtherPid/InlinePanel 'Other PID' em
PidProviderXML. Mensagem gerada a partir do nome do arquivo — ajustar
detalhes de implementação após revisão do conteúdo.
* Adiciona testes de correção do pid v2
Cobre lógica de fix/normalização do PID v2 (ex.: CollectionPidV2 ou
rotina de correção equivalente). Mensagem gerada a partir do nome do
arquivo — ajustar detalhes de implementação após revisão do
conteúdo.
* Adiciona testes de funções auxiliares do PidProviderXML
Cobre funções utilitárias usadas por PidProviderXML (possivelmente
os wrappers fix_get_article_data/fix_get_data_to_compare ou
equivalentes). Mensagem gerada a partir do nome do arquivo — ajustar
detalhes de implementação após revisão do conteúdo.
* Adiciona testes de manutenção de registros PidProviderXML
Cobre rotinas de manutenção/limpeza sobre registros existentes de
PidProviderXML. Mensagem gerada a partir do nome do arquivo — ajustar
detalhes de implementação após revisão do conteúdo.
* Adiciona testes de auditoria de registro (PidProviderXMLRegistration)
Cobre o modelo PidProviderXMLRegistration e a lógica de quando
gravar eventos de auditoria (erro, ambiguidade ou
record_all_registration_events). Mensagem gerada a partir do nome do
arquivo — ajustar detalhes de implementação após revisão do
conteúdo.
* Atualiza testes de query_params para tratamento de labels ausentes e z_partial_body
Ajusta make_xml_adapter() para configurar explicitamente
adapter.z_partial_body (agora lido como atributo direto pelo
QueryBuilderPidProviderXML, não mais via xml_adapter.data.get()),
evitando MagicMock não configurado no teste.
CompareItemsTests: passa a esperar também a chave 'input_data' no
retorno de compare_items() quando o score é != 1, além de
'registered'.
CompareTests, reescrito para refletir que compare() NÃO pula mais
labels ausentes em input_data (usa .get(label), tratando ausência
como None):
- test_missing_input_key_is_treated_as_none_not_skipped (renomeado de
...is_skipped_not_treated_as_none): label ausente com valor
registrado falsy agora ENTRA em items com score 1, em vez de ser
descartado.
- test_missing_input_key_with_truthy_registered_value_lowers_score
(novo): label ausente com valor registrado truthy cai no ramo
how_similar (score < 1).
- test_empty_registered_items_raises_zero_division_error (renomeado
de test_all_labels_missing_raises_zero_division_error): único
cenário que ainda levanta ZeroDivisionError é registered_items
vazio, não mais 'todos os labels ausentes em input_data'.
* Atualiza testes de get_best_match para novo formato de item com data/response
get_best_match() passou a envolver cada candidato em
{'data': ..., 'response': ...} nas listas 'matched'/'unmatched', em
vez do dict .data cru. Ajusta as asserções de
result['unmatched'][0]['id'] e result['matched'][N]['id'] para
result[...][N]['data']['id'] nos quatro testes afetados.
* Atualiza testes de select_record para uso de fix_get_data_to_compare
select_record() não usa mais xml_adapter.get_data_to_compare() puro:
passa a chamar fix_get_data_to_compare(xml_adapter), que acrescenta a
chave 'body_fragment_fingerprint' (lida de
xml_adapter.xml_with_pre.body_fragment_fingerprint) ao dict retornado
por get_data_to_compare().
_make_xml_adapter() passa a aceitar body_fragment_fingerprint e
configurá-lo no mock, para não ficar um MagicMock não configurado.
test_select_record_passes_candidates_and_comparison_data_to_get_best_match
atualizado para esperar que get_best_match seja chamado com o dict
já acrescido de 'body_fragment_fingerprint', não mais o retorno cru
de get_data_to_compare().
* Atualiza testes de register() para a migração readable_data
Alinha os testes à mudança de register(), que agora faz
input_data.update(xml_with_pre.readable_data) em vez de usar
get_article_data(). O helper make_xml_with_pre() passa a
configurar readable_data como um dict de verdade (com surnames,
collab, links, article_titles, body_fragment) e
body_fragment_fingerprint, já que um MagicMock não configurado
quebra dict.update() com TypeError — erro que era silenciosamente
capturado pelo except Exception de register() e mascarado como
event_status='error'.
Adiciona patch de PidProviderSetting.load no setUp da classe base
(RegisterTestBase), desativado por padrão, para desacoplar os
testes da configuração persistida e permitir reuso em
RecordAllEventsSettingTest sem duplicar o patch.
Adiciona RegisterResponseSchemaTest como teste de contrato: valida
apenas as chaves presentes em cada nível do response de register()
(sucesso limpo, erro, conflito, skipped), incluindo verificação
explícita de que as chaves de readable_data substituem as antigas
(ex.: ausência de 'partial_body'). Funciona como sentinela contra
mudanças silenciosas de schema que testes anteriores, focados
apenas em event_status/v3, não detectavam.
* Corrige estrutura dos dados legíveis no dict de registro do PID
Remove a chave 'finger_print' solta em record_data() e passa a
aninhar o retorno de get_readable_data() sob a chave
'registered_data', em vez de mesclá-lo (update) diretamente no
nível superior do dict. Isso evita colisão de chaves entre os
dados legíveis e os demais campos do registro.
* Adiciona pid_provider/tests/test_models.py1 parent 7270626 commit e702cb2
15 files changed
Lines changed: 2332 additions & 157 deletions
File tree
- pid_provider
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
| 40 | + | |
| 41 | + | |
40 | 42 | | |
41 | 43 | | |
42 | 44 | | |
| |||
615 | 617 | | |
616 | 618 | | |
617 | 619 | | |
618 | | - | |
619 | | - | |
620 | | - | |
621 | | - | |
622 | 620 | | |
| 621 | + | |
623 | 622 | | |
624 | | - | |
| 623 | + | |
| 624 | + | |
625 | 625 | | |
626 | 626 | | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
627 | 647 | | |
628 | 648 | | |
629 | 649 | | |
| |||
657 | 677 | | |
658 | 678 | | |
659 | 679 | | |
660 | | - | |
661 | | - | |
| 680 | + | |
| 681 | + | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
662 | 687 | | |
663 | | - | |
| 688 | + | |
664 | 689 | | |
665 | 690 | | |
666 | 691 | | |
667 | 692 | | |
| 693 | + | |
668 | 694 | | |
669 | | - | |
670 | | - | |
671 | | - | |
672 | | - | |
| 695 | + | |
| 696 | + | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + | |
| 702 | + | |
673 | 703 | | |
674 | 704 | | |
675 | 705 | | |
676 | | - | |
677 | | - | |
678 | | - | |
| 706 | + | |
| 707 | + | |
| 708 | + | |
679 | 709 | | |
680 | 710 | | |
681 | 711 | | |
| |||
758 | 788 | | |
759 | 789 | | |
760 | 790 | | |
761 | | - | |
| 791 | + | |
762 | 792 | | |
763 | 793 | | |
764 | 794 | | |
| |||
997 | 1027 | | |
998 | 1028 | | |
999 | 1029 | | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
1000 | 1033 | | |
1001 | 1034 | | |
1002 | 1035 | | |
| |||
1074 | 1107 | | |
1075 | 1108 | | |
1076 | 1109 | | |
1077 | | - | |
| 1110 | + | |
1078 | 1111 | | |
1079 | 1112 | | |
1080 | 1113 | | |
1081 | 1114 | | |
1082 | | - | |
| 1115 | + | |
1083 | 1116 | | |
1084 | 1117 | | |
1085 | 1118 | | |
| |||
1117 | 1150 | | |
1118 | 1151 | | |
1119 | 1152 | | |
1120 | | - | |
| 1153 | + | |
1121 | 1154 | | |
| 1155 | + | |
1122 | 1156 | | |
1123 | 1157 | | |
1124 | | - | |
1125 | | - | |
1126 | 1158 | | |
1127 | | - | |
| 1159 | + | |
| 1160 | + | |
| 1161 | + | |
1128 | 1162 | | |
1129 | 1163 | | |
1130 | 1164 | | |
| |||
1150 | 1184 | | |
1151 | 1185 | | |
1152 | 1186 | | |
1153 | | - | |
| 1187 | + | |
1154 | 1188 | | |
1155 | 1189 | | |
1156 | | - | |
| 1190 | + | |
1157 | 1191 | | |
1158 | 1192 | | |
1159 | 1193 | | |
| |||
1166 | 1200 | | |
1167 | 1201 | | |
1168 | 1202 | | |
| 1203 | + | |
| 1204 | + | |
| 1205 | + | |
| 1206 | + | |
1169 | 1207 | | |
1170 | 1208 | | |
1171 | 1209 | | |
1172 | 1210 | | |
| 1211 | + | |
1173 | 1212 | | |
1174 | 1213 | | |
1175 | 1214 | | |
1176 | 1215 | | |
1177 | 1216 | | |
1178 | 1217 | | |
1179 | | - | |
1180 | | - | |
| 1218 | + | |
| 1219 | + | |
| 1220 | + | |
1181 | 1221 | | |
1182 | | - | |
| 1222 | + | |
1183 | 1223 | | |
1184 | 1224 | | |
1185 | 1225 | | |
| |||
1210 | 1250 | | |
1211 | 1251 | | |
1212 | 1252 | | |
1213 | | - | |
| 1253 | + | |
1214 | 1254 | | |
1215 | 1255 | | |
1216 | 1256 | | |
| |||
1382 | 1422 | | |
1383 | 1423 | | |
1384 | 1424 | | |
| 1425 | + | |
| 1426 | + | |
1385 | 1427 | | |
1386 | 1428 | | |
1387 | 1429 | | |
| |||
0 commit comments