| from __future__ import annotations |
|
|
| import json |
| from pathlib import Path |
| from typing import Any |
|
|
|
|
| def load_demo_cases(path: Path) -> list[dict[str, Any]]: |
| with path.open("r", encoding="utf-8") as file: |
| return [json.loads(line) for line in file if line.strip()] |
|
|
|
|
| def get_demo_case(cases: list[dict[str, Any]], case_id: str) -> dict[str, Any]: |
| for case in cases: |
| if case.get("case_id") == case_id: |
| return case |
| available = ", ".join(case["case_id"] for case in cases) |
| raise KeyError(f"Unknown case_id '{case_id}'. Available case IDs: {available}") |
|
|
|
|
| def resolve_demo_image_path(raw_path: str, dataset_root: Path) -> Path: |
| return dataset_root / raw_path.lstrip("/") |
|
|
|
|
| def resolve_case_images(case: dict[str, Any], dataset_root: Path) -> list[Path]: |
| raw_paths = case.get("images", []) |
| if not raw_paths: |
| raise ValueError(f"Case '{case.get('case_id')}' has no images.") |
|
|
| resolved_paths: list[Path] = [] |
| missing_paths: list[Path] = [] |
|
|
| for raw_path in raw_paths: |
| resolved = resolve_demo_image_path(raw_path, dataset_root) |
| if resolved.exists(): |
| resolved_paths.append(resolved) |
| else: |
| missing_paths.append(resolved) |
|
|
| if missing_paths: |
| missing_list = "\n".join(f" - {path}" for path in missing_paths) |
| raise FileNotFoundError( |
| f"Resolved demo image(s) not found for case " |
| f"'{case.get('case_id')}'. Check --dataset-root.\n{missing_list}" |
| ) |
|
|
| return resolved_paths |
|
|