Skip to content

Add pub-date validations for SPS 1.10 conformance (9 of 12 rules)#1139

Draft
Copilot wants to merge 3 commits intomasterfrom
copilot/criar-validacoes-pub-date
Draft

Add pub-date validations for SPS 1.10 conformance (9 of 12 rules)#1139
Copilot wants to merge 3 commits intomasterfrom
copilot/criar-validacoes-pub-date

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Mar 19, 2026

O que esse PR faz?

Implementa 9 regras de validação para o elemento <pub-date> conforme SPS 1.10, cobrindo presença, atributos obrigatórios, elementos filhos, unicidade e ranges numéricos.

Regras implementadas:

# Regra Nível Método
1 <pub-date date-type="pub"> obrigatório CRITICAL validate_pub_date_pub_presence
2 <pub-date date-type="collection"> obrigatório CRITICAL validate_pub_date_collection_presence
3 @publication-format="electronic" obrigatório CRITICAL validate_publication_format
4 <day>, <month>, <year> obrigatórios em pub CRITICAL validate_pub_date_pub_required_elements
5 <year> obrigatório em collection CRITICAL validate_pub_date_collection_required_year
6 <day> proibido em collection ERROR validate_pub_date_collection_no_day
7 Formato 2 dígitos para day/month Já existia em DateValidation
8 Unicidade por date-type ERROR validate_pub_date_uniqueness
9 Ranges (day 00-31, month 00-12) ERROR validate_day_month_values

Modelo:

  • Date.publication_format — extrai @publication-format do nó XML
  • FulltextDates.all_pub_date_nodes / pub_date_nodes_by_type — acesso a todos os <pub-date>

Design: Validações de presença (regras 1-2) só rodam para <article>, não para <sub-article> (que usa <front-stub> e pode legitimamente não ter pub-dates).

Onde a revisão poderia começar?

packtools/sps/validation/dates.py — métodos novos em FulltextDatesValidation (linhas ~308-480).

Como este poderia ser testado manualmente?

from lxml import etree
from packtools.sps.validation.dates import FulltextDatesValidation

xml = """
<article article-type="research-article" xml:lang="pt">
  <front><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></front>
</article>
"""
tree = etree.fromstring(xml)
validator = FulltextDatesValidation(tree, {"parent": {"parent": "article"}, "required_events": []})
for r in validator.validate():
    if r["response"] != "OK":
        print(r["title"], r["response"], r["advice"])

Remover publication-format, <day> do collection, ou <year> do collection para ver os erros correspondentes.

Algum cenário de contexto que queira dar?

  • 26 novos testes unitários cobrindo todos os cenários válidos e inválidos dos exemplos XML da spec
  • 6 testes pré-existentes que já falhavam foram corrigidos (format tests esperavam dict sem chaves i18n; fulltext tests com contagens desatualizadas)
  • O campo publication_format foi adicionado ao Date.data dict, exigindo atualização do test do modelo

Screenshots

N/A

Quais são tickets relevantes?

Criar validações para o elemento <pub-date>

Referências

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • api.crossref.org
    • Triggering command: /usr/bin/python python -m pytest tests/sps/validation/ -v --tb=short --ignore=tests/sps/validation/test_footnotes.py --ignore=tests/sps/validation/test_supplementary_material.py --ignore=tests/sps/validation/test_history_integration.py (dns block)
    • Triggering command: `/usr/bin/python python -m pytest tests/sps/validation/ -v --tb=short --ignore=tests/sps/validation/test_footnotes.py --ignore=tests/sps/validation/test_supplementary_material.py --ignore=tests/sps/validation/test_history_integration.py Add 8 new validation methods to FulltextDatesValidation:
  • validate_pub_date_pub_��` (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Original prompt

This section details on the original issue you should resolve

<issue_title>Criar validações para o elemento </issue_title>
<issue_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:

  1. Ocorrência:

    • <pub-date> deve aparecer uma ou mais vezes em <article-meta>
  2. 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)
  3. Atributos obrigatórios:

    • @date-type (valores: pub, collection)
    • @publication-format="electronic" (obrigatório para ambas as datas)
  4. Elementos obrigatórios para date-type="pub":

    • <day> (obrigatório)
    • <month> (obrigatório)
    • <year> (obrigatório)
  5. Elementos para date-type="collection":

    • <year> (obrigatório)
    • <month> ou <season> (opcional, depende da periodicidade)
    • <day> não é permitido
  6. Formato obrigatório:

    • <day> e <month> devem ter dois dígitos: 01, 02, ..., 12
  7. Periodicidade e elementos:

    • Anual: apenas <year>
    • Mensal: <month> + <year>
    • Bimestral/Quadrimestral/etc: <season> + <year>
  8. Observações:

    • Datas pub podem usar 00 em day/month para preenchimento posterior
    • Datas collection devem seguir a periodicidade do periódico

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.py ou pub_date.py – Verificar se modelo existe
  • packtools/sps/validation/dates.py ou pub_date.py – Verificar validações existentes
  • packtools/sps/validation/rules/pub_date_rules.json ou similar – Verificar configuração

Criar (se não existirem):

  • packtools/sps/models/pub_date.py – Modelo de extração de dados
  • packtools/sps/validation/pub_date.py – Validações
  • `packtools/sps/validation/rules/pub_da...

✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI and others added 2 commits March 19, 2026 12:20
- Add publication_format to Date model
- Add all_pub_date_nodes and pub_date_nodes_by_type to FulltextDates
- Add 8 new validation methods to FulltextDatesValidation:
  - validate_pub_date_pub_presence (Rule 1)
  - validate_pub_date_collection_presence (Rule 2)
  - validate_publication_format (Rule 3)
  - validate_pub_date_pub_required_elements (Rule 4)
  - validate_pub_date_collection_required_year (Rule 5)
  - validate_pub_date_collection_no_day (Rule 6)
  - validate_pub_date_uniqueness (Rule 8)
  - validate_day_month_values (Rule 9)
- Update article_dates_rules.json with new error levels
- Add 26 new test cases and fix 6 pre-existing test failures

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Copilot AI changed the title [WIP] Implementar validações para o elemento <pub-date> Add pub-date validations for SPS 1.10 conformance (9 of 12 rules) Mar 19, 2026
Copilot AI requested a review from robertatakenaka March 19, 2026 12:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Criar validações para o elemento <pub-date>

2 participants