11"""Evaluators."""
22import re
3- from typing import Any , Mapping , Dict , Tuple
3+ from typing import Any , Mapping , Dict , Tuple , List
44from deepdiff import DeepDiff
55from .utils .diff_helpers import get_diff_iterables_items , fix_deepdiff_key_names
66from .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