feat(mindmodel): add CLI wrapper, edge-case tests, and manifest schema tests
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
"""Command-line wrapper around src.validators.mindmodel_validator.validate_manifest
|
||||
|
||||
This tiny CLI loads a manifest and writes a structured JSON report to stdout
|
||||
and optionally to a file path. It is report-only: it never raises an error or
|
||||
changes exit code based on findings.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
|
||||
def _write_report(report: dict[str, Any], path: Path | None) -> None:
|
||||
text = json.dumps(report, indent=2, ensure_ascii=False)
|
||||
print(text)
|
||||
if path:
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
path.write_text(text, encoding="utf-8")
|
||||
|
||||
|
||||
def main(argv: list[str] | None = None) -> int:
|
||||
parser = argparse.ArgumentParser("validate_mindmodel")
|
||||
parser.add_argument("manifest", nargs="?", help="path to manifest file")
|
||||
parser.add_argument("--manifest", dest="manifest_opt", help="path to manifest file")
|
||||
parser.add_argument("--report", help="optional output report path")
|
||||
args = parser.parse_args(argv)
|
||||
|
||||
manifest = args.manifest_opt or args.manifest
|
||||
if not manifest:
|
||||
parser.error("manifest path is required (positional or --manifest)")
|
||||
|
||||
# import here to keep CLI tiny when unused
|
||||
try:
|
||||
from src.validators.mindmodel_validator import validate_manifest
|
||||
except Exception as e: # pragma: no cover - defensive
|
||||
print(f"Failed to import validator: {e}")
|
||||
return 0
|
||||
|
||||
try:
|
||||
report = validate_manifest(manifest, report_only=True)
|
||||
except Exception as e: # never fail the process
|
||||
report = {"error": str(e)}
|
||||
|
||||
report_path = Path(args.report) if args.report else None
|
||||
_write_report(report, report_path)
|
||||
|
||||
# always exit zero for report-only operation
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user