| # -*- coding: utf-8 -*- | |
| """ | |
| validator_v2.py — 基于 jsonschema(draft2020-12) 的严格校验 | |
| validate_with_schema(ir, schema_path) -> (ok, issues, summary_msg) | |
| """ | |
| from __future__ import annotations | |
| from typing import Any, List, Tuple | |
| import json | |
| from jsonschema import Draft202012Validator | |
| from jsonschema.exceptions import best_match | |
| def _format_path(err) -> str: | |
| if not err.path: return "" | |
| return "/".join(str(p) for p in err.path) | |
| def validate_with_schema(ir: dict, schema_path: str) -> Tuple[bool, List[dict], str]: | |
| schema = json.loads(open(schema_path, "r", encoding="utf-8").read()) | |
| validator = Draft202012Validator(schema) | |
| errors = sorted(validator.iter_errors(ir), key=lambda e: list(e.path)) | |
| issues=[] | |
| for e in errors: | |
| issues.append({ | |
| "severity": "ERROR", | |
| "path": _format_path(e), | |
| "message": e.message | |
| }) | |
| ok = len(issues)==0 | |
| msg = f"Schema: {'OK' if ok else 'FAIL'}; issues={len(issues)}" | |
| return ok, issues, msg | |