File size: 1,676 Bytes
f6588d9 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | """Verify the complete model, runtime, and dependency-lock package."""
from __future__ import annotations
import argparse
import hashlib
import json
from pathlib import Path
from typing import Sequence
from .verify_model import verify_model
from .verify_runtime import verify_runtime
def _file_receipt(path: Path) -> dict[str, str | int]:
resolved = path.resolve(strict=True)
if not resolved.is_file():
raise RuntimeError(f"package artifact must be a regular file: {resolved}")
return {
"path": str(resolved),
"bytes": resolved.stat().st_size,
"sha256": hashlib.sha256(resolved.read_bytes()).hexdigest(),
}
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--model-root", type=Path, required=True)
parser.add_argument("--manifest", type=Path, required=True)
parser.add_argument("--requirements-direct", type=Path, required=True)
parser.add_argument("--requirements-lock", type=Path, required=True)
return parser
def main(argv: Sequence[str] | None = None) -> int:
args = build_parser().parse_args(argv)
report = {
"schema_version": "procedure.ep15_merged3225.package_verify.v1",
"status": "PASS",
"model": verify_model(args.model_root, args.manifest),
"runtime": verify_runtime(),
"requirements": {
"direct": _file_receipt(args.requirements_direct),
"lock": _file_receipt(args.requirements_lock),
},
}
print(json.dumps(report, ensure_ascii=False, sort_keys=True))
return 0
if __name__ == "__main__":
raise SystemExit(main())
|