Files
Copies/copienator/commands/regenerate_reviewed.py
T
2026-11-03 10:02:10 +01:00

53 lines
2.9 KiB
Python

"""Re-render saved handwriting interpretation with current scores and remarks."""
from copienator import EvaluationWorkspace, ExitCode, evaluation_parser, execute, workspace_from_args, utils
from copienator.review_snapshot import load, FILENAME
from copienator.commands.reading_annotations import apply_actions_and_regenerate
from copienator.commands.reading_grouped_annotations import apply_actions_and_regenerate_grouped
def run(workspace: EvaluationWorkspace, mode: str, *, incremental: bool = False):
directories = sorted((p for p in (workspace.root / mode).glob('Copie*')
if p.is_dir() and p.name[5:].isdigit() and (p / 'score.json').is_file()))
from copienator.reviewed_cache import ReviewedReadCache
cache = ReviewedReadCache(workspace, mode, directories) if incremental else None
if cache:
pending = []
for directory in directories:
if cache.unchanged(directory.name[5:]):
print(f"Skipping unchanged {directory.name}", flush=True)
else:
pending.append(directory)
directories = pending
# Validate every snapshot before starting to publish any copy.
for directory in directories:
if not (directory / FILENAME).is_file():
raise ValueError(f'{directory.name} : résultat de lecture sauvegardé absent ; relisez les annotations manuscrites.')
load(workspace.root, directory)
status = ExitCode.SUCCESS
for directory in directories:
cid = directory.name[5:]
saved, data, notes = load(workspace.root, directory)
if saved['engine'] == 'standard':
result = apply_actions_and_regenerate(workspace, {cid: data}, cid, [], None,
utils.read_all_labels(workspace.root), update_score=True,
label_notes={label: note['img'] for label, note in notes.items()},
review_metadata=saved['bnote'])
else:
result, log = apply_actions_and_regenerate_grouped(workspace, {cid: data}, cid, [], notes,
utils.read_all_labels(workspace.root), update_score=True, annotation_dir=mode,
force_filtered=set(saved.get('force_filtered', [])))
print(log, flush=True)
if result != ExitCode.SUCCESS:
status = ExitCode.PARTIAL
elif cache:
# Rendering can normalize the saved snapshot; fingerprint the published inputs.
ReviewedReadCache(workspace, mode, [directory]).remember([cid])
return status
def main(argv=None):
parser = evaluation_parser('Regenerate from saved reviewed inputs without rescanning handwriting')
parser.add_argument('--annotation-dir', choices=('Bnot', 'BGnot'), required=True)
parser.add_argument("--incremental", action="store_true", help="Skip unchanged copies")
return execute(parser, argv, lambda args: run(workspace_from_args(args), args.annotation_dir, incremental=args.incremental))