MCPcopy Create free account
hub / github.com/URLab-Sim/UnrealRoboticsLab / diff_schemas

Function diff_schemas

Scripts/diff_schema.py:47–114  ·  view source on GitHub ↗

Diff two schema snapshots. Returns structured diff.

(old: dict, new: dict)

Source from the content-addressed store, hash-verified

45
46
47def diff_schemas(old: dict, new: dict) -> dict:
48 """Diff two schema snapshots. Returns structured diff."""
49 results = {"added_elements": [], "removed_elements": [], "attribute_changes": []}
50
51 old_keys = set(k for k in old if not k.startswith("_"))
52 new_keys = set(k for k in new if not k.startswith("_"))
53
54 # Top-level element additions/removals
55 for elem in sorted(new_keys - old_keys):
56 results["added_elements"].append(elem)
57 for elem in sorted(old_keys - new_keys):
58 results["removed_elements"].append(elem)
59
60 # Attribute-level diffs for shared elements
61 for elem in sorted(old_keys & new_keys):
62 old_elem = old[elem]
63 new_elem = new[elem]
64
65 if isinstance(old_elem, dict) and isinstance(new_elem, dict):
66 # Check "attrs" key
67 if "attrs" in old_elem and "attrs" in new_elem:
68 added, removed = diff_lists(old_elem["attrs"], new_elem["attrs"])
69 if added or removed:
70 results["attribute_changes"].append({
71 "element": elem,
72 "field": "attrs",
73 "added": added,
74 "removed": removed
75 })
76
77 # Check nested dicts (e.g., actuator_types, equality, etc.)
78 for key in set(list(old_elem.keys()) + list(new_elem.keys())):
79 if key in ("attrs", "children", "wrap_types", "targets"):
80 continue
81 old_val = old_elem.get(key, [])
82 new_val = new_elem.get(key, [])
83 if isinstance(old_val, list) and isinstance(new_val, list):
84 added, removed = diff_lists(old_val, new_val)
85 if added or removed:
86 results["attribute_changes"].append({
87 "element": f"{elem}.{key}",
88 "field": "attrs",
89 "added": added,
90 "removed": removed
91 })
92
93 # Check "children" key
94 if "children" in old_elem and "children" in new_elem:
95 added, removed = diff_lists(old_elem["children"], new_elem["children"])
96 if added or removed:
97 results["attribute_changes"].append({
98 "element": elem,
99 "field": "children",
100 "added": added,
101 "removed": removed
102 })
103
104 elif isinstance(old_elem, list) and isinstance(new_elem, list):

Callers 1

mainFunction · 0.85

Calls 1

diff_listsFunction · 0.85

Tested by

no test coverage detected