Skip to content

Commit d711b4e

Browse files
committed
going down the ignore order
1 parent 42f88b6 commit d711b4e

File tree

3 files changed

+66
-5
lines changed

3 files changed

+66
-5
lines changed

deepdiff/delta.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from decimal import Decimal
55
from deepdiff import DeepDiff
66
from deepdiff.serialization import pickle_load
7-
from deepdiff.helper import py_current_version, strings
7+
from deepdiff.helper import py_current_version, strings, short_repr
88
from deepdiff.path import _path_to_elements, _get_nested_obj, GET, GETATTR
99

1010
MINIMUM_PY_FOR_DELTA = Decimal('3.6')
@@ -114,6 +114,9 @@ def __init__(self, diff=None, delta_path=None, mutate=False, verify_symmetry=Fal
114114
self.raise_errors = raise_errors
115115
self.log_errors = log_errors
116116

117+
def __repr__(self):
118+
return "<Delta: {}>".format(short_repr(self.diff, max_length=100))
119+
117120
def reset(self):
118121
self.post_process_paths_to_convert = {}
119122

@@ -127,13 +130,14 @@ def __add__(self, other):
127130
self._do_set_item_added()
128131
self._do_set_item_removed()
129132
self._do_type_changes()
133+
# NOTE: the remove iterable action needs to happen BEFORE
134+
# all the other iterables to match the reverse of order of operations in DeepDiff
135+
self._do_iterable_item_removed()
130136
self._do_iterable_item_added()
131137
self._do_dictionary_item_added()
132138
self._do_dictionary_item_removed()
133139
self._do_attribute_added()
134140
self._do_attribute_removed()
135-
# NOTE: the remove iterable action needs to happen AFTER all the other iterables.
136-
self._do_iterable_item_removed()
137141
self._do_post_process()
138142

139143
other = self.root
@@ -371,7 +375,6 @@ def _do_set_item(self, items, func):
371375
self._simple_set_elem_value(parent, path_for_err_reporting=path, elem=elem, value=new_value, action=action)
372376

373377

374-
375378
if __name__ == "__main__": # pragma: no cover
376379
import doctest
377380
doctest.testmod()

deepdiff/diff.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -771,7 +771,8 @@ def to_delta_dict(self, directed=True):
771771
for path, value in report_value.items():
772772
if isinstance(value, Mapping) and 'old_value' in value:
773773
del value['old_value']
774-
774+
if self.ignore_order:
775+
result['ignore_order'] = True
775776
return result
776777

777778

tests/test_delta.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,3 +380,60 @@ def test_delta_cases(self, t1, t2, deepdiff_kwargs, to_delta_kwargs, expected_de
380380
assert expected_delta_dict == delta_dict
381381
delta = Delta(diff, verify_symmetry=False, raise_errors=True)
382382
assert t1 + delta == t2
383+
384+
385+
DELTA_IGNORE_ORDER_CASES = [
386+
{
387+
't1': [1, 2, 'B', 3],
388+
't2': [1, 2, 3, 5],
389+
'deepdiff_kwargs': {
390+
'ignore_order': True,
391+
'report_repetition': True
392+
},
393+
'to_delta_kwargs': {},
394+
'expected_delta_dict': {
395+
'ignore_order': True,
396+
'iterable_item_added': {
397+
'root[3]': 5
398+
},
399+
'iterable_item_removed': {
400+
'root[2]': 'B'
401+
}
402+
},
403+
},
404+
{
405+
't1': [1, 2, 'B', 3, 'B', 'B', 4],
406+
't2': [1, 2, 3, 5],
407+
'deepdiff_kwargs': {
408+
'ignore_order': True,
409+
'report_repetition': False
410+
},
411+
'to_delta_kwargs': {},
412+
'expected_delta_dict': {
413+
'iterable_item_added': {
414+
'root[3]': 5
415+
},
416+
'iterable_item_removed': {
417+
'root[6]': 4,
418+
'root[2]': 'B'
419+
},
420+
'ignore_order': True
421+
},
422+
},
423+
]
424+
425+
426+
DELTA_IGNORE_ORDER_CASES_PARAMS = parameterize_cases(DELTA_IGNORE_ORDER_CASES)
427+
428+
429+
@pytest.mark.skipif(DISABLE_DELTA, reason=DELTA_SKIP_MSG)
430+
class TestIgnoreOrderDelta:
431+
432+
@pytest.mark.parametrize('t1, t2, deepdiff_kwargs, to_delta_kwargs, expected_delta_dict', DELTA_IGNORE_ORDER_CASES_PARAMS)
433+
def test_ignore_order_delta_cases(self, t1, t2, deepdiff_kwargs, to_delta_kwargs, expected_delta_dict):
434+
diff = DeepDiff(t1, t2, **deepdiff_kwargs)
435+
delta_dict = diff.to_delta_dict(**to_delta_kwargs)
436+
assert expected_delta_dict == delta_dict
437+
delta = Delta(diff, verify_symmetry=False, raise_errors=True)
438+
import pytest; pytest.set_trace()
439+
assert t1 + delta == t2

0 commit comments

Comments
 (0)