Skip to content

Implementar validações para elemento <list>#1099

Open
Copilot wants to merge 5 commits intomasterfrom
copilot/implement-list-validations
Open

Implementar validações para elemento <list>#1099
Copilot wants to merge 5 commits intomasterfrom
copilot/implement-list-validations

Conversation

Copy link
Contributor

Copilot AI commented Feb 13, 2026

O que esse PR faz?

Implementa validações completas para o elemento <list> conforme especificação SPS 1.10, atingindo 70% de conformidade (7 de 10 regras). O sistema agora valida presença e valores do atributo @list-type, quantidade mínima de itens, e recomenda boas práticas de acessibilidade. As validações foram integradas ao orquestrador de validações do packtools.

Regras implementadas:

  • P0 (Críticas): Presença de @list-type (CRITICAL), valores permitidos (ERROR), mínimo 2 <list-item> (ERROR), ausência de <label> (WARNING)
  • P1 (Importantes): Conteúdo em <list-item> (WARNING), recomendação de <title> (INFO)

Valores permitidos para @list-type: order, bullet, alpha-lower, alpha-upper, roman-lower, roman-upper, simple

Onde a revisão poderia começar?

  1. packtools/sps/validation/list.py - Lógica de validação (6 regras)
  2. packtools/sps/models/list.py - Modelo de extração de dados
  3. packtools/sps/validation_rules/list_rules.json - Configuração de níveis de erro
  4. packtools/sps/validation/xml_validations.py - Função validate_lists() adicionada ao orquestrador
  5. packtools/sps/validation/xml_validator.py - Grupo "list" adicionado ao pipeline de validação
  6. tests/sps/validation/test_list.py - Suite de testes (11 testes)

Como este poderia ser testado manualmente?

from lxml import etree
from packtools.sps.validation.list import ArticleListValidation

# Caso inválido: @list-type ausente
xml = etree.fromstring("""
<article article-type="research-article" xml:lang="pt">
<body>
<list>
    <list-item><p>Item 1</p></list-item>
    <list-item><p>Item 2</p></list-item>
</list>
</body>
</article>
""")

results = list(ArticleListValidation(xml, {}).validate())
# Esperado: CRITICAL para @list-type ausente

# Caso válido: todos os 7 tipos permitidos
for list_type in ["order", "bullet", "alpha-lower", "alpha-upper", 
                   "roman-lower", "roman-upper", "simple"]:
    xml = etree.fromstring(f"""
    <article article-type="research-article" xml:lang="pt">
    <body>
    <list list-type="{list_type}">
        <list-item><p>Item 1</p></list-item>
        <list-item><p>Item 2</p></list-item>
    </list>
    </body>
    </article>
    """)
    results = list(ArticleListValidation(xml, {}).validate())
    # Esperado: Todas validações passam (response="OK")

Testando via orquestrador:

from lxml import etree
from packtools.sps.validation.xml_validator import validate_xml_content

xml = etree.fromstring("""
<article xmlns:xlink="http://www.w3.org/1999/xlink" article-type="research-article" xml:lang="pt">
<body>
<list list-type="bullet">
    <list-item><p>Item 1</p></list-item>
    <list-item><p>Item 2</p></list-item>
</list>
</body>
</article>
""")

for result in validate_xml_content(xml, {}):
    if result["group"] == "list":
        print(result)

Execute os testes unitários: python -m unittest tests.sps.validation.test_list

Algum cenário de contexto que queira dar?

Arquitetura: Segue padrão existente de fig.py e tablewrap.py. O modelo ArticleLists agrega listas de article, sub-articles translation e non-translation. Validações são independentes por lista, suportando aninhamento.

Integração no orquestrador: A função validate_lists() foi adicionada em xml_validations.py e o grupo "list" foi registrado em validate_xml_content() em xml_validator.py, seguindo o mesmo padrão de fig, table-wrap e demais elementos. As regras configuráveis foram extraídas para packtools/sps/validation_rules/list_rules.json.

