textmachine/backend/docs/chapter_structure_shiftmap.py

29 lines
1.3 KiB
Python

#!/usr/bin/env python3
"""Машинная карта сдвигов, заказанная §2.5: set-diff по id и номеру, same/moved/gone/new."""
import json, sys
def load(p):
m = json.load(open(p, encoding="utf-8"))
return {c["id"]: c["number"] for c in m["chapters"]}, m
def diff(before_path, after_path, source):
a, ma = load(before_path)
b, mb = load(after_path)
same = sorted(i for i in a if i in b and a[i] == b[i])
moved = sorted(i for i in a if i in b and a[i] != b[i])
gone = sorted(i for i in a if i not in b)
new = sorted(i for i in b if i not in a)
return {
"source": source,
"before": {"chapters": len(a), "structure": ma.get("structure"), "key": ma.get("key")},
"after": {"chapters": len(b), "structure": mb.get("structure"), "key": mb.get("key")},
"same": len(same), "moved": len(moved), "gone": len(gone), "new": len(new),
"moved_detail": [{"id": i, "from": a[i], "to": b[i]} for i in moved][:200],
"gone_ids": gone[:200], "new_ids": new[:200],
"cut_unchanged": not moved and not gone and not new,
}
if __name__ == "__main__":
out = [diff(*t) for t in (sys.argv[1:][i:i+3] for i in range(0, len(sys.argv)-1, 3))]
json.dump(out, sys.stdout, ensure_ascii=False, indent=1)
print()