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
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
"""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())
|
||||
Reference in New Issue
Block a user