towishy_Owen-Graphite/dev/scripts/diff_effective_snapshot.py
2026-05-18 15:13:45 +09:00

49 lines
No EOL
1.8 KiB
Python

#!/usr/bin/env python3
"""Diff two effective snapshot JSON files."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("baseline", type=Path)
parser.add_argument("candidate", type=Path)
parser.add_argument("--limit", type=int, default=200)
args = parser.parse_args()
baseline = json.loads(args.baseline.read_text(encoding="utf-8"))
candidate = json.loads(args.candidate.read_text(encoding="utf-8"))
failures: list[str] = []
b_targets = baseline.get("targets", {})
c_targets = candidate.get("targets", {})
for target in sorted(set(b_targets) | set(c_targets)):
if target not in b_targets:
failures.append(f"EXTRA target {target}")
continue
if target not in c_targets:
failures.append(f"MISSING target {target}")
continue
for part in ("element", "before", "after"):
b_part = b_targets[target].get(part, {})
c_part = c_targets[target].get(part, {})
for prop in sorted(set(b_part) | set(c_part)):
if prop == "__tokens":
continue
if b_part.get(prop) != c_part.get(prop):
failures.append(f"{target}.{part}.{prop}: {b_part.get(prop)!r} != {c_part.get(prop)!r}")
if failures:
print(f"DIFF: {len(failures)} effective snapshot differences")
for failure in failures[: args.limit]:
print(f" - {failure}")
if len(failures) > args.limit:
print(f" ... (+{len(failures) - args.limit} more)")
return 1
print("OK: effective snapshots match")
return 0
if __name__ == "__main__":
raise SystemExit(main())