33import jmespath
44from typing import Mapping , List , Union
55from .utils .jmspath_parsers import jmspath_value_parser , jmspath_refkey_parser
6- from .utils .filter_parsers import exclude_filter , get_values
7- from .utils .refkey_utils import keys_cleaner , keys_values_zipper
8-
6+ from .utils .filter_parsers import exclude_filter
7+ from .utils .refkey import keys_cleaner , keys_values_zipper , associate_key_of_my_value
8+ from .utils .flatten import flatten_list
9+ import pdb
910
1011def extract_values_from_output (value : Mapping , path : Mapping , exclude : List ) -> Union [Mapping , List , int , str , bool ]:
1112 """Return data from output depending on the check path. See unit text for complete example.
@@ -26,24 +27,45 @@ def extract_values_from_output(value: Mapping, path: Mapping, exclude: List) ->
2627 Return:
2728 [{'7.7.7.7': {'prefixesReceived': 101}}, {'10.1.0.0': {'prefixesReceived': 120}}, ...
2829 """
29- # Get the wanted values to be evaluated if jmspath expression is defined.
30+ # Get the wanted values to be evaluated if jmspath expression is defined, otherwise
31+ # use the entire output if jmespath is not defined in check. This cover the "raw" diff type.
3032 if path :
31- wanted_value = jmespath .search (jmspath_value_parser (path ), value )
32- # Take all the entir output if jmespath is not defined in check. This cover the "raw" diff type.
33- else :
34- wanted_value = value
33+ value = jmespath .search (jmspath_value_parser (path ), value )
3534
3635 # Exclude filter implementation.
3736 if exclude :
38- # Update list in place but assign to a new var for name consistency.
39- exclude_filter (wanted_value , exclude )
40- filtered_value = wanted_value
37+ exclude_filter (value , exclude )
38+
4139
42- filtered_value = get_values (path , wanted_value )
40+ # check if list of lists
41+ if not any (isinstance (i , list ) for i in value ):
42+ raise TypeError (
43+ "Catching value must be defined as list in jmespath expression i.e. result[*].state -> result[*].[state]. You have {}'." .format (
44+ path
45+ )
46+ )
47+
48+ for element in value :
49+ for item in element :
50+ if isinstance (item , dict ):
51+ raise TypeError (
52+ 'Must be list of lists i.e. [["Idle", 75759616], ["Idle", 75759620]]. You have {}\' .' .format (
53+ value
54+ )
55+ )
56+ elif isinstance (item , list ):
57+ flatten_list (value )
58+ break
59+
60+ if path :
61+ paired_key_value = associate_key_of_my_value (jmspath_value_parser (path ), value )
62+ else :
63+ paired_key_value = value
4364
65+ pdb .set_trace ()
4466 if path and re .search (r"\$.*\$" , path ):
4567 wanted_reference_keys = jmespath .search (jmspath_refkey_parser (path ), value )
4668 list_of_reference_keys = keys_cleaner (wanted_reference_keys )
47- return keys_values_zipper (list_of_reference_keys , filtered_value )
69+ return keys_values_zipper (list_of_reference_keys , paired_key_value )
4870 else :
49- return filtered_value
71+ return paired_key_value
0 commit comments