Skip to content

Commit c464e04

Browse files
committed
fixes accessing the affected_root_keys property on the diff object returned by DeepDiff fails when one of the dicts is empty #508
1 parent 42fd42d commit c464e04

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

deepdiff/diff.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -1846,9 +1846,13 @@ def affected_root_keys(self):
18461846
value = self.tree.get(key)
18471847
if value:
18481848
if isinstance(value, SetOrdered):
1849-
result |= SetOrdered([i.get_root_key() for i in value])
1849+
values_list = value
18501850
else:
1851-
result |= SetOrdered([i.get_root_key() for i in value.keys()])
1851+
values_list = value.keys()
1852+
for item in values_list:
1853+
root_key = item.get_root_key()
1854+
if root_key is not notpresent:
1855+
result.add(root_key)
18521856
return result
18531857

18541858

deepdiff/model.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,9 @@ def get_root_key(self, use_t2=False):
665665
else:
666666
next_rel = root_level.t1_child_rel or root_level.t2_child_rel # next relationship object to get a formatted param from
667667

668-
return next_rel.param
668+
if next_rel:
669+
return next_rel.param
670+
return notpresent
669671

670672
def path(self, root="root", force=None, get_parent_too=False, use_t2=False, output_format='str'):
671673
"""

tests/test_diff_text.py

+25
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,24 @@ class ClassB:
807807
result = {'attribute_removed': ['root.y']}
808808
assert result == ddiff
809809

810+
def test_custom_objects_slot_in_group_change(self):
811+
class ClassA:
812+
__slots__ = ('x', 'y')
813+
814+
def __init__(self, x, y):
815+
self.x = x
816+
self.y = y
817+
818+
class ClassB(ClassA):
819+
pass
820+
821+
t1 = ClassA(1, 1)
822+
t2 = ClassB(1, 1)
823+
ddiff = DeepDiff(t1, t2, ignore_type_in_groups=[(ClassA, ClassB)])
824+
result = {}
825+
assert result == ddiff
826+
827+
810828
def test_custom_class_changes_none_when_ignore_type(self):
811829
ddiff1 = DeepDiff({'a': None}, {'a': 1}, ignore_type_subclasses=True, ignore_type_in_groups=[(int, float)])
812830
result = {
@@ -2226,3 +2244,10 @@ def test_group_by_with_none_key_and_ignore_case(self):
22262244
}
22272245
}
22282246
assert expected == diff
2247+
2248+
def test_affected_root_keys_when_dict_empty(self):
2249+
diff = DeepDiff({}, {1:1, 2:2}, threshold_to_diff_deeper=0)
2250+
assert [1, 2] == diff.affected_root_keys
2251+
2252+
diff2 = DeepDiff({}, {1:1, 2:2})
2253+
assert [] == diff2.affected_root_keys

0 commit comments

Comments
 (0)