1
1
"""Evaluators."""
2
2
import re
3
- from typing import Any , Mapping , Dict , Tuple
3
+ from typing import Any , Mapping , Dict , Tuple , List
4
4
from deepdiff import DeepDiff
5
5
from .utils .diff_helpers import get_diff_iterables_items , fix_deepdiff_key_names
6
6
from .operator import Operator
@@ -36,7 +36,7 @@ def diff_generator(pre_result: Any, post_result: Any) -> Dict:
36
36
return fix_deepdiff_key_names (result )
37
37
38
38
39
- def parameter_evaluator (values : Mapping , parameters : Mapping , mode : str ) -> Dict :
39
+ def parameter_evaluator (values : List [ Dict ] , parameters : Mapping , mode : str ) -> Dict :
40
40
"""Parameter Match evaluator engine.
41
41
42
42
Args:
@@ -51,41 +51,41 @@ def parameter_evaluator(values: Mapping, parameters: Mapping, mode: str) -> Dict
51
51
Dictionary with all the items that have some value not matching the expectations from parameters
52
52
"""
53
53
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." )
55
55
56
56
result = {}
57
- for value in values :
57
+ for index , value in enumerate ( values ) :
58
58
# value: {'7.7.7.7': {'peerAddress': '7.7.7.7', 'localAsn': '65130.1101', 'linkType': 'externals
59
59
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 )} " )
64
61
65
62
result_item = {}
66
63
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
72
72
73
73
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 ]
78
78
79
79
if result_item :
80
80
result [inner_key ] = result_item
81
81
82
82
return result
83
83
84
84
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 :
86
86
"""Regex Match evaluator engine."""
87
87
# values: [{'7.7.7.7': {'peerGroup': 'EVPN-OVERLAY-SPINE'}}]
88
- # parameter: {'regex': '.*UNDERLAY.*', 'mode': 'include '}
88
+ # parameter: {'regex': '.*UNDERLAY.*', 'mode': 'match '}
89
89
result = {}
90
90
if not isinstance (values , list ):
91
91
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:
94
94
for founded_value in item .values ():
95
95
for value in founded_value .values ():
96
96
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
98
98
if mode == "match" and not match_result :
99
99
result .update (item )
100
- # Fail if there is regex match
100
+ # Fail if there is regex match for "no-match" mode.
101
101
elif mode == "no-match" and match_result :
102
102
result .update (item )
103
103
0 commit comments