29 lines
1.3 KiB
Python
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()
|