Skip to content

Commit 8fe8c1c

Browse files
authored
Merge pull request #187 from MKaras93/pretty-view
Pretty form
2 parents 12c8714 + 432cfca commit 8fe8c1c

File tree

2 files changed

+162
-0
lines changed

2 files changed

+162
-0
lines changed

deepdiff/diff.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -771,6 +771,42 @@ def to_delta_dict(self, directed=True):
771771

772772
return result
773773

774+
def pretty_form(self):
775+
result = []
776+
keys = sorted(self.tree.keys()) # sorting keys to guarantee constant order in Python<3.7
777+
for key in keys:
778+
for item_key in self.tree[key]:
779+
result += [pretty_print_diff(item_key)]
780+
781+
return '\n'.join(result)
782+
783+
784+
def pretty_print_diff(diff: DiffLevel):
785+
type_t1 = get_type(diff.t1).__name__
786+
type_t2 = get_type(diff.t2).__name__
787+
788+
val_t1 = '"{}"'.format(str(diff.t1)) if type_t1 == "str" else str(diff.t1)
789+
val_t2 = '"{}"'.format(str(diff.t2)) if type_t2 == "str" else str(diff.t2)
790+
791+
diff_path = diff.path(root='root')
792+
793+
texts = {
794+
"type_changes": "Type of {diff_path} changed from {type_t1} to {type_t2} and value changed from {val_t1} to {val_t2}.",
795+
"values_changed": "Value of {diff_path} changed from {val_t1} to {val_t2}.",
796+
"dictionary_item_added": "Item {diff_path} added to dictionary.",
797+
"dictionary_item_removed": "Item {diff_path} removed from dictionary.",
798+
"iterable_item_added": "Item {diff_path} added to iterable.",
799+
"iterable_item_removed": "Item {diff_path} removed from iterable.",
800+
"attribute_added": "Attribute {diff_path} added.",
801+
"attribute_removed": "Attribute {diff_path} removed.",
802+
"set_item_added": "Item root[{val_t2}] added to set.",
803+
"set_item_removed": "Item root[{val_t1}] removed from set.",
804+
"repetition_change": "Repetition change for item {diff_path}.",
805+
}
806+
807+
return texts.get(diff.report_type, "").format(diff_path=diff_path, type_t1=type_t1, type_t2=type_t2, val_t1=val_t1,
808+
val_t2=val_t2)
809+
774810

775811
if __name__ == "__main__": # pragma: no cover
776812
import doctest

tests/test_diff_tree.py

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/usr/bin/env python
22
import pytest
33
from deepdiff import DeepDiff
4+
from deepdiff.diff import pretty_print_diff
45
from deepdiff.helper import pypy3, notpresent
56
from deepdiff.model import DictRelationship, NonSubscriptableIterableRelationship
67

