Files
rodado 23b56e8c87 feat: descrição arquivística NOBRADE multinível com exportação EAD 3, EAC-CPF e AtoM
- pipeline/nobrade: normalizadores de datas (ISO 8601-2), séries, autoridades,
  espécie/suporte, direitos, lugar e assuntos; montagem dos níveis 0–5 com
  código de referência BR RJXYZ.BF.<seção>.<série>.<handle>.<imagem>
- validador dos elementos obrigatórios: 0 pendências em 26.454 unidades
- EAD 3 e 457 EAC-CPF validados contra os XSD
- mural: cartão com código, data normalizada, série e reprodução; filtro por série
2026-09-30 21:22:00 +02:00

54 lines
2.0 KiB
Python

"""python -m nobrade (de dentro de pipeline/)
Gera a descrição NOBRADE completa em descricao/: unidades, autoridades,
tabelas de revisão, pendências, EAD 3, EAC-CPF e CSV do AtoM, e valida os XML
contra os XSD de nobrade/xsd/ quando o xmllint está disponível.
"""
import shutil
import subprocess
import sys
from collections import defaultdict
from pathlib import Path
from . import exporta, montar, valida
from .config import SAIDA
def main():
print('montando unidades…', flush=True)
unidades, aut = montar.monta()
lista = sorted(unidades.values(), key=lambda u: (u['nivel'], u['id']))
lista = [{k: v for k, v in u.items() if not k.startswith('_') and v is not None} for u in lista]
pend = valida.valida(lista)
print(f'{len(lista)} unidades, {len(aut.registros)} autoridades, {pend} pendências obrigatórias')
print('exportando EAD 3, EAC-CPF e AtoM…', flush=True)
exporta.ead(lista, aut.registros)
usos = defaultdict(list)
for u in lista:
if u['nivel'] == 4:
for p in u['2.1']:
if p.get('id'):
usos[p['id']].append(u['id'])
exporta.eac(list(aut.registros.values()), usos)
exporta.atom(lista)
if shutil.which('xmllint') and '--sem-xsd' not in sys.argv:
xsd = Path(__file__).parent / 'xsd'
r = subprocess.run(['xmllint', '--noout', '--huge', '--schema', xsd / 'ead3.xsd',
SAIDA / 'ead' / 'brasiliana.xml'], capture_output=True, text=True)
print('EAD 3:', (r.stderr.strip().splitlines() or ['?'])[-1])
eacs = sorted((SAIDA / 'eac').glob('*.xml'))
r = subprocess.run(['xmllint', '--noout', '--schema', xsd / 'cpf.xsd', *eacs],
capture_output=True, text=True)
falhas = [x for x in r.stderr.splitlines() if 'fails to validate' in x or 'error' in x.lower()]
print(f'EAC-CPF: {len(eacs)} arquivos, {len(falhas)} com erro')
for x in falhas[:10]:
print(' ', x)
return 1 if pend else 0
if __name__ == '__main__':
sys.exit(main())