-
Notifications
You must be signed in to change notification settings - Fork 24
Description
Objetivo
Implementar validações para o elemento <pub-date> conforme a especificação SPS 1.10, aumentando a conformidade de X% para 75% (9 de 12 regras).
Nota: Algumas validações para <pub-date> 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 <pub-date> representa as datas de publicação do documento e do número/volume ao qual pertence. São obrigatórias duas datas distintas: uma para o documento (@date-type="pub") e outra para a coleção (@date-type="collection"). Validações corretas garantem presença de datas obrigatórias, formatos adequados, e conformidade com regras específicas para cada tipo de data.
Conformidade atual: X de 12 regras implementadas (X%)
Meta após implementação: 9 de 12 regras (75%)
Documentação SPS
Referência oficial: https://docs.google.com/document/d/1GTv4Inc2LS_AXY-ToHT3HmO66UT0VAHWJNOIqzBNSgA/edit?tab=t.0#heading=h.pubdate
Regras principais conforme SPS 1.10:
-
Ocorrência:
<pub-date>deve aparecer uma ou mais vezes em<article-meta>
-
Datas obrigatórias:
<pub-date publication-format="electronic" date-type="pub">- Data de publicação do documento (obrigatório)<pub-date publication-format="electronic" date-type="collection">- Data do número/volume (obrigatório)
-
Atributos obrigatórios:
@date-type(valores:pub,collection)@publication-format="electronic"(obrigatório para ambas as datas)
-
Elementos obrigatórios para
date-type="pub":<day>(obrigatório)<month>(obrigatório)<year>(obrigatório)
-
Elementos para
date-type="collection":<year>(obrigatório)<month>ou<season>(opcional, depende da periodicidade)<day>não é permitido
-
Formato obrigatório:
<day>e<month>devem ter dois dígitos:01,02, ...,12
-
Periodicidade e elementos:
- Anual: apenas
<year> - Mensal:
<month>+<year> - Bimestral/Quadrimestral/etc:
<season>+<year>
- Anual: apenas
-
Observações:
- Datas
pubpodem usar00em day/month para preenchimento posterior - Datas
collectiondevem seguir a periodicidade do periódico
- Datas
Regras a Implementar
P0 – Críticas (implementar obrigatoriamente)
| # | Regra | Nível | Descrição |
|---|---|---|---|
| 1 | Validar presença de <pub-date date-type="pub"> |
CRITICAL | O elemento <pub-date> com @date-type="pub" é obrigatório |
| 2 | Validar presença de <pub-date date-type="collection"> |
CRITICAL | O elemento <pub-date> com @date-type="collection" é obrigatório |
| 3 | Validar presença de @publication-format="electronic" |
CRITICAL | O atributo @publication-format="electronic" é obrigatório em todas as <pub-date> |
| 4 | Validar elementos obrigatórios em pub |
CRITICAL | Para date-type="pub": <day>, <month> e <year> são obrigatórios |
| 5 | Validar presença de <year> em collection |
CRITICAL | Para date-type="collection": <year> é obrigatório |
| 6 | Validar ausência de <day> em collection |
ERROR | Para date-type="collection": <day> não é permitido |
| 7 | Validar formato de dois dígitos para <day> e <month> |
ERROR | Elementos <day> e <month> devem ter exatamente dois dígitos (01-31, 01-12) |
P1 – Importantes (implementar se possível)
| # | Regra | Nível | Descrição |
|---|---|---|---|
| 8 | Validar unicidade de tipos de data | ERROR | Deve haver exatamente um <pub-date> com date-type="pub" e um com date-type="collection" |
| 9 | Validar valores numéricos válidos | ERROR | Valores de <day> devem estar entre 01-31, <month> entre 01-12 |
P2 – Futuras (fora do escopo deste Issue)
| # | Regra | Motivo de exclusão |
|---|---|---|
| 10 | Validar data válida (dia/mês/ano formam data real) | Média complexidade - requer validação de calendário |
| 11 | Validar consistência de periodicidade com uso de month/season | Alta complexidade - requer conhecimento da periodicidade do periódico |
| 12 | Validar que data de pub é posterior ou igual a data de collection | Baixa prioridade - lógica de negócio complexa |
Arquivos a Criar/Modificar
Avaliar existentes (podem ter validações parciais):
packtools/sps/models/dates.pyoupub_date.py– Verificar se modelo existepacktools/sps/validation/dates.pyoupub_date.py– Verificar validações existentespacktools/sps/validation/rules/pub_date_rules.jsonou similar – Verificar configuração
Criar (se não existirem):
packtools/sps/models/pub_date.py– Modelo de extração de dadospacktools/sps/validation/pub_date.py– Validaçõespacktools/sps/validation/rules/pub_date_rules.json– Configuração de níveis de errotests/sps/validation/test_pub_date.py– Testes unitários
Referenciar (implementações similares):
packtools/sps/validation/history.py– Validação de datas similar (day/month/year)packtools/sps/validation/utils.py– Funções auxiliares (build_response)
Exemplos de XML
XML Válido (deve passar sem erros):
<!-- Exemplo 1: Periódico anual -->
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>
<!-- Exemplo 2: Periódico mensal -->
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<month>01</month>
<year>2025</year>
</pub-date>
</article-meta>
<!-- Exemplo 3: Periódico bimestral (com season) -->
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<season>Jan-Feb</season>
<year>2025</year>
</pub-date>
</article-meta>
<!-- Exemplo 4: Data com dia e mês com dois dígitos -->
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>15</day>
<month>03</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<month>03</month>
<year>2025</year>
</pub-date>
</article-meta>
<!-- Exemplo 5: Data pub com 00 (placeholder para preenchimento posterior) -->
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>00</day>
<month>00</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<month>03</month>
<year>2025</year>
</pub-date>
</article-meta>
<!-- Exemplo 6: Periódico trimestral -->
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<month>03</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<season>Jan-Mar</season>
<year>2025</year>
</pub-date>
</article-meta>XML Inválido – Caso 1: Sem pub-date type="pub" (CRITICAL)
<article-meta>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Elemento <pub-date> com @date-type="pub" é obrigatório
XML Inválido – Caso 2: Sem pub-date type="collection" (CRITICAL)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<month>01</month>
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Elemento <pub-date> com @date-type="collection" é obrigatório
XML Inválido – Caso 3: Sem @publication-format (CRITICAL)
<article-meta>
<pub-date date-type="pub">
<day>01</day>
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Atributo @publication-format é obrigatório em <pub-date>
XML Inválido – Caso 4: @publication-format com valor incorreto (CRITICAL)
<article-meta>
<pub-date publication-format="print" date-type="pub">
<day>01</day>
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Valor de @publication-format deve ser "electronic". Valor encontrado: "print"
XML Inválido – Caso 5: pub sem (CRITICAL)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Para @date-type="pub", elemento <day> é obrigatório
XML Inválido – Caso 6: pub sem (CRITICAL)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Para @date-type="pub", elemento <month> é obrigatório
XML Inválido – Caso 7: pub sem (CRITICAL)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<month>01</month>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Para @date-type="pub", elemento <year> é obrigatório
XML Inválido – Caso 8: collection sem (CRITICAL)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<month>03</month>
</pub-date>
</article-meta>Erro esperado: Para @date-type="collection", elemento <year> é obrigatório
XML Inválido – Caso 9: collection com (ERROR)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<day>01</day>
<month>03</month>
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Para @date-type="collection", elemento <day> não é permitido
XML Inválido – Caso 10: com um dígito (ERROR)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>1</day>
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Elemento <day> deve ter dois dígitos (use 01 ao invés de 1)
XML Inválido – Caso 11: com um dígito (ERROR)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<month>3</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Elemento <month> deve ter dois dígitos (use 03 ao invés de 3)
XML Inválido – Caso 12: Múltiplos pub-date type="pub" (ERROR)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="pub">
<day>15</day>
<month>02</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Deve haver exatamente um <pub-date> com @date-type="pub". Encontrados: 2
XML Inválido – Caso 13: Múltiplos pub-date type="collection" (ERROR)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Deve haver exatamente um <pub-date> com @date-type="collection". Encontrados: 2
XML Inválido – Caso 14: Mês inválido (13) (ERROR)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>01</day>
<month>13</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Valor de <month> inválido: 13 (deve estar entre 01 e 12)
XML Inválido – Caso 15: Dia inválido (32) (ERROR)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day>32</day>
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Valor de <day> inválido: 32 (deve estar entre 01 e 31)
XML Inválido – Caso 16: Elementos vazios (CRITICAL)
<article-meta>
<pub-date publication-format="electronic" date-type="pub">
<day></day>
<month></month>
<year></year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year></year>
</pub-date>
</article-meta>Erro esperado: Elementos de data não podem estar vazios
XML Inválido – Caso 17: Sem @date-type (CRITICAL)
<article-meta>
<pub-date publication-format="electronic">
<day>01</day>
<month>01</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
</article-meta>Erro esperado: Atributo @date-type é obrigatório em <pub-date>
Padrão de Implementação
Diretrizes Gerais:
-
Seguir padrões existentes no repositório:
- Consultar implementações similares como
history.py(validação de datas) - Usar estrutura de classes já estabelecida no packtools
- IMPORTANTE: Verificar se já existem validações parciais para
<pub-date>e integrá-las ou complementá-las
- Consultar implementações similares como
-
Internacionalização (i18n):
- OBRIGATÓRIO: Todas as mensagens devem suportar internacionalização
- Usar
advice_texteadvice_paramsembuild_response() - Consultar conversas anteriores sobre implementação de i18n no packtools
- Referência: validações em
article_contribs.pyque já implementam i18n completo
-
Validações condicionais:
- Validações que dependem de contexto devem retornar
Nonequando não aplicável - Exemplo: validação de elementos obrigatórios só se aplica para tipos específicos de data
- Exemplo: validação de
<day>proibido só para collection - Usar
filter_results()nos testes para removerNone
- Validações que dependem de contexto devem retornar
-
Uso de
build_response():- Sempre usar
parent=self.data(dict completo, nunca string) - Campo
responsedeve conter:"OK","WARNING","ERROR","CRITICAL" - Sempre fornecer
advice_texteadvice_paramspara i18n
- Sempre usar
-
Modelo de dados:
- Criar propriedade que retorna lista de dicionários (um para cada
<pub-date>) - Cada dict deve conter:
date_type,publication_format,day,month,year,season,parent,parent_id,parent_lang - Separar datas por tipo para facilitar validações
- Criar propriedade que retorna lista de dicionários (um para cada
-
Validação de presença:
- Verificar se existe pelo menos um
<pub-date date-type="pub"> - Verificar se existe pelo menos um
<pub-date date-type="collection"> - Contar ocorrências de cada tipo
- Verificar se existe pelo menos um
-
Validação de formato de dois dígitos:
- Verificar comprimento exato:
len(day) == 2elen(month) == 2 - Validar que consiste apenas de dígitos:
day.isdigit() - Aceitar
00como valor válido (placeholder)
- Verificar comprimento exato:
-
Validação de valores numéricos:
- Day: 00-31 (00 é válido, 01-31 são normais)
- Month: 00-12 (00 é válido, 01-12 são normais)
- Usar conversão para int após validar formato
-
Validação específica por tipo:
- Para
pub: verificar presença de day, month, year - Para
collection: verificar presença de year, ausência de day
- Para
Testes Esperados
Casos de teste obrigatórios:
Presença de datas obrigatórias:
- Com
pubecollection(OK) - Sem
pub(CRITICAL) - Sem
collection(CRITICAL) - Sem nenhuma
<pub-date>(CRITICAL)
Atributo @date-type:
-
<pub-date>com@date-type="pub"(OK) -
<pub-date>com@date-type="collection"(OK) -
<pub-date>sem@date-type(CRITICAL) -
@date-typevazio (CRITICAL) -
@date-typecom valor inválido (ERROR)
Atributo @publication-format:
-
@publication-format="electronic"(OK) - Sem
@publication-format(CRITICAL) -
@publication-formatvazio (CRITICAL) -
@publication-format="print"(CRITICAL - valor incorreto) -
@publication-format="online"(CRITICAL - valor incorreto)
Elementos obrigatórios para pub:
- pub com day, month, year (OK)
- pub sem day (CRITICAL)
- pub sem month (CRITICAL)
- pub sem year (CRITICAL)
Elementos para collection:
- collection com year (OK)
- collection com month + year (OK)
- collection com season + year (OK)
- collection sem year (CRITICAL)
- collection com day (ERROR - proibido)
Formato de dois dígitos:
- day com dois dígitos
01(OK) - day com dois dígitos
31(OK) - day com um dígito
1(ERROR) - day com três dígitos
001(ERROR) - month com dois dígitos
01(OK) - month com dois dígitos
12(OK) - month com um dígito
3(ERROR) - month com três dígitos
012(ERROR)
Valores numéricos válidos:
- day
01(OK) - day
31(OK) - day
00(OK - placeholder) - day
32(ERROR - inválido) - month
01(OK) - month
12(OK) - month
00(OK - placeholder) - month
13(ERROR - inválido)
Unicidade de tipos:
- Um pub e um collection (OK)
- Dois pub (ERROR)
- Dois collection (ERROR)
- Três ou mais do mesmo tipo (ERROR)
Periodicidades diferentes:
- Anual: collection com apenas year (OK)
- Mensal: collection com month + year (OK)
- Bimestral: collection com season + year (OK)
- Trimestral: collection com season + year (OK)
Casos de borda:
- Elementos vazios (CRITICAL)
- Elementos apenas com espaços (CRITICAL)
- Valores não numéricos em day/month (ERROR)
- Ano com 4 dígitos (OK)
- Ano com 2 dígitos (WARNING - formato não padrão)
- Season com formato livre (OK - texto livre)
Total esperado: ~60 testes unitários
Estrutura de testes:
- Usar
filter_results()para removerNonedos resultados - Asserções devem usar campo
response(nãois_valid) - Testes devem ser autocontidos e descritivos
- Agrupar testes por categoria (presença, atributos, elementos, formatos, unicidade)
Critérios de Aceite
O PR será aceito quando:
- Verificação de validações existentes: Código existente para
<pub-date>foi analisado e integrado ou substituído adequadamente - Todas as regras P0 implementadas (7 validações CRITICAL/ERROR)
- Todas as regras P1 implementadas (2 validações ERROR)
- Testes unitários passando com cobertura mínima de ~60 casos
- Nenhum teste existente quebrado
- Arquivo
pub_date_rules.jsoncriado com todos os níveis de erro - Internacionalização completa em todas as mensagens (i18n obrigatório)
- Código seguindo padrões do packtools (
build_response,filter_results, validações condicionais) - Modelo de dados criado com extração adequada de todos os elementos
- Validação de presença de datas obrigatórias funcionando
- Validação de formato de dois dígitos funcionando
- Validação de valores numéricos funcionando
- Validação de unicidade de tipos funcionando
- Validação específica por tipo (pub vs collection) funcionando
- Documentação inline clara (docstrings)
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:
history.py(validação de datas similar) - 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
<pub-date>: X% (verificar validações existentes) - Datas obrigatórias podem estar ausentes
- Atributos obrigatórios podem estar faltando
- Elementos incorretos por tipo de data não detectados
- Formatos inconsistentes (um vs dois dígitos) não detectados
- Múltiplas datas do mesmo tipo não detectadas
<day>em collection pode passar sem erro
Depois:
- Conformidade SPS 1.10 para
<pub-date>: 75% (9 de 12 regras) - Validação CRITICAL de presença de datas obrigatórias (pub e collection)
- Validação CRITICAL de atributos obrigatórios
- Validação CRITICAL de elementos obrigatórios por tipo
- Validação ERROR de formato de dois dígitos
- Validação ERROR de valores numéricos válidos
- Validação ERROR de unicidade de tipos
- Validação ERROR de proibição de
<day>em collection - ~60 testes unitários garantindo qualidade
- Internacionalização completa (PT/EN/ES)
Benefícios:
- Melhora a qualidade dos XMLs SciELO
- Garante presença de informações temporais essenciais
- Detecta inconsistências de formato antes da publicação
- Previne uso incorreto de elementos por tipo de data
- Facilita processamento automatizado de datas
- Melhora precisão de metadados temporais
- Garante conformidade com padrões SPS
- Facilita indexação e ordenação temporal
- Facilita manutenção e depuração de XMLs