Skip to content

Commit bce6343

Browse files
committed
Fix array bugs
1 parent 82f890c commit bce6343

File tree

4 files changed

+58
-25
lines changed

4 files changed

+58
-25
lines changed

deepdiff/colored_view.py

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
from importlib.util import find_spec
55
from typing import Any, Dict
66

7+
from deepdiff.model import TextResult, TreeResult
8+
9+
710
if os.name == "nt" and find_spec("colorama"):
811
import colorama
912

@@ -19,30 +22,31 @@
1922
class ColoredView:
2023
"""A view that shows JSON with color-coded differences."""
2124

22-
def __init__(self, t2, tree_results, verbose_level=1, compact=False):
25+
def __init__(self, t2: Any, tree_result: TreeResult, compact: bool = False):
2326
self.t2 = t2
24-
self.tree = tree_results
25-
self.verbose_level = verbose_level
27+
self.tree = tree_result
2628
self.compact = compact
2729
self.diff_paths = self._collect_diff_paths()
2830

2931
def _collect_diff_paths(self) -> Dict[str, str]:
3032
"""Collect all paths that have differences and their types."""
33+
text_result = TextResult(tree_results=self.tree, verbose_level=2)
3134
diff_paths = {}
32-
for diff_type, items in self.tree.items():
35+
for diff_type, items in text_result.items():
36+
if not items:
37+
continue
3338
try:
34-
iterator = iter(items)
39+
iter(items)
3540
except TypeError:
3641
continue
37-
for item in items:
38-
if type(item).__name__ == "DiffLevel":
39-
path = item.path()
40-
if diff_type in ('values_changed', 'type_changes'):
41-
diff_paths[path] = ('changed', item.t1, item.t2)
42-
elif diff_type in ('dictionary_item_added', 'iterable_item_added', 'set_item_added'):
43-
diff_paths[path] = ('added', None, item.t2)
44-
elif diff_type in ('dictionary_item_removed', 'iterable_item_removed', 'set_item_removed'):
45-
diff_paths[path] = ('removed', item.t1, None)
42+
for path, item in items.items():
43+
if diff_type in ("values_changed", "type_changes"):
44+
changed_path = item.get("new_path") or path
45+
diff_paths[changed_path] = ("changed", item["old_value"], item["new_value"])
46+
elif diff_type in ("dictionary_item_added", "iterable_item_added", "set_item_added"):
47+
diff_paths[path] = ("added", None, item)
48+
elif diff_type in ("dictionary_item_removed", "iterable_item_removed", "set_item_removed"):
49+
diff_paths[path] = ("removed", item, None)
4650
return diff_paths
4751

4852
def _format_value(self, value: Any) -> str:
@@ -112,14 +116,13 @@ def _colorize_json(self, obj: Any, path: str = 'root', indent: int = 0) -> str:
112116
self._colorize_skip_paths.add(f"{path}[{index}]")
113117

114118
items = []
115-
index = 0
116-
for value in obj:
117-
new_path = f"{path}[{index}]"
118-
while index == next(iter(removed_map), None):
119-
items.append(f'{next_indent}{RED}{self._format_value(removed_map.pop(index))}{RESET}')
120-
index += 1
121-
items.append(f'{next_indent}{self._colorize_json(value, new_path, indent + 1)}')
122-
index += 1
119+
remove_index = 0
120+
for index, value in enumerate(obj):
121+
while remove_index == next(iter(removed_map), None):
122+
items.append(f'{next_indent}{RED}{self._format_value(removed_map.pop(remove_index))}{RESET}')
123+
remove_index += 1
124+
items.append(f'{next_indent}{self._colorize_json(value, f"{path}[{index}]", indent + 1)}')
125+
remove_index += 1
123126
for value in removed_map.values():
124127
items.append(f'{next_indent}{RED}{self._format_value(value)}{RESET}')
125128
return '[\n' + ',\n'.join(items) + f'\n{current_indent}' + ']'

deepdiff/commands.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def cli():
5454
@click.option('--significant-digits', required=False, default=None, type=int, show_default=True)
5555
@click.option('--truncate-datetime', required=False, type=click.Choice(['second', 'minute', 'hour', 'day'], case_sensitive=True), show_default=True, default=None)
5656
@click.option('--verbose-level', required=False, default=1, type=click.IntRange(0, 2), show_default=True)
57-
@click.option('--view', required=False, type=click.Choice(['tree', 'colored', 'colored_compact'], case_sensitive=True))
57+
@click.option('--view', required=False, type=click.Choice(['tree', 'colored', 'colored_compact'], case_sensitive=True), show_default=True, default='tree')
5858
@click.option('--debug', is_flag=True, show_default=False)
5959
def diff(
6060
*args, **kwargs

deepdiff/diff.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1766,9 +1766,9 @@ def _get_view_results(self, view):
17661766
elif view == DELTA_VIEW:
17671767
result = self._to_delta_dict(report_repetition_required=False)
17681768
elif view == COLORED_VIEW:
1769-
result = ColoredView(self.t2, tree_results=result, verbose_level=self.verbose_level)
1769+
result = ColoredView(t2=self.t2, tree_result=self.tree, compact=False)
17701770
elif view == COLORED_COMPACT_VIEW:
1771-
result = ColoredView(self.t2, tree_results=result, verbose_level=self.verbose_level, compact=True)
1771+
result = ColoredView(t2=self.t2, tree_result=self.tree, compact=True)
17721772
else:
17731773
raise ValueError(INVALID_VIEW_MSG.format(view))
17741774
return result

tests/test_colored_view.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,36 @@ def test_colored_view_list_no_changes_with_ignore_order():
183183
assert result == expected
184184

185185

186+
def test_colored_view_list_with_ignore_order():
187+
t1 = {
188+
"hobbies": [
189+
"reading",
190+
"hiking"
191+
]
192+
}
193+
194+
t2 = {
195+
"hobbies": [
196+
"hiking",
197+
"painting",
198+
"coding"
199+
]
200+
}
201+
202+
diff = DeepDiff(t1, t2, view=COLORED_VIEW, ignore_order=True)
203+
result = str(diff)
204+
205+
expected = f'''{{
206+
"hobbies": [
207+
{RED}"reading"{RESET},
208+
"hiking",
209+
{GREEN}"painting"{RESET},
210+
{GREEN}"coding"{RESET}
211+
]
212+
}}'''
213+
assert result == expected
214+
215+
186216
def test_colored_view_no_changes():
187217
t1 = {"a": 1, "b": 2}
188218
t2 = {"a": 1, "b": 2}

0 commit comments

Comments
 (0)