Skip to content

Commit 21428e8

Browse files
pszulczewskiPatryk Szulczewski
and
Patryk Szulczewski
authored
Fix parameter_match check, to support non-normalized data (#90)
* Fix parameter_match check, to support non-normalized data * Add test * Update tests. * remove test print Co-authored-by: Patryk Szulczewski <[email protected]>
1 parent afa094d commit 21428e8

8 files changed

+114
-147
lines changed

jdiff/check_types.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""CheckType Implementation."""
2-
from typing import Mapping, Tuple, Dict, Any, Union
2+
from typing import List, Tuple, Dict, Any, Union
33
from abc import ABC, abstractmethod
44
from .evaluators import diff_generator, parameter_evaluator, regex_evaluator, operator_evaluator
55

@@ -136,7 +136,7 @@ def _validate(params, mode) -> None: # type: ignore[override]
136136
f"'mode' argument should be one of the following: {', '.join(mode_options)}. You have: {mode}"
137137
)
138138

139-
def evaluate(self, params: Dict, value_to_compare: Mapping, mode: str) -> Tuple[Dict, bool]: # type: ignore[override]
139+
def evaluate(self, params: Dict, value_to_compare: List[Dict], mode: str) -> Tuple[Dict, bool]: # type: ignore[override]
140140
"""Parameter Match evaluator implementation."""
141141
self._validate(params=params, mode=mode)
142142
# TODO: we don't use the mode?
@@ -161,7 +161,7 @@ def _validate(regex, mode) -> None: # type: ignore[override]
161161
if mode not in mode_options:
162162
raise ValueError(f"'mode' argument should be {mode_options}. You have: {mode}")
163163

164-
def evaluate(self, regex: str, value_to_compare: Mapping, mode: str) -> Tuple[Dict, bool]: # type: ignore[override]
164+
def evaluate(self, regex: str, value_to_compare: List[Dict[Any, Dict]], mode: str) -> Tuple[Dict, bool]: # type: ignore[override]
165165
"""Regex Match evaluator implementation."""
166166
self._validate(regex=regex, mode=mode)
167167
evaluation_result = regex_evaluator(value_to_compare, regex, mode)

jdiff/evaluators.py

+21-21
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Evaluators."""
22
import re
3-
from typing import Any, Mapping, Dict, Tuple
3+
from typing import Any, Mapping, Dict, Tuple, List
44
from deepdiff import DeepDiff
55
from .utils.diff_helpers import get_diff_iterables_items, fix_deepdiff_key_names
66
from .operator import Operator
@@ -36,7 +36,7 @@ def diff_generator(pre_result: Any, post_result: Any) -> Dict:
3636
return fix_deepdiff_key_names(result)
3737

3838

39-
def parameter_evaluator(values: Mapping, parameters: Mapping, mode: str) -> Dict:
39+
def parameter_evaluator(values: List[Dict], parameters: Mapping, mode: str) -> Dict:
4040
"""Parameter Match evaluator engine.
4141
4242
Args:
@@ -51,41 +51,41 @@ def parameter_evaluator(values: Mapping, parameters: Mapping, mode: str) -> Dict
5151
Dictionary with all the items that have some value not matching the expectations from parameters
5252
"""
5353
if not isinstance(values, list):
54-
raise TypeError("Something went wrong during jmespath parsing. 'values' must be of type List.")
54+
raise TypeError("'values' must be of type List.")
5555

5656
result = {}
57-
for value in values:
57+
for index, value in enumerate(values):
5858
# value: {'7.7.7.7': {'peerAddress': '7.7.7.7', 'localAsn': '65130.1101', 'linkType': 'externals
5959
if not isinstance(value, dict):
60-
raise TypeError(
61-
"Something went wrong during jmespath parsing. ",
62-
f"'value' ({value}) must be of type Dict, and it's {type(value)}",
63-
)
60+
raise TypeError(f"'value' ({value}) must be of type Dict, and it's {type(value)}")
6461

6562
result_item = {}
6663

67-
# TODO: Why the 'value' dict has always ONE single element? we have to explain
68-
# inner_key: '7.7.7.7'
69-
inner_key = list(value.keys())[0]
70-
# inner_value: [{'peerAddress': '7.7.7.7', 'localAsn': '65130.1101', 'linkType': 'externals'}]
71-
inner_value = list(value.values())[0]
64+
# When data has been normalized with $key$, get inner key and value
65+
if len(value) == 1:
66+
# inner_key: '7.7.7.7'
67+
inner_key = list(value.keys())[0]
68+
# inner_value: [{'peerAddress': '7.7.7.7', 'localAsn': '65130.1101', 'linkType': 'externals'}]
69+
value = list(value.values())[0]
70+
else:
71+
inner_key = index
7272

7373
for parameter_key, parameter_value in parameters.items():
74-
if mode == "match" and inner_value[parameter_key] != parameter_value:
75-
result_item[parameter_key] = inner_value[parameter_key]
76-
elif mode == "no-match" and inner_value[parameter_key] == parameter_value:
77-
result_item[parameter_key] = inner_value[parameter_key]
74+
if mode == "match" and value[parameter_key] != parameter_value:
75+
result_item[parameter_key] = value[parameter_key]
76+
elif mode == "no-match" and value[parameter_key] == parameter_value:
77+
result_item[parameter_key] = value[parameter_key]
7878

7979
if result_item:
8080
result[inner_key] = result_item
8181

8282
return result
8383

8484

85-
def regex_evaluator(values: Mapping, regex_expression: str, mode: str) -> Dict:
85+
def regex_evaluator(values: List[Dict[Any, Dict]], regex_expression: str, mode: str) -> Dict:
8686
"""Regex Match evaluator engine."""
8787
# values: [{'7.7.7.7': {'peerGroup': 'EVPN-OVERLAY-SPINE'}}]
88-
# parameter: {'regex': '.*UNDERLAY.*', 'mode': 'include'}
88+
# parameter: {'regex': '.*UNDERLAY.*', 'mode': 'match'}
8989
result = {}
9090
if not isinstance(values, list):
9191
raise TypeError("Something went wrong during JMSPath parsing. 'values' must be of type List.")
@@ -94,10 +94,10 @@ def regex_evaluator(values: Mapping, regex_expression: str, mode: str) -> Dict:
9494
for founded_value in item.values():
9595
for value in founded_value.values():
9696
match_result = re.search(regex_expression, value)
97-
# Fail if there is not regex match
97+
# Fail if there is no regex match for "match" mode
9898
if mode == "match" and not match_result:
9999
result.update(item)
100-
# Fail if there is regex match
100+
# Fail if there is regex match for "no-match" mode.
101101
elif mode == "no-match" and match_result:
102102
result.update(item)
103103

0 commit comments

Comments
 (0)