| 
8 | 8 | import difflib  | 
9 | 9 | import logging  | 
10 | 10 | import types  | 
 | 11 | +import datetime  | 
11 | 12 | from enum import Enum  | 
12 | 13 | from copy import deepcopy  | 
13 | 14 | from math import isclose as is_close  | 
14 |  | -from typing import List, Dict, IO, Callable, Set, Union, Any, Pattern, Tuple, Optional  | 
 | 15 | +from typing import List, Dict, Callable, Union, Any, Pattern, Tuple, Optional  | 
15 | 16 | from collections.abc import Mapping, Iterable, Sequence  | 
16 | 17 | from collections import defaultdict  | 
17 | 18 | from inspect import getmembers  | 
18 | 19 | from itertools import zip_longest  | 
 | 20 | +from functools import lru_cache  | 
19 | 21 | from deepdiff.helper import (strings, bytes_type, numbers, uuids, datetimes, ListItemRemovedOrAdded, notpresent,  | 
20 | 22 |                              IndexedHash, unprocessed, add_to_frozen_set, basic_types,  | 
21 | 23 |                              convert_item_or_items_into_set_else_none, get_type,  | 
@@ -1123,6 +1125,7 @@ def _create_hashtable(self, level, t):  | 
1123 | 1125 |         return local_hashes  | 
1124 | 1126 | 
 
  | 
1125 | 1127 |     @staticmethod  | 
 | 1128 | +    @lru_cache(maxsize=2028)  | 
1126 | 1129 |     def _get_distance_cache_key(added_hash, removed_hash):  | 
1127 | 1130 |         key1, key2 = (added_hash, removed_hash) if added_hash > removed_hash else (removed_hash, added_hash)  | 
1128 | 1131 |         if isinstance(key1, int):  | 
@@ -1485,7 +1488,15 @@ def _diff_numbers(self, level, local_tree=None, report_type_change=True):  | 
1485 | 1488 |             if t1_s != t2_s:  | 
1486 | 1489 |                 self._report_result('values_changed', level, local_tree=local_tree)  | 
1487 | 1490 | 
 
  | 
1488 |  | -    def _diff_datetimes(self, level, local_tree=None):  | 
 | 1491 | +    def _diff_datetime(self, level, local_tree=None):  | 
 | 1492 | +        """Diff DateTimes"""  | 
 | 1493 | +        level.t1 = datetime_normalize(self.truncate_datetime, level.t1)  | 
 | 1494 | +        level.t2 = datetime_normalize(self.truncate_datetime, level.t2)  | 
 | 1495 | + | 
 | 1496 | +        if level.t1 != level.t2:  | 
 | 1497 | +            self._report_result('values_changed', level, local_tree=local_tree)  | 
 | 1498 | + | 
 | 1499 | +    def _diff_time(self, level, local_tree=None):  | 
1489 | 1500 |         """Diff DateTimes"""  | 
1490 | 1501 |         if self.truncate_datetime:  | 
1491 | 1502 |             level.t1 = datetime_normalize(self.truncate_datetime, level.t1)  | 
@@ -1668,8 +1679,11 @@ def _diff(self, level, parents_ids=frozenset(), _original_type=None, local_tree=  | 
1668 | 1679 |         elif isinstance(level.t1, strings):  | 
1669 | 1680 |             self._diff_str(level, local_tree=local_tree)  | 
1670 | 1681 | 
 
  | 
1671 |  | -        elif isinstance(level.t1, datetimes):  | 
1672 |  | -            self._diff_datetimes(level, local_tree=local_tree)  | 
 | 1682 | +        elif isinstance(level.t1, datetime.datetime):  | 
 | 1683 | +            self._diff_datetime(level, local_tree=local_tree)  | 
 | 1684 | + | 
 | 1685 | +        elif isinstance(level.t1, (datetime.date, datetime.timedelta, datetime.time)):  | 
 | 1686 | +            self._diff_time(level, local_tree=local_tree)  | 
1673 | 1687 | 
 
  | 
1674 | 1688 |         elif isinstance(level.t1, uuids):  | 
1675 | 1689 |             self._diff_uuids(level, local_tree=local_tree)  | 
 | 
0 commit comments