103 lines
3.1 KiB
Python
Executable File
103 lines
3.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from known_issues import default_known_issues_path
|
|
|
|
|
|
def parse_args() -> argparse.Namespace:
|
|
parser = argparse.ArgumentParser(
|
|
description="Run the scenario validators with the shared runtime known-issues baseline."
|
|
)
|
|
parser.add_argument(
|
|
"--runtime-root",
|
|
type=Path,
|
|
required=True,
|
|
help="Client runtime root containing assets/.",
|
|
)
|
|
parser.add_argument(
|
|
"--known-issues",
|
|
type=Path,
|
|
default=None,
|
|
help="Optional known issues baseline JSON. Defaults to repo known_issues/runtime_known_issues.json.",
|
|
)
|
|
parser.add_argument(
|
|
"--strict-known-issues",
|
|
action="store_true",
|
|
help="Fail when the known-issues baseline contains stale entries not observed anymore.",
|
|
)
|
|
parser.add_argument(
|
|
"--json",
|
|
action="store_true",
|
|
help="Emit JSON output.",
|
|
)
|
|
return parser.parse_args()
|
|
|
|
|
|
def run_validator(script_path: Path, runtime_root: Path, known_issues: Path, strict_known_issues: bool) -> dict:
|
|
cmd = [
|
|
sys.executable,
|
|
str(script_path),
|
|
"--runtime-root",
|
|
str(runtime_root),
|
|
"--known-issues",
|
|
str(known_issues),
|
|
"--json",
|
|
]
|
|
if strict_known_issues:
|
|
cmd.append("--strict-known-issues")
|
|
completed = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
|
if completed.returncode not in (0, 1):
|
|
raise RuntimeError(
|
|
f"{script_path.name} failed unexpectedly with rc={completed.returncode}: {completed.stderr or completed.stdout}"
|
|
)
|
|
return json.loads(completed.stdout)
|
|
|
|
|
|
def main() -> int:
|
|
args = parse_args()
|
|
runtime_root = args.runtime_root.resolve()
|
|
known_issues = (args.known_issues.resolve() if args.known_issues else default_known_issues_path(__file__))
|
|
|
|
script_dir = Path(__file__).resolve().parent
|
|
validators = {
|
|
"world": script_dir / "validate_runtime_scenarios.py",
|
|
"actor": script_dir / "validate_actor_scenarios.py",
|
|
"effect": script_dir / "validate_effect_scenarios.py",
|
|
"audio": script_dir / "validate_audio_scenarios.py",
|
|
}
|
|
|
|
results = {
|
|
name: run_validator(script_path, runtime_root, known_issues, args.strict_known_issues)
|
|
for name, script_path in validators.items()
|
|
}
|
|
ok = all(result["ok"] for result in results.values())
|
|
|
|
summary = {
|
|
"ok": ok,
|
|
"runtime_root": str(runtime_root),
|
|
"known_issues_path": str(known_issues),
|
|
"validators": results,
|
|
}
|
|
|
|
if args.json:
|
|
print(json.dumps(summary, indent=2))
|
|
else:
|
|
print(f"ok={ok}")
|
|
for name, result in results.items():
|
|
print(
|
|
f"{name}: ok={result['ok']} unexpected={len(result.get('unexpected_issue_ids', []))} "
|
|
f"known={len(result.get('known_issue_ids', []))} stale={len(result.get('stale_known_issue_ids', []))}"
|
|
)
|
|
|
|
return 0 if ok else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|