diff --git a/README.md b/README.md index 8f5b62f6..26ff60e7 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,7 @@ Let's say you have a huge nested object and want to see if any item with the wor ```py from deepdiff import DeepSearch obj = {"long": "somewhere", "string": 2, 0: 0, "somewhere": "around"} -ds = DeepSearch(obj, item, verbose_level=2) +ds = DeepSearch(obj, "somewhere", verbose_level=2) print(ds) ``` @@ -187,7 +187,7 @@ Just grep through your objects as you would in shell! ```py from deepdiff import grep obj = {"long": "somewhere", "string": 2, 0: 0, "somewhere": "around"} -ds = obj | grep(item) +ds = obj | grep("somewhere") print(ds) ``` diff --git a/deepdiff/__init__.py b/deepdiff/__init__.py index 6e608d0c..95ad688c 100644 --- a/deepdiff/__init__.py +++ b/deepdiff/__init__.py @@ -1,3 +1,4 @@ +"""This module offers the DeepDiff, DeepSearch, grep and DeepHash classes.""" import logging if __name__ == '__main__': diff --git a/deepdiff/search.py b/deepdiff/search.py index 26ba8826..8c826d8d 100644 --- a/deepdiff/search.py +++ b/deepdiff/search.py @@ -127,6 +127,11 @@ def __search_obj(self, parents_ids=frozenset({}), is_namedtuple=False): """Search objects""" + found = False + if obj == item: + found = True + self.__report(report_key='matched_values', key=parent, value=obj) + try: if is_namedtuple: obj = obj._asdict() @@ -136,7 +141,9 @@ def __search_obj(self, try: obj = {i: getattr(obj, i) for i in obj.__slots__} except AttributeError: - self['unprocessed'].append("%s" % parent) + if not found: + self['unprocessed'].append("%s" % parent) + return self.__search_dict( diff --git a/tests/test_search.py b/tests/test_search.py index 49929c68..3f56ceba 100644 --- a/tests/test_search.py +++ b/tests/test_search.py @@ -15,6 +15,7 @@ """ import unittest from deepdiff import DeepSearch, grep +from datetime import datetime import logging logging.disable(logging.CRITICAL) @@ -286,6 +287,30 @@ def test_case_insensitive_of_str_in_one_liner(self): result = {'matched_values': {'root'}} self.assertEqual(DeepSearch(obj, item, verbose_level=1, case_sensitive=False), result) + def test_none(self): + obj = item = None + result = {'matched_values': {'root'}} + self.assertEqual(DeepSearch(obj, item, verbose_level=1), result) + + def test_complex_obj(self): + obj = datetime(2017, 5, 4, 1, 1, 1) + item = datetime(2017, 5, 4, 1, 1, 1) + result = {'matched_values': {'root'}} + self.assertEqual(DeepSearch(obj, item, verbose_level=1), result) + + def test_keep_searching_after_obj_match(self): + class AlwaysEqual: + def __init__(self, recurse=True): + if recurse: + self.some_attr = AlwaysEqual(recurse=False) + def __eq__(self, other): + return True + + obj = AlwaysEqual() + item = AlwaysEqual() + result = {'matched_values': {'root', 'root.some_attr'}} + self.assertEqual(DeepSearch(obj, item, verbose_level=1), result) + class GrepTestCase(unittest.TestCase):