Objetivo
Implementar validações para o elemento <issue> conforme a especificação SPS 1.10, aumentando a conformidade de X% para 70% (7 de 10 regras).
Nota: Algumas validações para <issue> podem já estar parcialmente implementadas no repositório. Este Issue visa reavaliar, complementar e garantir cobertura completa das regras SPS 1.10.
Contexto
O elemento <issue> identifica o número de uma publicação periódica, incluindo suplementos e números especiais. Validações corretas garantem que o formato seja consistente e padronizado conforme especificações SPS, sem pontuação, sem uppercase, sem zeros à esquerda, e usando nomenclaturas corretas para suplementos (suppl) e números especiais (spe).
Conformidade atual: X de 10 regras implementadas (X%)
Meta após implementação: 7 de 10 regras (70%)
Documentação SPS
Referência oficial: https://docs.google.com/document/d/1GTv4Inc2LS_AXY-ToHT3HmO66UT0VAHWJNOIqzBNSgA/edit?tab=t.0#heading=h.issue
Regras principais conforme SPS 1.10:
-
Ocorrência:
<issue> deve aparecer no máximo uma vez em <article-meta>
-
Formatos válidos:
- Número simples:
4
- Suplemento de número:
4 suppl 1
- Suplemento de volume:
suppl 1
- Número especial:
spe1
-
Restrições de formato:
- Sem pontuação: não usar
., ,, -, /, etc.
- Sem uppercase: usar apenas minúsculas
- Sem zero à esquerda: usar
4 ao invés de 04
- Espaçamento específico: um espaço entre número e
suppl (ex: 4 suppl 1)
-
Nomenclatura obrigatória:
- Para suplemento: usar
suppl (não supl, s, supplement)
- Para número especial: usar
spe (não esp, nesp, nspe, especial)
-
Elemento proibido:
- Não usar
<supplement> em <article-meta> (suplementos devem ser identificados em <issue>)
Regras a Implementar
P0 – Críticas (implementar obrigatoriamente)
| # |
Regra |
Nível |
Descrição |
| 1 |
Validar unicidade de <issue> |
ERROR |
O elemento <issue> deve aparecer no máximo uma vez em <article-meta> |
| 2 |
Validar ausência de pontuação |
ERROR |
O valor de <issue> não deve conter pontuação (., ,, -, /, :, ;, etc.) |
| 3 |
Validar ausência de uppercase |
ERROR |
O valor de <issue> deve estar em minúsculas (sem letras maiúsculas) |
| 4 |
Validar nomenclatura de suplemento |
ERROR |
Suplementos devem usar suppl (não supl, s, supplement, sup) |
| 5 |
Validar nomenclatura de número especial |
ERROR |
Números especiais devem usar spe (não esp, nesp, nspe, especial, noesp) |
| 6 |
Validar ausência de <supplement> em <article-meta> |
CRITICAL |
O elemento <supplement> não é permitido em <article-meta> (usar <issue> para suplementos) |
P1 – Importantes (implementar se possível)
| # |
Regra |
Nível |
Descrição |
| 7 |
Validar ausência de zero à esquerda |
WARNING |
Números não devem ter zero à esquerda (usar 4 ao invés de 04) |
P2 – Futuras (fora do escopo deste Issue)
| # |
Regra |
Motivo de exclusão |
| 8 |
Validar espaçamento correto (4 suppl 1 vs 4suppl1) |
Baixa prioridade - formato já coberto por outras validações |
| 9 |
Validar consistência com nome de arquivo |
Alta complexidade - requer validação cruzada com sistema de arquivos |
| 10 |
Validar que partes numéricas são válidas |
Baixa prioridade - formato livre permite variações |
Arquivos a Criar/Modificar
Avaliar existentes (podem ter validações parciais):
packtools/sps/models/article_meta.py ou similar – Verificar se modelo existe
packtools/sps/validation/article_meta.py ou issue.py – Verificar validações existentes
packtools/sps/validation/rules/issue_rules.json ou similar – Verificar configuração
Criar (se não existirem):
packtools/sps/models/issue.py – Modelo de extração de dados
packtools/sps/validation/issue.py – Validações
packtools/sps/validation/rules/issue_rules.json – Configuração de níveis de erro
tests/sps/validation/test_issue.py – Testes unitários
Referenciar (implementações similares):
packtools/sps/validation/article_doi.py – Validação de unicidade
packtools/sps/validation/utils.py – Funções auxiliares (build_response)
Exemplos de XML
XML Válido (deve passar sem erros):
<!-- Exemplo 1: Número simples -->
<article-meta>
<volume>10</volume>
<issue>4</issue>
</article-meta>
<!-- Exemplo 2: Apenas número sem volume -->
<article-meta>
<issue>4</issue>
</article-meta>
<!-- Exemplo 3: Suplemento de número -->
<article-meta>
<volume>10</volume>
<issue>4 suppl 2</issue>
</article-meta>
<!-- Exemplo 4: Suplemento de volume -->
<article-meta>
<volume>10</volume>
<issue>suppl 2</issue>
</article-meta>
<!-- Exemplo 5: Número especial -->
<article-meta>
<volume>10</volume>
<issue>spe1</issue>
</article-meta>
<!-- Exemplo 6: Números com múltiplos dígitos -->
<article-meta>
<volume>15</volume>
<issue>123</issue>
</article-meta>
<!-- Exemplo 7: Suplemento com número de dois dígitos -->
<article-meta>
<volume>5</volume>
<issue>2 suppl 12</issue>
</article-meta>
<!-- Exemplo 8: Número especial com múltiplos dígitos -->
<article-meta>
<volume>8</volume>
<issue>spe15</issue>
</article-meta>
XML Inválido – Caso 1: Múltiplos (ERROR)
<article-meta>
<volume>10</volume>
<issue>4</issue>
<issue>5</issue>
</article-meta>
Erro esperado: Elemento <issue> deve aparecer no máximo uma vez em <article-meta>
XML Inválido – Caso 2: Com pontuação (ponto) (ERROR)
<article-meta>
<volume>10</volume>
<issue>4.2</issue>
</article-meta>
Erro esperado: Valor de <issue> não deve conter pontuação. Remova . do valor.
XML Inválido – Caso 3: Com pontuação (hífen) (ERROR)
<article-meta>
<volume>10</volume>
<issue>4-5</issue>
</article-meta>
Erro esperado: Valor de <issue> não deve conter pontuação. Remova - do valor.
XML Inválido – Caso 4: Com pontuação (barra) (ERROR)
<article-meta>
<volume>10</volume>
<issue>4/5</issue>
</article-meta>
Erro esperado: Valor de <issue> não deve conter pontuação. Remova / do valor.
XML Inválido – Caso 5: Com uppercase (ERROR)
<article-meta>
<volume>10</volume>
<issue>4 Suppl 1</issue>
</article-meta>
Erro esperado: Valor de <issue> deve estar em minúsculas. Use suppl ao invés de Suppl.
XML Inválido – Caso 6: Nomenclatura incorreta de suplemento "supl" (ERROR)
<article-meta>
<volume>10</volume>
<issue>4 supl 1</issue>
</article-meta>
Erro esperado: Use suppl para suplementos. Valor encontrado: supl.
XML Inválido – Caso 7: Nomenclatura incorreta de suplemento "s" (ERROR)
<article-meta>
<volume>10</volume>
<issue>4 s 1</issue>
</article-meta>
Erro esperado: Use suppl para suplementos. Valor encontrado: s.
XML Inválido – Caso 8: Nomenclatura incorreta de suplemento "supplement" (ERROR)
<article-meta>
<volume>10</volume>
<issue>4 supplement 1</issue>
</article-meta>
Erro esperado: Use suppl para suplementos. Valor encontrado: supplement.
XML Inválido – Caso 9: Nomenclatura incorreta de número especial "esp" (ERROR)
<article-meta>
<volume>10</volume>
<issue>esp1</issue>
</article-meta>
Erro esperado: Use spe para números especiais. Valor encontrado: esp.
XML Inválido – Caso 10: Nomenclatura incorreta de número especial "nesp" (ERROR)
<article-meta>
<volume>10</volume>
<issue>nesp1</issue>
</article-meta>
Erro esperado: Use spe para números especiais. Valor encontrado: nesp.
XML Inválido – Caso 11: Nomenclatura incorreta de número especial "nspe" (ERROR)
<article-meta>
<volume>10</volume>
<issue>nspe1</issue>
</article-meta>
Erro esperado: Use spe para números especiais. Valor encontrado: nspe.
XML Inválido – Caso 12: Nomenclatura incorreta de número especial "especial" (ERROR)
<article-meta>
<volume>10</volume>
<issue>especial1</issue>
</article-meta>
Erro esperado: Use spe para números especiais. Valor encontrado: especial.
XML Inválido – Caso 13: Elemento presente (CRITICAL)
<article-meta>
<volume>10</volume>
<issue>4</issue>
<supplement>1</supplement>
</article-meta>
Erro esperado: Elemento <supplement> não é permitido em <article-meta>. Use <issue> para identificar suplementos (ex: <issue>4 suppl 1</issue>).
XML Inválido – Caso 14: Zero à esquerda (WARNING)
<article-meta>
<volume>10</volume>
<issue>04</issue>
</article-meta>
Erro esperado: Número não deve ter zero à esquerda. Use 4 ao invés de 04.
XML Inválido – Caso 15: Múltiplos zeros à esquerda (WARNING)
<article-meta>
<volume>10</volume>
<issue>004</issue>
</article-meta>
Erro esperado: Número não deve ter zeros à esquerda. Use 4 ao invés de 004.
XML Inválido – Caso 16: Zero à esquerda em suplemento (WARNING)
<article-meta>
<volume>10</volume>
<issue>4 suppl 01</issue>
</article-meta>
Erro esperado: Número do suplemento não deve ter zero à esquerda. Use 1 ao invés de 01.
XML Inválido – Caso 17: vazio (CRITICAL)
<article-meta>
<volume>10</volume>
<issue></issue>
</article-meta>
Erro esperado: Elemento <issue> não pode estar vazio
XML Inválido – Caso 18: apenas espaços (CRITICAL)
<article-meta>
<volume>10</volume>
<issue> </issue>
</article-meta>
Erro esperado: Elemento <issue> não pode conter apenas espaços
Padrão de Implementação
Diretrizes Gerais:
-
Seguir padrões existentes no repositório:
- Consultar implementações similares como
article_doi.py (validação de unicidade)
- Usar estrutura de classes já estabelecida no packtools
- IMPORTANTE: Verificar se já existem validações parciais para
<issue> e integrá-las ou complementá-las
-
Internacionalização (i18n):
- OBRIGATÓRIO: Todas as mensagens devem suportar internacionalização
- Usar
advice_text e advice_params em build_response()
- Consultar conversas anteriores sobre implementação de i18n no packtools
- Referência: validações em
article_contribs.py que já implementam i18n completo
-
Validações condicionais:
- Validações que dependem de contexto devem retornar
None quando não aplicável
- Exemplo: validação de zero à esquerda só se aplica se valor for numérico
- Usar
filter_results() nos testes para remover None
-
Uso de build_response():
- Sempre usar
parent=self.data (dict completo, nunca string)
- Campo
response deve conter: "OK", "WARNING", "ERROR", "CRITICAL"
- Sempre fornecer
advice_text e advice_params para i18n
-
Modelo de dados:
- Criar propriedade que retorna dicionário com dados de
<issue>
- Dict deve conter:
issue, has_supplement_element, parent, parent_id, parent_lang
-
Validação de pontuação:
- Lista de caracteres proibidos:
., ,, -, /, :, ;, !, ?, (, ), [, ], {, }, ', "
- Usar regex ou verificação de caracteres
-
Validação de uppercase:
- Verificar se há letras maiúsculas no valor
- Usar método
.islower() ou comparação de string com .lower()
-
Validação de nomenclatura:
- Detectar variantes incorretas usando regex ou
in operator
- Para suplementos: procurar por
supl, s , supplement, sup (com espaço)
- Para especiais: procurar por
esp, nesp, nspe, especial, noesp
-
Validação de zero à esquerda:
- Usar regex para detectar padrões como
^0\d+ ou \s0\d+
- Considerar que
0 sozinho é válido (não é zero à esquerda)
Testes Esperados
Casos de teste obrigatórios:
Unicidade:
Formato de número simples:
Suplementos:
Números especiais:
Pontuação:
Uppercase:
Elemento :
Casos de borda:
Total esperado: ~50 testes unitários
Estrutura de testes:
- Usar
filter_results() para remover None dos resultados
- Asserções devem usar campo
response (não is_valid)
- Testes devem ser autocontidos e descritivos
- Agrupar testes por categoria (unicidade, pontuação, uppercase, nomenclatura, etc.)
Critérios de Aceite
O PR será aceito quando:
Referências
Documentação SPS:
Padrões JATS:
Referências internas packtools:
- Internacionalização: Consultar conversas anteriores sobre implementação de i18n
- Implementações similares:
article_doi.py (unicidade)
- Funções auxiliares:
utils.py (build_response)
Labels Sugeridas
enhancement validation SPS-1.10 good-first-issue
Impacto Esperado
Antes:
- Conformidade SPS 1.10 para
<issue>: X% (verificar validações existentes)
- Formatos inconsistentes podem passar sem detecção
- Uso incorreto de nomenclatura (supl, esp, etc.) não detectado
- Presença de pontuação e uppercase não detectada
- Zeros à esquerda não detectados
- Uso indevido de
<supplement> não prevenido
Depois:
- Conformidade SPS 1.10 para
<issue>: 70% (7 de 10 regras)
- Validação ERROR de formato (pontuação, uppercase)
- Validação ERROR de nomenclatura correta (suppl, spe)
- Validação CRITICAL contra uso de
<supplement>
- Validação WARNING de zeros à esquerda
- ~50 testes unitários garantindo qualidade
- Internacionalização completa (PT/EN/ES)
Benefícios:
- Melhora a qualidade dos XMLs SciELO
- Garante consistência de formato entre documentos
- Previne erros de nomenclatura de suplementos e especiais
- Facilita processamento automatizado
- Reduz necessidade de correções manuais
- Melhora interoperabilidade com sistemas externos
- Facilita identificação correta de fascículos
- Promove conformidade com padrões SciELO
- Facilita manutenção e depuração de XMLs
Observações importantes:
- Implementar internacionalização ajustando as respostas das validações ao formato da função build_response em
packtools/sps/validation/utils.py;
- Verificar e adicionar as validações no orquestrador:
packtools/sps/validation/xml_validations.py e packtools/sps/validation/xml_validator.py
- Verificar a corretude dos testes exsitentes para a validação e complementar caso necessário;
- Realizar ajustes, caso necessário, nos modelos que são utilizados pelas validações, garantindo que o ajuste não interfira em possíveis usos atuais desses modelos.
Objetivo
Implementar validações para o elemento
<issue>conforme a especificação SPS 1.10, aumentando a conformidade de X% para 70% (7 de 10 regras).Nota: Algumas validações para
<issue>podem já estar parcialmente implementadas no repositório. Este Issue visa reavaliar, complementar e garantir cobertura completa das regras SPS 1.10.Contexto
O elemento
<issue>identifica o número de uma publicação periódica, incluindo suplementos e números especiais. Validações corretas garantem que o formato seja consistente e padronizado conforme especificações SPS, sem pontuação, sem uppercase, sem zeros à esquerda, e usando nomenclaturas corretas para suplementos (suppl) e números especiais (spe).Conformidade atual: X de 10 regras implementadas (X%)
Meta após implementação: 7 de 10 regras (70%)
Documentação SPS
Referência oficial: https://docs.google.com/document/d/1GTv4Inc2LS_AXY-ToHT3HmO66UT0VAHWJNOIqzBNSgA/edit?tab=t.0#heading=h.issue
Regras principais conforme SPS 1.10:
Ocorrência:
<issue>deve aparecer no máximo uma vez em<article-meta>Formatos válidos:
44 suppl 1suppl 1spe1Restrições de formato:
.,,,-,/, etc.4ao invés de04suppl(ex:4 suppl 1)Nomenclatura obrigatória:
suppl(nãosupl,s,supplement)spe(nãoesp,nesp,nspe,especial)Elemento proibido:
<supplement>em<article-meta>(suplementos devem ser identificados em<issue>)Regras a Implementar
P0 – Críticas (implementar obrigatoriamente)
<issue><issue>deve aparecer no máximo uma vez em<article-meta><issue>não deve conter pontuação (.,,,-,/,:,;, etc.)<issue>deve estar em minúsculas (sem letras maiúsculas)suppl(nãosupl,s,supplement,sup)spe(nãoesp,nesp,nspe,especial,noesp)<supplement>em<article-meta><supplement>não é permitido em<article-meta>(usar<issue>para suplementos)P1 – Importantes (implementar se possível)
4ao invés de04)P2 – Futuras (fora do escopo deste Issue)
4 suppl 1vs4suppl1)Arquivos a Criar/Modificar
Avaliar existentes (podem ter validações parciais):
packtools/sps/models/article_meta.pyou similar – Verificar se modelo existepacktools/sps/validation/article_meta.pyouissue.py– Verificar validações existentespacktools/sps/validation/rules/issue_rules.jsonou similar – Verificar configuraçãoCriar (se não existirem):
packtools/sps/models/issue.py– Modelo de extração de dadospacktools/sps/validation/issue.py– Validaçõespacktools/sps/validation/rules/issue_rules.json– Configuração de níveis de errotests/sps/validation/test_issue.py– Testes unitáriosReferenciar (implementações similares):
packtools/sps/validation/article_doi.py– Validação de unicidadepacktools/sps/validation/utils.py– Funções auxiliares (build_response)Exemplos de XML
XML Válido (deve passar sem erros):
XML Inválido – Caso 1: Múltiplos (ERROR)
Erro esperado: Elemento
<issue>deve aparecer no máximo uma vez em<article-meta>XML Inválido – Caso 2: Com pontuação (ponto) (ERROR)
Erro esperado: Valor de
<issue>não deve conter pontuação. Remova.do valor.XML Inválido – Caso 3: Com pontuação (hífen) (ERROR)
Erro esperado: Valor de
<issue>não deve conter pontuação. Remova-do valor.XML Inválido – Caso 4: Com pontuação (barra) (ERROR)
Erro esperado: Valor de
<issue>não deve conter pontuação. Remova/do valor.XML Inválido – Caso 5: Com uppercase (ERROR)
Erro esperado: Valor de
<issue>deve estar em minúsculas. Usesupplao invés deSuppl.XML Inválido – Caso 6: Nomenclatura incorreta de suplemento "supl" (ERROR)
Erro esperado: Use
supplpara suplementos. Valor encontrado:supl.XML Inválido – Caso 7: Nomenclatura incorreta de suplemento "s" (ERROR)
Erro esperado: Use
supplpara suplementos. Valor encontrado:s.XML Inválido – Caso 8: Nomenclatura incorreta de suplemento "supplement" (ERROR)
Erro esperado: Use
supplpara suplementos. Valor encontrado:supplement.XML Inválido – Caso 9: Nomenclatura incorreta de número especial "esp" (ERROR)
Erro esperado: Use
spepara números especiais. Valor encontrado:esp.XML Inválido – Caso 10: Nomenclatura incorreta de número especial "nesp" (ERROR)
Erro esperado: Use
spepara números especiais. Valor encontrado:nesp.XML Inválido – Caso 11: Nomenclatura incorreta de número especial "nspe" (ERROR)
Erro esperado: Use
spepara números especiais. Valor encontrado:nspe.XML Inválido – Caso 12: Nomenclatura incorreta de número especial "especial" (ERROR)
Erro esperado: Use
spepara números especiais. Valor encontrado:especial.XML Inválido – Caso 13: Elemento presente (CRITICAL)
Erro esperado: Elemento
<supplement>não é permitido em<article-meta>. Use<issue>para identificar suplementos (ex:<issue>4 suppl 1</issue>).XML Inválido – Caso 14: Zero à esquerda (WARNING)
Erro esperado: Número não deve ter zero à esquerda. Use
4ao invés de04.XML Inválido – Caso 15: Múltiplos zeros à esquerda (WARNING)
Erro esperado: Número não deve ter zeros à esquerda. Use
4ao invés de004.XML Inválido – Caso 16: Zero à esquerda em suplemento (WARNING)
Erro esperado: Número do suplemento não deve ter zero à esquerda. Use
1ao invés de01.XML Inválido – Caso 17: vazio (CRITICAL)
Erro esperado: Elemento
<issue>não pode estar vazioXML Inválido – Caso 18: apenas espaços (CRITICAL)
Erro esperado: Elemento
<issue>não pode conter apenas espaçosPadrão de Implementação
Diretrizes Gerais:
Seguir padrões existentes no repositório:
article_doi.py(validação de unicidade)<issue>e integrá-las ou complementá-lasInternacionalização (i18n):
advice_texteadvice_paramsembuild_response()article_contribs.pyque já implementam i18n completoValidações condicionais:
Nonequando não aplicávelfilter_results()nos testes para removerNoneUso de
build_response():parent=self.data(dict completo, nunca string)responsedeve conter:"OK","WARNING","ERROR","CRITICAL"advice_texteadvice_paramspara i18nModelo de dados:
<issue>issue,has_supplement_element,parent,parent_id,parent_langValidação de pontuação:
.,,,-,/,:,;,!,?,(,),[,],{,},',"Validação de uppercase:
.islower()ou comparação de string com.lower()Validação de nomenclatura:
inoperatorsupl,s,supplement,sup(com espaço)esp,nesp,nspe,especial,noespValidação de zero à esquerda:
^0\d+ou\s0\d+0sozinho é válido (não é zero à esquerda)Testes Esperados
Casos de teste obrigatórios:
Unicidade:
<issue>em<article-meta>(OK)<issue>em<article-meta>(ERROR)<issue>em<article-meta>(OK - opcional)Formato de número simples:
4(OK)10(OK)123(OK)04(WARNING)004(WARNING)0(OK - não é zero à esquerda)Suplementos:
4 suppl 1(OK)suppl 1(OK)4 suppl 12(OK)4 supl 1(ERROR)4 s 1(ERROR)4 supplement 1(ERROR)4 sup 1(ERROR)4 Suppl 1(ERROR)4 SUPPL 1(ERROR)4 suppl 01(WARNING)Números especiais:
spe1(OK)spe12(OK)esp1(ERROR)nesp1(ERROR)nspe1(ERROR)especial1(ERROR)noesp1(ERROR)Spe1(ERROR)SPE1(ERROR)Pontuação:
4.2(ERROR)4,5(ERROR)4-5(ERROR)4/5(ERROR)4:2(ERROR)4;2(ERROR)4(2)(ERROR)[4](ERROR)Uppercase:
Elemento :
<supplement>em<article-meta>(OK)<supplement>em<article-meta>(CRITICAL)Casos de borda:
<issue>vazio (CRITICAL)<issue>apenas espaços (CRITICAL)4 suppl 1(permitir - não validar espaçamento)4 suppl 1 spe2(permitir - formato livre)Total esperado: ~50 testes unitários
Estrutura de testes:
filter_results()para removerNonedos resultadosresponse(nãois_valid)Critérios de Aceite
O PR será aceito quando:
<issue>foi analisado e integrado ou substituído adequadamenteissue_rules.jsoncriado com todos os níveis de errobuild_response,filter_results, validações condicionais)<supplement>funcionandoReferências
Documentação SPS:
<issue>: Número, Número Especial e SuplementoPadrões JATS:
<issue><volume>Referências internas packtools:
article_doi.py(unicidade)utils.py(build_response)Labels Sugeridas
enhancementvalidationSPS-1.10good-first-issueImpacto Esperado
Antes:
<issue>: X% (verificar validações existentes)<supplement>não prevenidoDepois:
<issue>: 70% (7 de 10 regras)<supplement>Benefícios:
Observações importantes:
packtools/sps/validation/utils.py;packtools/sps/validation/xml_validations.pyepacktools/sps/validation/xml_validator.py