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
sps_pkg_name mistura responsabilidades e é difícil de testar isoladamente.
- 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).
- 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.
- Falta validação explícita de ausência de ISSN ao tentar construir o prefixo SPS.
- 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: provided → built → deprecated_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
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:sps_pkg_name) com regras legadas (baseadas emfpage/suppl/order/v2) que já apresentaram ambiguidades e "gambiarras" documentadas em comentários no código;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
sps_pkg_namemistura responsabilidades e é difícil de testar isoladamente._,.) e precisam ser preservados sem sanitização forçada, sob risco de quebrar rastreabilidade de pacotes já publicados.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
XMLWithPreem mixins coesos:DOCTYPEParserMixin,PackagingAndFilesMixin,LegacyPackageNamingMixin,PackageNamingMixin,IdentifiersMixin,ArticleMetadataMixin.legacy_/deprecated_, mantendo compatibilidade viadeprecated_sps_pkg_name_list.provided_sps_pkg_name(nome legado, sem sanitização),built_sps_pkg_name(nova regra) esps_pkg_namecom precedência:provided→built→deprecated_sps_pkg_name_version_2.sps_pkg_name_originpara rastrear qual estratégia gerou o nome atual.XMLWithPreMissingISSNErroreavailable_issns/sps_issn.sanitize_name/sanitize_sps_namecomo funções utilitárias puras.data,input_files_dict,pkg_names_dict,sps_pkg_names_dict, eget_data()como composição opt-in.Critérios de aceite
test_xml_sps_lib.pypassam (com os nomes atualizados).sps_pkg_namemantém compatibilidade retroativa via fallbackdeprecated_sps_pkg_name_version_2quando não háprovided/built._/.não são alterados/sanitizados ao passar porprovided_sps_pkg_name.build_sps_pkg_name()levantaXMLWithPreMissingISSNErrorquando não há ISSN, eValueErrorquando nenhuma estratégia de sufixo produz valor.pkg_names_dict,sps_pkg_names_dict,input_files_dict,get_data).