Skip to content

Refatorar XMLWithPre.sps_pkg_name em packtools — separar lógica legada da nova lógica determinística de nomeação de pacotes #1269

Description

@robertatakenaka

Contexto

A classe XMLWithPre (packtools/sps/pid_provider/xml_sps_lib.py) concentra hoje, em um único bloco monolítico, toda a lógica de:

  • parsing de DOCTYPE;
  • manipulação de arquivos/zip/assets/renditions;
  • geração de nomes de pacote (sps_pkg_name) com regras legadas (baseadas em fpage/suppl/order/v2) que já apresentaram ambiguidades e "gambiarras" documentadas em comentários no código;
  • identificadores (v2/v3/aop_pid/order);
  • metadados do artigo (datas, autores, títulos, corpo).

Isso dificulta manutenção, testes isolados e a introdução de uma nova estratégia de nomeação de pacote mais determinística (baseada em prefixo SPS: ISSN-Acrônimo-Volume-Número-Suplemento + sufixo por estratégias ordenadas).

Problemas a resolver

  1. sps_pkg_name mistura responsabilidades e é difícil de testar isoladamente.
  2. Não há diferenciação clara entre nome fornecido (legado, vindo do XML/arquivo original), nome construído (nova regra determinística) e nome fallback (regra antiga/depreciada).
  3. Nomes de pacotes legados podem conter caracteres fora do padrão SPS (_, .) e precisam ser preservados sem sanitização forçada, sob risco de quebrar rastreabilidade de pacotes já publicados.
  4. Falta validação explícita de ausência de ISSN ao tentar construir o prefixo SPS.
  5. Falta um mapeamento estruturado (data, pkg_names_dict, sps_pkg_names_dict, input_files_dict) para consumo externo (ex.: scms-upload, core) sem expor toda a superfície da classe.

Proposta

  • Quebrar XMLWithPre em mixins coesos: DOCTYPEParserMixin, PackagingAndFilesMixin, LegacyPackageNamingMixin, PackageNamingMixin, IdentifiersMixin, ArticleMetadataMixin.
  • Renomear métodos/propriedades da regra antiga com prefixo legacy_/deprecated_, mantendo compatibilidade via deprecated_sps_pkg_name_list.
  • Introduzir provided_sps_pkg_name (nome legado, sem sanitização), built_sps_pkg_name (nova regra) e sps_pkg_name com precedência: providedbuiltdeprecated_sps_pkg_name_version_2.
  • Adicionar sps_pkg_name_origin para rastrear qual estratégia gerou o nome atual.
  • Adicionar XMLWithPreMissingISSNError e available_issns/sps_issn.
  • Adicionar sanitize_name/sanitize_sps_name como funções utilitárias puras.
  • Adicionar dicionários estruturados: data, input_files_dict, pkg_names_dict, sps_pkg_names_dict, e get_data() como composição opt-in.

Critérios de aceite

  • Todos os testes existentes de test_xml_sps_lib.py passam (com os nomes atualizados).
  • sps_pkg_name mantém compatibilidade retroativa via fallback deprecated_sps_pkg_name_version_2 quando não há provided/built.
  • Nomes de pacote legados com _/. não são alterados/sanitizados ao passar por provided_sps_pkg_name.
  • build_sps_pkg_name() levanta XMLWithPreMissingISSNError quando não há ISSN, e ValueError quando nenhuma estratégia de sufixo produz valor.
  • Cobertura de testes para os novos dicionários (pkg_names_dict, sps_pkg_names_dict, input_files_dict, get_data).

Metadata

Metadata

Labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions