|
4 | 4 | from importlib.util import find_spec |
5 | 5 | from typing import Any, Dict |
6 | 6 |
|
| 7 | +from deepdiff.model import TextResult, TreeResult |
| 8 | + |
| 9 | + |
7 | 10 | if os.name == "nt" and find_spec("colorama"): |
8 | 11 | import colorama |
9 | 12 |
|
|
19 | 22 | class ColoredView: |
20 | 23 | """A view that shows JSON with color-coded differences.""" |
21 | 24 |
|
22 | | - def __init__(self, t2, tree_results, verbose_level=1, compact=False): |
| 25 | + def __init__(self, t2: Any, tree_result: TreeResult, compact: bool = False): |
23 | 26 | self.t2 = t2 |
24 | | - self.tree = tree_results |
25 | | - self.verbose_level = verbose_level |
| 27 | + self.tree = tree_result |
26 | 28 | self.compact = compact |
27 | 29 | self.diff_paths = self._collect_diff_paths() |
28 | 30 |
|
29 | 31 | def _collect_diff_paths(self) -> Dict[str, str]: |
30 | 32 | """Collect all paths that have differences and their types.""" |
| 33 | + text_result = TextResult(tree_results=self.tree, verbose_level=2) |
31 | 34 | 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 |
33 | 38 | try: |
34 | | - iterator = iter(items) |
| 39 | + iter(items) |
35 | 40 | except TypeError: |
36 | 41 | 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) |
46 | 50 | return diff_paths |
47 | 51 |
|
48 | 52 | def _format_value(self, value: Any) -> str: |
@@ -112,14 +116,13 @@ def _colorize_json(self, obj: Any, path: str = 'root', indent: int = 0) -> str: |
112 | 116 | self._colorize_skip_paths.add(f"{path}[{index}]") |
113 | 117 |
|
114 | 118 | 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 |
123 | 126 | for value in removed_map.values(): |
124 | 127 | items.append(f'{next_indent}{RED}{self._format_value(value)}{RESET}') |
125 | 128 | return '[\n' + ',\n'.join(items) + f'\n{current_indent}' + ']' |
|
0 commit comments