- 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
54 lines
2.0 KiB
Python
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())
|