Un documento ilegible aborta el lote entero y pierde todo el trabajo
Ubicacion:
pdf_compare/batch.py:81-96python
| 83 | path_b = os.path.join(dir_b, name_b) |
| 84 | |
| 85 | comparator = PDFComparator(path_a, path_b) |
| 86 | summary, pdf_bytes = comparator.compare(build_pdf=bool(output_dir)) |
| 87 | |
| 88 | diff_name = None |
| 89 | if pdf_bytes is not None: |
Que pasa
El bucle llama a comparator.compare() sin ningun aislamiento por pareja. Si un documento esta cifrado, corrupto o ilegible, la excepcion sube hasta el manejador generico de la CLI, que imprime una traza y termina con codigo 1. Ademas el modo lote no ejecuta validate_pdf() sobre los ficheros, que es justo lo que el modo de un solo par si hace.
Impact
Verificado: una carpeta con tres parejas donde la de en medio esta protegida con contrasena falla con 'ValueError: document closed or encrypted' y no produce ni informe ni diffs. Las dos parejas buenas se comparan y su resultado se tira. Sobre las carpetas de polizas reales que motivaron esta funcion, un solo documento protegido invalida la ejecucion completa y el usuario solo ve un traceback.
Por que importa
Una operacion por lotes tiene un contrato distinto al de una operacion sobre un elemento: se espera que un elemento malo se registre y se siga, no que anule a los demas. La robustez no se hereda al envolver una operacion en un bucle; hay que anadirla explicitamente, y el sitio natural es el limite de cada elemento.
Sugerencia
Aislar cada pareja: capturar el fallo, registrarlo en su entrada del resultado y continuar. El informe ya tiene sitio para mostrarlo junto a los sin pareja y los escaneados, que son la misma categoria de 'esto necesita un humano'. Vale la pena decidir tambien si un lote con fallos debe terminar con codigo distinto de cero para que un script se entere.
Recommended change
Current code
comparator = PDFComparator(path_a, path_b) summary, pdf_bytes = comparator.compare(build_pdf=bool(output_dir))
Suggested code
comparator = PDFComparator(path_a, path_b)
try:
summary, pdf_bytes = comparator.compare(build_pdf=bool(output_dir))
except Exception as error:
results.append(failed_pair(name_a, name_b, score, error))
continueTests
El diff no cubre este caso: ningun test mete un documento ilegible en una carpeta. Hace falta uno que compare dos carpetas donde una pareja esta cifrada y afirme que las demas si se comparan y que el informe registra el fallo.