Skip to content

Implementar validações do elemento <funding-group> conforme SPS 1.10#1094

Draft
Copilot wants to merge 6 commits intomasterfrom
copilot/add-validations-funding-group
Draft

Implementar validações do elemento <funding-group> conforme SPS 1.10#1094
Copilot wants to merge 6 commits intomasterfrom
copilot/add-validations-funding-group

Conversation

Copy link
Contributor

Copilot AI commented Feb 13, 2026

O que esse PR faz?

Implementa 6 novas validações para <funding-group> conforme especificação SPS 1.10, atingindo 70% de conformidade (7 de 10 regras). As validações cobrem:

P0 - Críticas:

  • Unicidade de <funding-group> por <article-meta> (ERROR)
  • Presença obrigatória de <funding-statement> (CRITICAL)
  • Presença de <funding-source> em <award-group> (CRITICAL)

P1 - Importantes:

  • Ausência de <label> em <funding-group> (ERROR)
  • Ausência de <title> em <funding-group> (ERROR)
  • Consistência de quantidades entre <funding-source> e <award-id> (WARNING)

Regra 4 (presença de <award-id>) já existia em validate_required_award_ids(). Regras 8-10 (sincronização de texto) excluídas por complexidade semântica (P2).

Onde a revisão poderia começar?

packtools/sps/validation/funding_group.py - novos métodos de validação (linhas 159-443)

Depois: tests/sps/validation/test_funding_group.py - 7 classes de teste com 19 casos (linhas 253-764)

Como este poderia ser testado manualmente?

from lxml import etree
from packtools.sps.validation.funding_group import FundingGroupValidation

xml = """
<article article-type="research-article" xml:lang="en">
    <front>
        <article-meta>
            <funding-group>
                <award-group>
                    <funding-source>FAPESP</funding-source>
                    <award-id>04/08142-0</award-id>
                </award-group>
                <funding-statement>Supported by FAPESP - Grant 04/08142-0</funding-statement>
            </funding-group>
        </article-meta>
    </front>
</article>
"""

validator = FundingGroupValidation(etree.fromstring(xml))

# Executar todas as validações
for result in validator.validate_funding_group_uniqueness():
    print(f"{result['title']}: {result['response']}")

for result in validator.validate_funding_statement_presence():
    print(f"{result['title']}: {result['response']}")

for result in validator.validate_funding_source_in_award_group():
    print(f"{result['title']}: {result['response']}")

for result in validator.validate_label_absence():
    print(f"{result['title']}: {result['response']}")

for result in validator.validate_title_absence():
    print(f"{result['title']}: {result['response']}")

for result in validator.validate_award_id_funding_source_consistency():
    print(f"{result['title']}: {result['response']}")

Testar casos inválidos:

  • XML com múltiplos <funding-group> → ERROR em validate_funding_group_uniqueness()
  • <funding-group> sem <funding-statement> → CRITICAL em validate_funding_statement_presence()
  • <award-group> sem <funding-source> → CRITICAL em validate_funding_source_in_award_group()
  • <label> dentro de <funding-group> → ERROR em validate_label_absence()

Algum cenário de contexto que queira dar?

Padrão de implementação:

  • Cada validação usa XPath para detecção eficiente
  • Retorna generators via build_response() (padrão existente)
  • Níveis de erro configuráveis (ERROR, CRITICAL, WARNING)
  • Mensagens com advice acionável para correção

Cobertura de testes:

  • 19 casos novos (100% passing)
  • Valida todos os exemplos da issue (6 cenários válidos)
  • Detecta corretamente todos os cenários inválidos
  • CodeQL: 0 vulnerabilidades

Decisões técnicas:

  • XPath //funding-group//label valida descendentes (não apenas filhos diretos)
  • validate_funding_statement_presence() retorna early se não há <funding-group>
  • Consistência de quantidades aceita: 0 (apoio), 1 (contrato único), N=N (múltiplos contratos)

Screenshots

N/A - validações de XML não requerem interface gráfica.