@@ -184,3 +185,128 @@ def test_adding_list_diff(self):
184185
ddiff = DeepDiff(t1, t2, view='tree')
185186
addition = ddiff + t1
186187
assert addition == t2
188+
189+
190+
class TestDeepDiffPrettyForm:
191+
"""Tests for pretty_form() method of DeepDiff"""
192+
193+
class TestingClass:
194+
one = 1
195+
196+
testing_class = TestingClass
197+
198+
@pytest.mark.parametrize('t1, t2, item_path, old_type, new_type, old_val_displayed, new_val_displayed',
199+
[
200+
[{2: 2, 4: 4}, {2: 'b', 4: 4}, 'root[2]', 'int', 'str', '2', '"b"'],
201+
[[1, 2, 3], [1, '2', 3], 'root[1]', 'int', 'str', '2', '"2"'],
202+
[[1, 2, 3], {1, 2, 3}, 'root', 'list', 'set', '[1, 2, 3]', '{1, 2, 3}']
203+
])
204+
def test_pretty_print_diff_type_changes(self, t1, t2, item_path, old_type, new_type, old_val_displayed,
205+
new_val_displayed):
206+
ddiff = DeepDiff(t1, t2, view='tree')
207+
result = pretty_print_diff(ddiff.tree['type_changes'].items[0])
208+
assert result == 'Type of {} changed from {} to {} and value changed from {} to {}.'.format(item_path, old_type, new_type, old_val_displayed, new_val_displayed)
209+
210+
@pytest.mark.parametrize('t1, t2, item_path',
211+
[
212+
[{2: 2, 4: 4}, {2: 2, 4: 4, 5: 5}, 'root[5]'],
213+
])
214+
def test_pretty_print_diff_dictionary_item_added(self, t1, t2, item_path):
215+
ddiff = DeepDiff(t1, t2, view='tree')
216+
result = pretty_print_diff(ddiff.tree['dictionary_item_added'].items[0])
217+
assert result == 'Item {} added to dictionary.'.format(item_path)
218+
219+
@pytest.mark.parametrize('t1, t2, item_path',
220+
[
221+
[{2: 2, 4: 4}, {2: 2}, 'root[4]'],
222+
])
223+
def test_pretty_print_diff_dictionary_item_removed(self, t1, t2, item_path):
224+
ddiff = DeepDiff(t1, t2, view='tree')
225+
result = pretty_print_diff(ddiff.tree['dictionary_item_removed'].items[0])
226+
assert result == 'Item {} removed from dictionary.'.format(item_path)
227+
228+
@pytest.mark.parametrize('t1, t2, item_path, old_val_displayed, new_val_displayed',
229+
[
230+
[{2: 2, 4: 4}, {2: 3, 4: 4}, 'root[2]', '2', '3'],
231+
[['a', 'b', 'c'], ['a', 'b', 'd'], 'root[2]', '"c"', '"d"']
232+
])
233+
def test_pretty_print_diff_values_changed(self, t1, t2, item_path, old_val_displayed, new_val_displayed):
234+
ddiff = DeepDiff(t1, t2, view='tree')
235+
result = pretty_print_diff(ddiff.tree['values_changed'].items[0])
236+
assert result == 'Value of {} changed from {} to {}.'.format(item_path, old_val_displayed, new_val_displayed)
237+
238+
@pytest.mark.parametrize('t1, t2, item_path',
239+
[
240+
[[1, 2, 3], [1, 2, 3, 4], 'root[3]'],
241+
])
242+
def test_pretty_print_diff_iterable_item_added(self, t1, t2, item_path):
243+
ddiff = DeepDiff(t1, t2, view='tree')
244+
result = pretty_print_diff(ddiff.tree['iterable_item_added'].items[0])
245+
assert result == 'Item {} added to iterable.'.format(item_path)
246+
247+
@pytest.mark.parametrize('t1, t2, item_path',
248+
[
249+
[[1, 2, 3], [1, 2], 'root[2]'],
250+
])
251+
def test_pretty_print_diff_iterable_item_removed(self, t1, t2, item_path):
252+
ddiff = DeepDiff(t1, t2, view='tree')
253+
result = pretty_print_diff(ddiff.tree['iterable_item_removed'].items[0])
254+
assert result == 'Item {} removed from iterable.'.format(item_path)
255+
256+
def test_pretty_print_diff_attribute_added(self):
257+
t1 = self.testing_class()
258+
t2 = self.testing_class()
259+
t2.two = 2
260+
261+
ddiff = DeepDiff(t1, t2, view='tree')
262+
result = pretty_print_diff(ddiff.tree['attribute_added'].items[0])
263+
assert result == 'Attribute root.two added.'
264+
265+
def test_pretty_print_diff_attribute_removed(self):
266+
t1 = self.testing_class()
267+
t1.two = 2
268+
t2 = self.testing_class()
269+
270+
ddiff = DeepDiff(t1, t2, view='tree')
271+
result = pretty_print_diff(ddiff.tree['attribute_removed'].items[0])
272+
assert result == 'Attribute root.two removed.'
273+
274+
@pytest.mark.parametrize('t1, t2, item_path',
275+
[
276+
[{1, 2}, {1, 2, 3}, 'root[3]'],
277+
])
278+
def test_pretty_print_diff_set_item_added(self, t1, t2, item_path):
279+
ddiff = DeepDiff(t1, t2, view='tree')
280+
result = pretty_print_diff(ddiff.tree['set_item_added'].items[0])
281+
assert result == 'Item {} added to set.'.format(item_path)
282+
283+
@pytest.mark.parametrize('t1, t2, item_path',
284+
[
285+
[{1, 2, 3}, {1, 2}, 'root[3]'],
286+
])
287+
def test_pretty_print_diff_set_item_removed(self, t1, t2, item_path):
288+
ddiff = DeepDiff(t1, t2, view='tree')
289+
result = pretty_print_diff(ddiff.tree['set_item_removed'].items[0])
290+
assert result == 'Item {} removed from set.'.format(item_path)
291+
292+
@pytest.mark.parametrize('t1, t2, item_path',
293+
[
294+
[[1, 2, 3, 2], [1, 2, 3], 'root[1]'],
295+
])
296+
def test_pretty_print_diff_repetition_change(self, t1, t2, item_path):
297+
ddiff = DeepDiff(t1, t2, view='tree', ignore_order=True, report_repetition=True)
298+
result = pretty_print_diff(ddiff.tree['repetition_change'].items[0])
299+
assert result == 'Repetition change for item {}.'.format(item_path)
300+
301+
def test_pretty_form_method(self):
302+
t1 = {2: 2, 3: 3, 4: 4}
303+
t2 = {2: 'b', 4: 5, 5: 5}
304+
ddiff = DeepDiff(t1, t2, view='tree')
305+
result = ddiff.pretty_form()
306+
expected = (
307+
'Item root[5] added to dictionary.'
308+
'\nItem root[3] removed from dictionary.'
309+
'\nType of root[2] changed from int to str and value changed from 2 to "b".'
310+
'\nValue of root[4] changed from 4 to 5.'
311+
)
312+
assert result == expected

0 commit comments

Comments
 (0)