You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
31 lines
971 B
Python
31 lines
971 B
Python
"""JSON Schema validator for parser event output."""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
from jsonschema import Draft202012Validator
|
|
|
|
_SCHEMA_PATH = Path(__file__).parent.parent / "schemas" / "parser_event.schema.json"
|
|
_SCHEMA: dict[str, Any] | None = None
|
|
|
|
|
|
def _get_schema() -> dict[str, Any]:
|
|
global _SCHEMA
|
|
if _SCHEMA is None:
|
|
_SCHEMA = json.loads(_SCHEMA_PATH.read_text())
|
|
return _SCHEMA
|
|
|
|
|
|
def validate_parser_output(data: dict[str, Any]) -> list[str]:
|
|
"""Validate parser output against schema. Returns list of error messages (empty = valid)."""
|
|
schema = _get_schema()
|
|
validator = Draft202012Validator(schema)
|
|
errors = sorted(validator.iter_errors(data), key=lambda e: list(e.path))
|
|
return [f"{'.'.join(str(p) for p in e.path) or 'root'}: {e.message}" for e in errors]
|
|
|
|
|
|
def is_valid(data: dict[str, Any]) -> bool:
|
|
return len(validate_parser_output(data)) == 0
|