Pular para o conteúdo principal

Validadores de consistência

Gerar dados plausíveis é fácil; gerar dados coerentes entre 257 tabelas não é. A camada persona_db/validators/ percorre o dataset em memória e reprova a execução quando qualquer invariante é quebrada.

Verificações estruturais​

Definidas no próprio run_validators.py e aplicadas antes dos validadores de domínio:

FunçãoVerifica
check_peopleid único; nascimento não futuro; óbito posterior ao nascimento; coerência entre esta_vivo e data_obito
check_parentageprogenitor com pelo menos 14 anos a mais que o filho; ausência de auto-parentesco
check_date_rangesem todas as tabelas: data_inicio <= data_fim e data_entrada <= data_saida
check_physical_traitsaltura entre 50 e 250 cm; peso entre 2 e 300 kg

Validadores de domínio​

MóduloRegras principais
val_genealogiapais nunca mais jovens que filhos (≥ 14 anos); tipo sanguíneo ABO+Rh compatível por Punnett; cor dos olhos biologicamente possível
val_temporalpares de datas coerentes (inclusive data_ida/data_volta); casamento a partir dos 16 anos; primeiro emprego a partir dos 14 (aprendiz/estágio) ou 18 (CLT/PJ/público)
val_financassaldo coerente com créditos e débitos; financiamento imobiliário dentro do valor do imóvel e juros em [0, 500]; salário ≥ mínimo vigente no ano (MIN_WAGE_HISTORY)
val_saudetipo sanguíneo igual em pessoa e pessoa_caracteristica_fisica; prescrições e cirurgias apenas com diagnóstico registrado
val_juridicovoto apenas acima de 16 anos na data da eleição; candidato filiado ao partido; sentença vinculada a julgamento; pena vinculada a sentença
val_socialnenhum casamento simultâneo ativo; filho com pai e mãe distintos e registro único; nenhuma auto-referência em relacionamentos, amizades e inimizades

O catálogo completo de regras é extraído do código a cada build.

Assinatura comum​

def validate_<dominio>(
dataset: dict[str, list[dict]],
today: date | None = None,
) -> list[dict]:
"""Devolve a lista de violações encontradas (vazia = aprovado)."""

Cada violação é um dicionário:

{"domain": "genealogia", "rule": "parent_at_least_14",
"person_id": "…", "parent_id": "…"}

Executando​

# valida um dataset regenerado com a mesma semente
python3 -m persona_db.validators.run_validators --personas 200 --seed 42 --html-out report.html
from persona_db.scripts.generate import generate_all
from persona_db.validators import validate_dataset, validate_saude

dataset = generate_all(n=100, seed=7)

report = validate_dataset(dataset) # relatório completo
violacoes = validate_saude(dataset) # apenas um domínio

O comportamento detalhado do relatório (percentuais por domínio, HTML, código de saída) está em Relatório de validação.

Testes​

persona_db/tests/unit/test_validators.py constrói datasets propositalmente quebrados e confirma que cada regra dispara — e que um dataset íntegro passa sem violações.