39 lines
1.2 KiB
Python
39 lines
1.2 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""Validate railiance/app.toml against the railiance.app.v1 schema."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import json
|
||
|
|
import sys
|
||
|
|
import tomllib
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
ROOT = Path(__file__).resolve().parents[1]
|
||
|
|
CONTRACT = ROOT / "railiance" / "app.toml"
|
||
|
|
SCHEMA_CANDIDATES = [
|
||
|
|
Path.home() / "railiance-bootstrap" / "schemas" / "railiance-app.schema.json",
|
||
|
|
Path.home() / "railiance-cluster" / "schemas" / "railiance-app.schema.json",
|
||
|
|
]
|
||
|
|
|
||
|
|
|
||
|
|
def main() -> int:
|
||
|
|
schema_path = next((path for path in SCHEMA_CANDIDATES if path.exists()), None)
|
||
|
|
if schema_path is None:
|
||
|
|
print("railiance-app.schema.json not found in railiance-bootstrap or railiance-cluster", file=sys.stderr)
|
||
|
|
return 1
|
||
|
|
try:
|
||
|
|
import jsonschema
|
||
|
|
except ImportError:
|
||
|
|
print("python3-jsonschema is required to validate railiance/app.toml", file=sys.stderr)
|
||
|
|
return 1
|
||
|
|
|
||
|
|
document = tomllib.loads(CONTRACT.read_text())
|
||
|
|
schema = json.loads(schema_path.read_text())
|
||
|
|
jsonschema.validate(document, schema)
|
||
|
|
print(f"valid {CONTRACT.relative_to(ROOT)} against {schema_path}")
|
||
|
|
return 0
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
raise SystemExit(main())
|