From 8a1a4b9049975e82cb56648dcc68dc3fdbece703 Mon Sep 17 00:00:00 2001 From: serv-inc Date: Tue, 16 May 2017 19:40:36 +0200 Subject: [PATCH 1/3] Update module help This makes `help(deepdiff)` display some useful info. --- deepdiff/__init__.py | 1 + 1 file changed, 1 insertion(+) 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__': From 10a117476c729a333b9b07f4d12c39adcb9c053c Mon Sep 17 00:00:00 2001 From: Michael Overmeyer Date: Thu, 25 May 2017 09:34:45 -0400 Subject: [PATCH 2/3] Fixed missing definition of `item` --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 80b2d3a9..5e4add8b 100644 --- a/README.md +++ b/README.md @@ -166,7 +166,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) ``` @@ -188,7 +188,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) ``` From 369c177de0c4b5a6dee3ecb6f4218fda748acd2e Mon Sep 17 00:00:00 2001 From: Max Rothman Date: Mon, 19 Jun 2017 15:32:05 -0400 Subject: [PATCH 3/3] Search for objects, not just number/str Add the ability to search for complex objects in addition to numbers and strings. For example, searching for None and datetimes now works. --- deepdiff/search.py | 9 ++++++++- tests/test_search.py | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) 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):