Quais são tickets relevantes?

Issue: Criar validações para o elemento <funding-group>

Referências

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 <funding-group> conforme a especificação SPS 1.10, aumentando a conformidade de X% para 70% (7 de 10 regras).

Nota: Algumas validações para <funding-group> 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 <funding-group> é usado para declarar informações estruturadas sobre financiamento e apoio à pesquisa. Essas informações devem estar sincronizadas com notas de documento (<fn fn-type="financial-disclosure"> ou <fn fn-type="supported-by">) ou agradecimentos (<ack>). Validações corretas garantem consistência entre as diferentes seções do documento e completude das informações de financiamento.

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

Regras principais conforme SPS 1.10:

  1. Ocorrência:

    • <funding-group> deve aparecer no máximo uma vez em <article-meta>
  2. Estrutura obrigatória:

    • <funding-statement> é obrigatório em todos os casos
    • Quando há instituições declaradas: <funding-source> é obrigatório
    • Quando há número de contrato: <award-id> é obrigatório
  3. Organização:

    • Cada <award-group> agrupa <funding-source> com seu respectivo <award-id>
    • Múltiplas instituições com o mesmo número de contrato ficam no mesmo <award-group>
    • Instituições com números de contrato diferentes ficam em <award-group> separados
  4. Restrições de elementos filhos:

    • Não permitido: <label> ou <title> dentro de <funding-group>
  5. Sincronização com outras seções:

    • Texto em <funding-statement> deve replicar informações de:
      • <fn fn-type="financial-disclosure"> (financiamento com contrato)
      • <fn fn-type="supported-by"> (apoio sem contrato)
      • <ack> (agradecimentos com informações de financiamento)
  6. Declaração negativa de financiamento:

    • Quando não há financiamento, deve existir <funding-group> apenas com <funding-statement> declarando isso

Regras a Implementar

P0 – Críticas (implementar obrigatoriamente)

# Regra Nível Descrição
1 Validar unicidade de <funding-group> ERROR O elemento <funding-group> deve aparecer no máximo uma vez em <article-meta>
2 Validar presença de <funding-statement> CRITICAL O elemento <funding-statement> é obrigatório em <funding-group>
3 Validar presença de <funding-source> quando há instituições CRITICAL Quando <award-group> existe, deve conter pelo menos um <funding-source>
4 Validar presença de <award-id> quando há contrato ERROR Quando <funding-source> menciona número de contrato no texto, deve existir <award-id> correspondente

P1 – Importantes (implementar se possível)

# Regra Nível Descrição
5 Validar ausência de <label> em <funding-group> ERROR O elemento <label> não é permitido dentro de <funding-group> ou seus filhos
6 Validar ausência de <title> em <funding-group> ERROR O elemento <title> não é permitido dentro de <funding-group> ou seus filhos
7 Validar consistência de quantidade de <funding-source> e <award-id> WARNING Em cada <award-group>, a quantidade de <award-id> deve ser compatível: 0 (apoio sem contrato), 1 (um contrato), ou N (múltiplos contratos para múltiplas fontes)

P2 – Futuras (fora do escopo deste Issue)

# Regra Motivo de exclusão
8 Validar sincronização de texto entre <funding-statement> e <fn> ou <ack> Alta complexidade - requer análise semântica e comparação de texto livre
9 Validar que instituições em <funding-source> aparecem no texto de <funding-statement> Alta complexidade - requer análise de texto e matching fuzzy
10 Validar que números em <award-id> aparecem no texto de <funding-statement> Média complexidade - requer análise de texto e extração de padrões

Arquivos a Criar/Modificar

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

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

Criar (se não existirem):

  • packtools/sps/models/funding_group.py – Modelo de extração de dados
  • `packtools/sps/validatio...

💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Copilot AI and others added 5 commits February 13, 2026 12:13
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
…th comprehensive tests

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
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 funding-group element Implementar validações do elemento <funding-group> conforme SPS 1.10 Feb 13, 2026
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 <funding-group>

2 participants