Spaces:
Sleeping
Sleeping
File size: 2,269 Bytes
497c3ef | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | from __future__ import annotations
import json
from pathlib import Path
from bl_ocr.domain.schema_validation import build_validator
from bl_ocr.eval.harness import evaluate_annotation, evaluate_directory
PROJECT_ROOT = Path(__file__).resolve().parents[1]
SCHEMA_PATH = PROJECT_ROOT / "schema.json"
def _validator():
return build_validator(json.loads(SCHEMA_PATH.read_text(encoding="utf-8")))
def _example() -> dict:
return json.loads((PROJECT_ROOT / "example.json").read_text(encoding="utf-8"))
def test_clean_example_passes_all_structural_checks():
result = evaluate_annotation("example", _example(), _validator())
assert result.parse_pass
assert result.schema_pass
assert result.schema_error_count == 0
assert result.row_count_pass
assert result.arithmetic_pass
assert not result.critical
def test_row_count_mismatch_is_flagged():
annotation = _example()
annotation["totals"]["line_count"]["value"] = 99
result = evaluate_annotation("mismatch", annotation, _validator())
assert not result.row_count_pass
def test_empty_products_with_line_count_is_critical():
annotation = _example()
annotation["products"] = []
result = evaluate_annotation("empty", annotation, _validator())
assert result.critical
assert result.critical_reason is not None
def test_none_annotation_fails_parse():
result = evaluate_annotation("broken", None, _validator(), parse_error="bad json")
assert not result.parse_pass
assert result.parse_error == "bad json"
def test_evaluate_directory_aggregates(tmp_path: Path):
# one clean file, one schema-invalid file (extra key)
clean = _example()
(tmp_path / "clean.json").write_text(
json.dumps({"document_annotation": json.dumps(clean)}), encoding="utf-8"
)
dirty = _example()
dirty["products"][0]["_repaired"] = "leak"
(tmp_path / "dirty.json").write_text(
json.dumps({"document_annotation": json.dumps(dirty)}), encoding="utf-8"
)
summary = evaluate_directory(tmp_path, SCHEMA_PATH)
assert summary.total == 2
assert summary.parse_pass == 2
assert summary.schema_pass == 1
data = summary.as_dict()
assert data["rates"]["schema_pass"] == 0.5
assert len(data["files"]) == 2
|