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())