packages feed

heni-0.1.0.0: scripts/check-schemas.py

"""Validate published JSON Schemas and real emitted fixtures (development only)."""
import argparse
import json
import sys
import os
from pathlib import Path
from jsonschema import Draft202012Validator

root = Path(__file__).resolve().parent.parent
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--corpus", type=Path, default=root / "heni-cli/test/corpus")
parser.add_argument("reports", nargs="*")
args = parser.parse_args()
assert args.corpus.is_dir(), "supply --corpus from the extracted heni-cli archive"
assert list(args.corpus.glob("*.json")), "manifest corpus is empty"

def unique_object(pairs):
    result = {}
    for key, value in pairs:
        if key in result:
            raise ValueError(f"duplicate JSON object key: {key}")
        result[key] = value
    return result

manifest_schema = json.loads((root / "schemas/manifest-v1.schema.json").read_text())
Draft202012Validator.check_schema(manifest_schema)
manifest_validator = Draft202012Validator(manifest_schema)
for path in args.corpus.glob("*.json"):
    try:
        value = json.loads(path.read_text(), object_pairs_hook=unique_object)
        valid = manifest_validator.is_valid(value)
    except ValueError:
        valid = False
    assert valid == path.name.startswith("valid-"), path.name
manifest_validator.validate(json.loads((root / "examples/minimal/heni.json").read_text()))
manifest_validator.validate(json.loads((root / "examples/standalone/target/heni.json").read_text()))
for path in (root / "examples/adapters").glob("*.json"):
    manifest_validator.validate(json.loads(path.read_text()))
for path in (root / "examples/migrations").glob("*/heni.json"):
    manifest_validator.validate(json.loads(path.read_text()))
schema = json.loads((root / "schemas/report-v1.schema.json").read_text())
Draft202012Validator.check_schema(schema)
validator = Draft202012Validator(schema)
for argument in args.reports:
    value = json.loads(Path(argument).read_text())
    validator.validate(value)
    invalid = dict(value, schemaVersion=999)
    assert not validator.is_valid(invalid), "unknown report version accepted"
    invalid = dict(value, unexpected=True)
    assert not validator.is_valid(invalid), "unknown report field accepted"
print("Manifest corpus, report schema and emitted fixtures passed")

evidence_schema = json.loads((root / "schemas/test-evidence-v1.schema.json").read_text())
Draft202012Validator.check_schema(evidence_schema)
evidence_validator = Draft202012Validator(evidence_schema)
if os.environ.get("HENI_SCHEMA_EVIDENCE"):
    for line in Path(os.environ["HENI_SCHEMA_EVIDENCE"]).read_text().splitlines():
        evidence_validator.validate(json.loads(line, object_pairs_hook=unique_object))
    print("Emitted test evidence schema passed")