Acessibilidade: A regra sobre <label> é WARNING (não ERROR) porque o atributo @list-type gera marcadores automaticamente - mais acessível para screen readers.

Listas aninhadas: Validadas independentemente. Uma lista order contendo lista bullet resulta em 2 conjuntos de validações.

Quais são tickets relevantes?

TK #1090

Referências

  • SPS 1.10 - Elemento list
  • Implementações de referência: packtools/sps/validation/fig.py, packtools/sps/models/tablewrap.py
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 <list> conforme a especificação SPS 1.10, aumentando a conformidade de X% para 70% (7 de 10 regras).

Nota: Algumas validações para <list> 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 <list> identifica listas com dois ou mais itens no documento. Validações corretas garantem acessibilidade através do uso adequado do atributo @list-type ao invés de <label>, presença de elementos mínimos necessários, e uso correto de valores permitidos para tipos de lista.

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.list

Regras principais conforme SPS 1.10:

  1. Atributo obrigatório:

    • @list-type é obrigatório em todos os <list>
  2. Valores permitidos para @list-type:

    • order - Lista ordenada com números (1, 2, 3...)
    • bullet - Lista desordenada com símbolos (•, -, etc.)
    • alpha-lower - Lista ordenada alfabética minúscula (a, b, c...)
    • alpha-upper - Lista ordenada alfabética maiúscula (A, B, C...)
    • roman-lower - Lista ordenada romana minúscula (i, ii, iii...)
    • roman-upper - Lista ordenada romana maiúscula (I, II, III...)
    • simple - Lista simples sem prefixo
  3. Estrutura mínima:

    • <list> deve conter pelo menos dois <list-item>
  4. Elementos permitidos:

    • <title> (opcional, mas recomendado quando disponível)
    • <list-item> (obrigatório, mínimo 2)
  5. Acessibilidade:

    • Não usar <label> dentro de <list-item> para rótulos
    • O atributo @list-type gera automaticamente os prefixos/rótulos
    • Uso de <label> é menos acessível e menos legível por máquina
  6. Listas aninhadas:

    • Permitido ter <list> dentro de <list-item>

Regras a Implementar

P0 – Críticas (implementar obrigatoriamente)

# Regra Nível Descrição
1 Validar presença de @list-type CRITICAL O atributo @list-type é obrigatório em <list>
2 Validar valores permitidos de @list-type ERROR O valor de @list-type deve estar na lista de valores permitidos
3 Validar presença mínima de <list-item> ERROR O elemento <list> deve conter pelo menos dois <list-item>
4 Validar ausência de <label> em <list-item> WARNING Para acessibilidade, não use <label> em <list-item> (o atributo @list-type gera rótulos automaticamente)

P1 – Importantes (implementar se possível)

# Regra Nível Descrição
5 Validar que cada <list-item> tem conteúdo WARNING Cada <list-item> deve conter pelo menos um elemento filho (tipicamente <p>)
6 Recomendar uso de <title> quando apropriado INFO Quando a lista tiver um título descritivo, recomenda-se usar <title>

P2 – Futuras (fora do escopo deste Issue)

# Regra Motivo de exclusão
7 Validar profundidade de aninhamento de listas Baixa prioridade - formato livre permite múltiplos níveis
8 Validar consistência de tipo em listas aninhadas Baixa prioridade - não há restrição SPS
9 Validar que <list-item> contém <p> ao invés de texto direto Média complexidade - schema permite várias estruturas
10 Validar que lista com um único item deveria ser parágrafo Baixa prioridade - decisão editorial

Arquivos a Criar/Modificar

Avaliar existentes (podem ter validações parciais):

  • packtools/sps/models/list.py ou similar – Verificar se modelo existe
  • packtools/sps/validation/list.py – Verificar validações existentes
  • packtools/sps/validation/rules/list_rules.json ou similar – Verificar configuração

