"""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())