@@ -51,10 +51,13 @@ def __init__(self, stack_trace=False, queue_trace=False):
5151 self .stack_ref = self ._stack_init ()
5252 self .queue_ref = self ._queue_init ()
5353
54- def find_key (self , data , key ):
54+ def find_key (self , data , key , partial , case_sensitive ):
5555 # type: (Union[dict, list, OrderedDict], str) -> list
5656 if not self ._valid_key_input (data , key ):
5757 raise
58+
59+ if partial and len (key )== 0 :
60+ raise
5861
5962 self .stack_ref = self ._stack_init () # init a new queue every request
6063 self ._stack_push (data )
@@ -66,16 +69,19 @@ def find_key(self, data, key):
6669
6770 elem = self ._stack_pop ()
6871
69- if type (elem ) is list :
72+ if isinstance (elem , list ) :
7073 self ._stack_push_list_elem (elem )
7174 elif isinstance (elem , (dict , OrderedDict )):
72- value = self ._stack_all_key_values_in_dict (key , elem )
75+ value = self ._stack_all_key_values_in_dict (key , elem , partial , case_sensitive )
7376 if value :
7477 for v in value :
75- value_list .insert (0 , v )
78+ if isinstance (v ,list ):
79+ value_list .extend ([item for item in v ])
80+ else :
81+ value_list .insert (0 , v )
7682 else : # according to RFC 7159, valid JSON can also contain a
77- # string, number, 'false', 'null', 'true'
78- pass # discard these other values as they don't have a key
83+ # string, number, 'false', 'null', 'true'
84+ pass # discard these other values as they don't have a key
7985
8086 return value_list
8187
@@ -241,7 +247,7 @@ def _stack_push_list_elem(self, elem):
241247 self ._stack_push (e )
242248 self ._stack_trace ()
243249
244- def _stack_all_key_values_in_dict (self , key , elem ):
250+ def _stack_all_key_values_in_dict (self , key , elem , partial , case_sensitive ):
245251 # type: (str, Union[dict, OrderedDict]) -> list
246252 value_list = []
247253
@@ -253,12 +259,21 @@ def _stack_all_key_values_in_dict(self, key, elem):
253259 if len (elem ) <= 0 : # don't want an empty dict on the stack
254260 pass
255261 else :
256- for e in elem :
257- if e == key :
258- value_list .append (elem [e ])
262+ value_list = []
263+
264+ for actual_key , value in elem .items ():
265+ match_key = actual_key if case_sensitive else actual_key .lower ()
266+ search_key = key if case_sensitive else key .lower ()
267+ if partial :
268+ if search_key in match_key :
269+ value_list .append (value )
259270 else :
260- self ._stack_push (elem [e ])
261- self ._stack_trace ()
271+ if match_key == search_key :
272+ value_list .append (value )
273+ if not (partial and search_key in match_key ) and not (not partial and match_key == search_key ):
274+ if isinstance (value , (dict , list , OrderedDict )):
275+ self ._stack_push (value )
276+ self ._stack_trace ()
262277 return value_list
263278
264279 def _stack_all_keys_values_in_dict (self , keys , elem ):
@@ -461,4 +476,4 @@ def _valid_value_input(self, data, value):
461476 raise TypeError
462477 elif not isinstance (value , (str , int , float , bool , type (None ))):
463478 raise TypeError
464- return True
479+ return True
0 commit comments