Skip to content

Commit 5ee7d6c

Browse files
authored
Merge pull request #413 from cohml/precompiled-regex-simple-diff
Precompiled regex simple diff
2 parents de56336 + 32ec182 commit 5ee7d6c

File tree

3 files changed

+78
-9
lines changed

3 files changed

+78
-9
lines changed

Diff for: deepdiff/diff.py

+15-8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from math import isclose as is_close
1414
from collections.abc import Mapping, Iterable, Sequence
1515
from collections import defaultdict
16+
from inspect import getmembers
1617
from itertools import zip_longest
1718
from ordered_set import OrderedSet
1819
from deepdiff.helper import (strings, bytes_type, numbers, uuids, datetimes, ListItemRemovedOrAdded, notpresent,
@@ -415,20 +416,25 @@ def _diff_enum(self, level, parents_ids=frozenset(), local_tree=None):
415416

416417
def _diff_obj(self, level, parents_ids=frozenset(), is_namedtuple=False, local_tree=None):
417418
"""Difference of 2 objects"""
419+
processing_error = False
418420
try:
419421
if is_namedtuple:
420422
t1 = level.t1._asdict()
421423
t2 = level.t2._asdict()
422-
else:
424+
elif all('__dict__' in dir(t) for t in level):
423425
t1 = detailed__dict__(level.t1, ignore_private_variables=self.ignore_private_variables)
424426
t2 = detailed__dict__(level.t2, ignore_private_variables=self.ignore_private_variables)
425-
except AttributeError:
426-
try:
427+
elif all('__slots__' in dir(t) for t in level):
427428
t1 = self._dict_from_slots(level.t1)
428429
t2 = self._dict_from_slots(level.t2)
429-
except AttributeError:
430-
self._report_result('unprocessed', level, local_tree=local_tree)
431-
return
430+
else:
431+
t1 = {k: v for k, v in getmembers(level.t1) if not callable(v)}
432+
t2 = {k: v for k, v in getmembers(level.t2) if not callable(v)}
433+
except AttributeError:
434+
processing_error = True
435+
if processing_error is True:
436+
self._report_result('unprocessed', level, local_tree=local_tree)
437+
return
432438

433439
self._diff_dict(
434440
level,
@@ -874,7 +880,8 @@ def _diff_by_forming_pairs_and_comparing_one_by_one(
874880
x,
875881
y,
876882
child_relationship_class=child_relationship_class,
877-
child_relationship_param=j)
883+
child_relationship_param=j
884+
)
878885
self._diff(next_level, parents_ids_added, local_tree=local_tree)
879886

880887
def _diff_ordered_iterable_by_difflib(
@@ -1527,7 +1534,7 @@ def _diff(self, level, parents_ids=frozenset(), _original_type=None, local_tree=
15271534
if isinstance(level.t1, booleans):
15281535
self._diff_booleans(level, local_tree=local_tree)
15291536

1530-
if isinstance(level.t1, strings):
1537+
elif isinstance(level.t1, strings):
15311538
self._diff_str(level, local_tree=local_tree)
15321539

15331540
elif isinstance(level.t1, datetimes):

Diff for: deepdiff/model.py

+4
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,10 @@ def __setattr__(self, key, value):
577577
else:
578578
self.__dict__[key] = value
579579

580+
def __iter__(self):
581+
yield self.t1
582+
yield self.t2
583+
580584
@property
581585
def repetition(self):
582586
return self.additional['repetition']

Diff for: tests/test_diff_text.py

+59-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import datetime
33
import pytest
44
import logging
5+
import re
56
import uuid
67
from enum import Enum
78
from typing import List
@@ -551,6 +552,64 @@ class MyEnum(Enum):
551552
}
552553
assert ddiff == result
553554

555+
def test_precompiled_regex(self):
556+
557+
pattern_1 = re.compile('foo')
558+
pattern_2 = re.compile('foo')
559+
pattern_3 = re.compile('foo', flags=re.I)
560+
pattern_4 = re.compile('(foo)')
561+
pattern_5 = re.compile('bar')
562+
563+
# same object
564+
ddiff = DeepDiff(pattern_1, pattern_1)
565+
result = {}
566+
assert ddiff == result
567+
568+
# same pattern, different object
569+
ddiff = DeepDiff(pattern_1, pattern_2)
570+
result = {}
571+
assert ddiff == result
572+
573+
# same pattern, different flags
574+
ddiff = DeepDiff(pattern_1, pattern_3)
575+
result = {
576+
'values_changed': {
577+
'root.flags': {
578+
'new_value': 34,
579+
'old_value': 32,
580+
},
581+
}
582+
}
583+
assert ddiff == result
584+
585+
# same pattern, different groups
586+
ddiff = DeepDiff(pattern_1, pattern_4)
587+
result = {
588+
'values_changed': {
589+
'root.pattern': {
590+
'new_value': '(foo)',
591+
'old_value': 'foo',
592+
},
593+
'root.groups': {
594+
'new_value': 1,
595+
'old_value': 0,
596+
},
597+
}
598+
}
599+
assert ddiff == result
600+
601+
# different pattern
602+
ddiff = DeepDiff(pattern_1, pattern_5)
603+
result = {
604+
'values_changed': {
605+
'root.pattern': {
606+
'new_value': 'bar',
607+
'old_value': 'foo',
608+
},
609+
}
610+
}
611+
assert ddiff == result
612+
554613
def test_custom_objects_change(self):
555614
t1 = CustomClass(1)
556615
t2 = CustomClass(2)
@@ -1803,4 +1862,3 @@ class Bar(PydanticBaseModel):
18031862
diff = DeepDiff(t1, t2)
18041863
expected = {'values_changed': {'root.stuff[0].thing': {'new_value': 2, 'old_value': 1}}}
18051864
assert expected == diff
1806-

0 commit comments

Comments
 (0)