from __future__ import annotations import json from pathlib import Path from typing import Any from operational_report_contract import ( REPORT_SCHEMA_VERSION, REPORT_SECTION_ORDER, REPORT_SOURCE_JSON, ) ROOT = Path(__file__).resolve().parents[1] SCHEMA_PATH = ROOT / "schemas" / "operational_report.schema.json" def load_json(path: Path) -> dict[str, Any]: payload = json.loads(path.read_text(encoding="utf-8")) return payload if isinstance(payload, dict) else {} def main() -> int: if not SCHEMA_PATH.exists(): print("OPERATIONAL_REPORT_CONTRACT_FAIL: missing schema file") return 1 schema = load_json(SCHEMA_PATH) errors: list[str] = [] if schema.get("properties", {}).get("schema_version", {}).get("const") != REPORT_SCHEMA_VERSION: errors.append("schema_version const mismatch") if schema.get("properties", {}).get("source_json", {}).get("const") != REPORT_SOURCE_JSON: errors.append("source_json const mismatch") section_count = schema.get("properties", {}).get("section_count", {}) if section_count.get("type") != "integer": errors.append("section_count type must be integer") sections = schema.get("properties", {}).get("sections", {}) if sections.get("type") != "array": errors.append("sections type must be array") section_items = sections.get("items", {}) name_type = section_items.get("properties", {}).get("name", {}).get("type") if name_type != "string": errors.append("section item name type must be string") if len(REPORT_SECTION_ORDER) != len(set(REPORT_SECTION_ORDER)): errors.append("contract section order contains duplicates") if errors: for error in errors: print(error) print("OPERATIONAL_REPORT_CONTRACT_FAIL") return 1 print("OPERATIONAL_REPORT_CONTRACT_OK") return 0 if __name__ == "__main__": raise SystemExit(main())