diff-district.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import json, os, sys
  2. OUT = '.scratch/cockpit-real-data-wayfinding/verify/artifacts/t67'
  3. names = ["map-snapshot","infra-base-archives","infra-operating","infra-management","infra-emergency",
  4. "mon-overview","mon-distribution","mon-situation","ev-current","ev-history","ev-efficiency",
  5. "ev-analysis","ov-monitoring","ov-warning-settings","work-orders"]
  6. variants = ["none","d0","d1","dun","d99"]
  7. def load(n, v):
  8. p = os.path.join(OUT, f"v2-{n}-{v}.json")
  9. try:
  10. with open(p, encoding='utf-8') as f:
  11. return json.load(f)
  12. except Exception as e:
  13. return {"__load_error__": str(e)}
  14. def walk(a, b, path="", out=None, limit=400):
  15. if out is None: out = []
  16. if len(out) >= limit: return out
  17. if type(a) != type(b):
  18. out.append((path, repr(a)[:60], repr(b)[:60])); return out
  19. if isinstance(a, dict):
  20. for k in sorted(set(a) | set(b)):
  21. if k not in a: out.append((path+"/"+k, "<absent>", repr(b[k])[:60])); continue
  22. if k not in b: out.append((path+"/"+k, repr(a[k])[:60], "<absent>")); continue
  23. walk(a[k], b[k], path+"/"+k, out, limit)
  24. elif isinstance(a, list):
  25. if len(a) != len(b):
  26. out.append((path+"/len", str(len(a)), str(len(b))))
  27. for i in range(min(len(a), len(b))):
  28. walk(a[i], b[i], path+f"[{i}]", out, limit)
  29. else:
  30. if a != b: out.append((path, repr(a)[:60], repr(b)[:60]))
  31. return out
  32. for n in names:
  33. print("="*100)
  34. print(n)
  35. for v in variants[1:]:
  36. a = load(n,"none"); b = load(n,v)
  37. if "__load_error__" in b:
  38. print(f" none vs {v}: LOAD ERROR {b['__load_error__']}"); continue
  39. d = walk(a,b)
  40. print(f" none vs {v}: {len(d)} diff(s)")
  41. for p,x,y in d[:12]:
  42. print(f" {p}: {x} -> {y}")