Skip to content

Commit

Permalink
Only swap i and j when reporting items moved if using iterable_compar…
Browse files Browse the repository at this point in the history
…e_func.

Fix unittests to represent the branching deeper
  • Loading branch information
dtorres-sf committed Aug 6, 2024
1 parent 80de733 commit 33def72
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 13 deletions.
28 changes: 17 additions & 11 deletions deepdiff/diff.py
Original file line number Diff line number Diff line change
Expand Up @@ -840,13 +840,15 @@ def _diff_by_forming_pairs_and_comparing_one_by_one(
if self._count_diff() is StopIteration:
return # pragma: no cover. This is already covered for addition.

reference_param1 = i
reference_param2 = j
if y is ListItemRemovedOrAdded: # item removed completely
change_level = level.branch_deeper(
x,
notpresent,
child_relationship_class=child_relationship_class,
child_relationship_param=i,
child_relationship_param2=j,
child_relationship_param=reference_param1,
child_relationship_param2=reference_param2,
)
self._report_result('iterable_item_removed', change_level, local_tree=local_tree)

Expand All @@ -855,8 +857,8 @@ def _diff_by_forming_pairs_and_comparing_one_by_one(
notpresent,
y,
child_relationship_class=child_relationship_class,
child_relationship_param=i,
child_relationship_param2=j,
child_relationship_param=reference_param1,
child_relationship_param2=reference_param2,
)
self._report_result('iterable_item_added', change_level, local_tree=local_tree)

Expand All @@ -868,26 +870,30 @@ def _diff_by_forming_pairs_and_comparing_one_by_one(
x,
y,
child_relationship_class=child_relationship_class,
child_relationship_param=i,
child_relationship_param2=j
child_relationship_param=reference_param1,
child_relationship_param2=reference_param2
)
self._report_result('iterable_item_moved', change_level, local_tree=local_tree)

if self.iterable_compare_func:
# Intentionally setting j as the first child relationship param in cases of a moved item.
# If the item was moved using an iterable_compare_func then we want to make sure that the index
# is relative to t2.
reference_param1 = j
reference_param2 = i

item_id = id(x)
if parents_ids and item_id in parents_ids:
continue
parents_ids_added = add_to_frozen_set(parents_ids, item_id)

# Go one level deeper
# Intentionally setting j as the first child relationship param in cases of a moved item.
# If the item was moved using an iterable_compare_func then we want to make sure that the index
# is relative to t2.
next_level = level.branch_deeper(
x,
y,
child_relationship_class=child_relationship_class,
child_relationship_param=j,
child_relationship_param2=i
child_relationship_param=reference_param1,
child_relationship_param2=reference_param2
)
self._diff(next_level, parents_ids_added, local_tree=local_tree)

Expand Down
25 changes: 23 additions & 2 deletions tests/test_delta.py
Original file line number Diff line number Diff line change
Expand Up @@ -1879,7 +1879,14 @@ def test_compare_func_with_duplicates_removed(self):
"val": 3
}
}
}
},
'values_changed': {
"root[2]['val']": {
'new_value': 3,
'old_value': 1,
'new_path': "root[0]['val']"
}
},
}
assert expected == ddiff
delta = Delta(ddiff)
Expand All @@ -1888,6 +1895,7 @@ def test_compare_func_with_duplicates_removed(self):

flat_result = delta.to_flat_rows()
flat_expected = [
{'path': [2, 'val'], 'value': 3, 'action': 'values_changed', 'type': int, 'new_path': [0, 'val']},
{'path': [2], 'value': {'id': 1, 'val': 3}, 'action': 'iterable_item_removed', 'type': dict},
{'path': [0], 'value': {'id': 1, 'val': 3}, 'action': 'iterable_item_removed', 'type': dict},
{'path': [3], 'value': {'id': 3, 'val': 3}, 'action': 'iterable_item_removed', 'type': dict},
Expand Down Expand Up @@ -1930,6 +1938,12 @@ def test_compare_func_with_duplicates_removed(self):
'val': 3
}
}
},
'values_changed': {
"root[2]['val']": {
'new_value': 3,
'new_path': "root[0]['val']"
}
}
}
assert expected_delta_dict == delta_again.diff
Expand Down Expand Up @@ -1961,7 +1975,14 @@ def test_compare_func_with_duplicates_added(self):
'val': 1
}
}
}
},
'values_changed': {
"root[0]['val']": {
'new_value': 1,
'old_value': 3,
'new_path': "root[2]['val']"
}
},
}
assert expected == ddiff
delta = Delta(ddiff)
Expand Down

0 comments on commit 33def72

Please sign in to comment.