case0 / scripts /check_exhibits.py
HusseinEid's picture
Per-case visuals, incident vignettes, guided play, no-repeat dealing, four new crime kinds (#4)
16ff49b
Raw
History Blame
1.7 kB
"""Read-only check: project every prebaked case to its public view and report which
rich payload each clue gets. Fails (exit 1) if any case ends up all-paper."""
from __future__ import annotations
import sys
from collections import Counter
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
from case_zero.api.case_adapter import casefile_to_public # noqa: E402
from case_zero.persistence.case_store import load_case # noqa: E402
from case_zero.persistence.paths import prebaked_cases_dir # noqa: E402
def payload_kind(ev) -> str:
if ev.thread:
return "thread"
if ev.transcript:
return "voicemail"
if ev.rows:
return "keycard"
if ev.type == "IMAGE":
return "cctv" if ev.icon == "cctv" else "photo"
return "paper"
def main() -> int:
hist: Counter[str] = Counter()
all_paper: list[str] = []
for path in sorted(prebaked_cases_dir().glob("*.json")):
case = load_case(path)
public = casefile_to_public(case)
kinds = []
for ev in public.evidence:
kind = payload_kind(ev)
kinds.append(kind)
hist[kind] += 1
print(f"{case.case_id} | {ev.id:10s} | {ev.icon:12s} | {kind:9s} | {ev.name[:52]}")
if all(k == "paper" for k in kinds):
all_paper.append(case.case_id)
print("\n--- payload histogram:")
for kind, n in hist.most_common():
print(f"{kind:9s} {n}")
if all_paper:
print(f"\nFAIL: all-paper cases: {all_paper}")
return 1
print("\nOK: every case has at least one rich exhibit")
return 0
if __name__ == "__main__":
raise SystemExit(main())