Skip to content

Commit c13d431

Browse files
authored
Merge pull request #76 from maxrothman/search-objs
Search for objects, not just number/str
2 parents 8e14e98 + 369c177 commit c13d431

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

deepdiff/search.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,11 @@ def __search_obj(self,
127127
parents_ids=frozenset({}),
128128
is_namedtuple=False):
129129
"""Search objects"""
130+
found = False
131+
if obj == item:
132+
found = True
133+
self.__report(report_key='matched_values', key=parent, value=obj)
134+
130135
try:
131136
if is_namedtuple:
132137
obj = obj._asdict()
@@ -136,7 +141,9 @@ def __search_obj(self,
136141
try:
137142
obj = {i: getattr(obj, i) for i in obj.__slots__}
138143
except AttributeError:
139-
self['unprocessed'].append("%s" % parent)
144+
if not found:
145+
self['unprocessed'].append("%s" % parent)
146+
140147
return
141148

142149
self.__search_dict(

tests/test_search.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"""
1616
import unittest
1717
from deepdiff import DeepSearch, grep
18+
from datetime import datetime
1819
import logging
1920
logging.disable(logging.CRITICAL)
2021

@@ -286,6 +287,30 @@ def test_case_insensitive_of_str_in_one_liner(self):
286287
result = {'matched_values': {'root'}}
287288
self.assertEqual(DeepSearch(obj, item, verbose_level=1, case_sensitive=False), result)
288289

290+
def test_none(self):
291+
obj = item = None
292+
result = {'matched_values': {'root'}}
293+
self.assertEqual(DeepSearch(obj, item, verbose_level=1), result)
294+
295+
def test_complex_obj(self):
296+
obj = datetime(2017, 5, 4, 1, 1, 1)
297+
item = datetime(2017, 5, 4, 1, 1, 1)
298+
result = {'matched_values': {'root'}}
299+
self.assertEqual(DeepSearch(obj, item, verbose_level=1), result)
300+
301+
def test_keep_searching_after_obj_match(self):
302+
class AlwaysEqual:
303+
def __init__(self, recurse=True):
304+
if recurse:
305+
self.some_attr = AlwaysEqual(recurse=False)
306+
def __eq__(self, other):
307+
return True
308+
309+
obj = AlwaysEqual()
310+
item = AlwaysEqual()
311+
result = {'matched_values': {'root', 'root.some_attr'}}
312+
self.assertEqual(DeepSearch(obj, item, verbose_level=1), result)
313+
289314

290315
class GrepTestCase(unittest.TestCase):
291316

0 commit comments

Comments
 (0)