1010from collections import MutableMapping
1111import logging
1212
13- from deepdiff .helper import py3 , strings , numbers , items
13+ from deepdiff .helper import py3 , strings , numbers , items , filtered
1414
1515logger = logging .getLogger (__name__ )
1616
@@ -77,6 +77,7 @@ def __init__(self,
7777 exclude_paths = set (),
7878 exclude_types = set (),
7979 verbose_level = 1 ,
80+ case_sensitive = False ,
8081 ** kwargs ):
8182 if kwargs :
8283 raise ValueError ((
@@ -85,7 +86,8 @@ def __init__(self,
8586 ) % ', ' .join (kwargs .keys ()))
8687
8788 self .obj = obj
88- self .item = item
89+ self .case_sensitive = case_sensitive if isinstance (item , strings ) else True
90+ item = item if self .case_sensitive else item .lower ()
8991 self .exclude_paths = set (exclude_paths )
9092 self .exclude_types = set (exclude_types )
9193 self .exclude_types_tuple = tuple (
@@ -180,8 +182,9 @@ def __search_dict(self,
180182 parents_ids_added = self .__add_to_frozen_set (parents_ids , item_id )
181183
182184 new_parent = parent_text % (parent , item_key_str )
185+ new_parent_cased = new_parent if self .case_sensitive else new_parent .lower ()
183186
184- if str (item ) in new_parent :
187+ if str (item ) in new_parent_cased :
185188 self .__report (
186189 report_key = 'matched_paths' ,
187190 key = new_parent ,
@@ -200,25 +203,31 @@ def __search_iterable(self,
200203 parents_ids = frozenset ({})):
201204 """Search iterables except dictionaries, sets and strings."""
202205
203- for i , x in enumerate (obj ):
206+ for i , thing in enumerate (obj ):
204207 new_parent = "%s[%s]" % (parent , i )
205- if self .__skip_this (x , parent = new_parent ):
208+ if self .__skip_this (thing , parent = new_parent ):
206209 continue
207- if x == item :
210+
211+ if self .case_sensitive or not isinstance (thing , strings ):
212+ thing_cased = thing
213+ else :
214+ thing_cased = thing .lower ()
215+
216+ if thing_cased == item :
208217 self .__report (
209- report_key = 'matched_values' , key = new_parent , value = x )
218+ report_key = 'matched_values' , key = new_parent , value = thing )
210219 else :
211- item_id = id (x )
220+ item_id = id (thing )
212221 if parents_ids and item_id in parents_ids :
213222 continue
214- parents_ids_added = self .__add_to_frozen_set (parents_ids ,
215- item_id )
216- self .__search (x , item , "%s[%s]" %
223+ parents_ids_added = self .__add_to_frozen_set (parents_ids , item_id )
224+ self .__search (thing , item , "%s[%s]" %
217225 (parent , i ), parents_ids_added )
218226
219227 def __search_str (self , obj , item , parent ):
220228 """Compare strings"""
221- if item in obj :
229+ obj_text = obj if self .case_sensitive else obj .lower ()
230+ if item in obj_text :
222231 self .__report (report_key = 'matched_values' , key = parent , value = obj )
223232
224233 def __search_numbers (self , obj , item , parent ):
@@ -275,6 +284,21 @@ def __search(self, obj, item, parent="root", parents_ids=frozenset({})):
275284 self .__search_obj (obj , item , parent , parents_ids )
276285
277286
287+ class grep (object ):
288+ """
289+ Grep!
290+ """
291+
292+ def __init__ (self ,
293+ item ,
294+ ** kwargs ):
295+ self .item = item
296+ self .kwargs = kwargs
297+
298+ def __ror__ (self , other ):
299+ return DeepSearch (obj = other , item = self .item , ** self .kwargs )
300+
301+
278302if __name__ == "__main__" : # pragma: no cover
279303 if not py3 :
280304 sys .exit ("Please run with Python 3 to verify the doc strings." )
0 commit comments