Criar (se não existirem):

  • packtools/sps/models/list.py – Modelo de extração de dados
  • packtools/sps/validation/list.py – Validações
  • packtools/sps/validation/rules/list_rules.json – Configuração de níveis de erro
  • tests/sps/validation/test_list.py – Testes unitários

Referenciar (implementações similares):

  • packtools/sps/validation/fig.py – Validação de atributos obrigatórios
  • packtools/sps/validation/utils.py – Funções auxiliares (build_response)

Exemplos de XML

XML Válido (deve passar sem erros):

<!-- Exemplo 1: Lista com bullet -->
<list list-type="bullet">
    <title>Nam commodo</title>
    <list-item>
        <p>Morbi luctus elit enim.</p>
    </list-item>
    <list-item>
        <p>Nullam nunc leo.</p>
    </list-item>
    <list-item>
        <p>Proin...

</details>



<!-- START COPILOT CODING AGENT SUFFIX -->

- Fixes scieloorg/packtools#1090

<!-- START COPILOT CODING AGENT TIPS -->
---

✨ Let Copilot coding agent [set things up for you](https://github.com/scieloorg/packtools/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI and others added 2 commits February 13, 2026 12:41
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] Add validations for the <list> element Implementar validações para elemento <list> conforme SPS 1.10 Feb 13, 2026
@Rossi-Luciano Rossi-Luciano self-requested a review March 6, 2026 13:58
Copy link
Collaborator

@Rossi-Luciano Rossi-Luciano left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adicionar as validações criadas para <list> no orquestrador:

  • packtools/sps/validation/xml_validations.py
  • packtools/sps/validation/xml_validator.py

@robertatakenaka
Copy link
Member

@copilot Adicionar as validações criadas para no orquestrador:

packtools/sps/validation/xml_validations.py
packtools/sps/validation/xml_validator.py

…_validator.py)

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Mar 6, 2026

Adicionar as validações criadas para <list> no orquestrador:

  • packtools/sps/validation/xml_validations.py...

Done in b07aba4. Added:

  • validate_lists() function in xml_validations.py
  • "list" group in validate_xml_content() in xml_validator.py
  • list_rules.json in validation_rules/ with all configurable error levels and allowed list-type values

@copilot Adicionar as validações criadas para no orquestrador:

packtools/sps/validation/xml_validations.py
...

Done in b07aba4. The list validations are now integrated into both orchestrators following the same pattern as fig, table-wrap, and other element validations.

Copilot AI changed the title Implementar validações para elemento <list> conforme SPS 1.10 Implementar validações para elemento <list> Mar 6, 2026
@robertatakenaka robertatakenaka marked this pull request as ready for review March 13, 2026 12:15
Copilot AI review requested due to automatic review settings March 13, 2026 12:15
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR implements validation rules for the <list> XML element per SPS 1.10 specification, covering 6 rules: @list-type presence/value, minimum list items, label absence in list-items, empty list-item detection, and title recommendation.

Changes:

  • New model (packtools/sps/models/list.py) and validation (packtools/sps/validation/list.py) modules for <list> element
  • Integration into the validation orchestrator (xml_validations.py, xml_validator.py) and configurable rules (list_rules.json)
  • Test suite with 11 test cases covering valid/invalid scenarios

Reviewed changes

Copilot reviewed 6 out of 7 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
packtools/sps/models/list.py Model for extracting list element data from XML
packtools/sps/validation/list.py Six validation rules for <list> elements
packtools/sps/validation_rules/list_rules.json Default rule configuration (error levels, allowed types)
packtools/sps/validation/xml_validations.py validate_lists() function added to orchestrator
packtools/sps/validation/xml_validator.py "list" group registered in validation pipeline
tests/sps/validation/test_list.py 11 unit tests for list validation
.gitignore Minor trailing slash fix

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

"""
title = self.data.get("title")
has_title = title is not None and title.strip() != ""
is_valid = True # This is just a recommendation, not a strict requirement
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.

4 participants