From 7b32a956cb851a62030e3bba31f623d633e6bc11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Thom?= Date: Wed, 1 Dec 2021 13:20:13 +0100 Subject: [PATCH 1/2] Add support for UUIDs --- deepdiff/diff.py | 10 +++++- deepdiff/helper.py | 2 ++ tests/test_diff_text.py | 69 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/deepdiff/diff.py b/deepdiff/diff.py index 4b488613..bea2c820 100755 --- a/deepdiff/diff.py +++ b/deepdiff/diff.py @@ -13,7 +13,7 @@ from collections import defaultdict from itertools import zip_longest from ordered_set import OrderedSet -from deepdiff.helper import (strings, bytes_type, numbers, times, ListItemRemovedOrAdded, notpresent, +from deepdiff.helper import (strings, bytes_type, numbers, uuids, times, ListItemRemovedOrAdded, notpresent, IndexedHash, unprocessed, add_to_frozen_set, convert_item_or_items_into_set_else_none, get_type, convert_item_or_items_into_compiled_regexes_else_none, @@ -1148,6 +1148,11 @@ def _diff_datetimes(self, level): if level.t1 != level.t2: self._report_result('values_changed', level) + def _diff_uuids(self, level): + """Diff UUIDs""" + if level.t1.int != level.t2.int: + self._report_result('values_changed', level) + def _diff_numpy_array(self, level, parents_ids=frozenset()): """Diff numpy arrays""" if level.path() not in self._numpy_paths: @@ -1318,6 +1323,9 @@ def _diff(self, level, parents_ids=frozenset(), _original_type=None): elif isinstance(level.t1, times): self._diff_datetimes(level) + elif isinstance(level.t1, uuids): + self._diff_uuids(level) + elif isinstance(level.t1, numbers): self._diff_numbers(level) diff --git a/deepdiff/helper.py b/deepdiff/helper.py index 1be4b0be..14a417dd 100644 --- a/deepdiff/helper.py +++ b/deepdiff/helper.py @@ -2,6 +2,7 @@ import re import os import datetime +import uuid import logging import warnings import time @@ -126,6 +127,7 @@ def copy(self): # pragma: no cover. Only used in pypy3 and py3.5 bytes_type = bytes only_numbers = (int, float, complex, Decimal) + numpy_numbers datetimes = (datetime.datetime, datetime.date, datetime.timedelta, datetime.time) +uuids = (uuid.UUID) times = (datetime.datetime, datetime.time) numbers = only_numbers + datetimes booleans = (bool, np_bool_) diff --git a/tests/test_diff_text.py b/tests/test_diff_text.py index 5b3f9e43..fb8c8e0f 100755 --- a/tests/test_diff_text.py +++ b/tests/test_diff_text.py @@ -2,6 +2,7 @@ import datetime import pytest import logging +import uuid from decimal import Decimal from deepdiff import DeepDiff from deepdiff.helper import pypy3 @@ -157,6 +158,74 @@ def test_diffs_times(self): assert DeepDiff(t1, t2) == expected_result assert DeepDiff(t1, t3) == {} + def test_diffs_uuid1(self): + t1 = uuid.uuid1() + t2 = uuid.uuid1() + ddiff = DeepDiff(t1, t2) + result = { + 'values_changed': { + 'root': { + 'new_value': t2, + 'old_value': t1 + } + } + } + assert result == ddiff + ddiff = DeepDiff(t1, t1) + result = {} + assert result == ddiff + + def test_diffs_uuid3(self): + t1 = uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org') + t2 = uuid.uuid3(uuid.NAMESPACE_DNS, 'stackoverflow.com') + ddiff = DeepDiff(t1, t2) + result = { + 'values_changed': { + 'root': { + 'new_value': t2, + 'old_value': t1 + } + } + } + assert result == ddiff + ddiff = DeepDiff(t1, t1) + result = {} + assert result == ddiff + + def test_diffs_uuid4(self): + t1 = uuid.uuid4() + t2 = uuid.uuid4() + ddiff = DeepDiff(t1, t2) + result = { + 'values_changed': { + 'root': { + 'new_value': t2, + 'old_value': t1 + } + } + } + assert result == ddiff + ddiff = DeepDiff(t1, t1) + result = {} + assert result == ddiff + + def test_diffs_uuid5(self): + t1 = uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org') + t2 = uuid.uuid5(uuid.NAMESPACE_DNS, 'stackoverflow.com') + ddiff = DeepDiff(t1, t2) + result = { + 'values_changed': { + 'root': { + 'new_value': t2, + 'old_value': t1 + } + } + } + assert result == ddiff + ddiff = DeepDiff(t1, t1) + result = {} + assert result == ddiff + def test_string_difference(self): t1 = {1: 1, 2: 2, 3: 3, 4: {"a": "hello", "b": "world"}} t2 = {1: 1, 2: 4, 3: 3, 4: {"a": "hello", "b": "world!"}} From fecfdb80e8ed30dbb741ceed9c6eb2c2ebda5a4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Thom?= Date: Thu, 2 Dec 2021 09:10:28 +0100 Subject: [PATCH 2/2] update authors --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 83f35113..210e5b1c 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -41,3 +41,4 @@ Authors in order of the timeline of their contributions: - Sun Ao [eggachecat](https://github.com/eggachecat) for adding custom operators. - Sun Ao [eggachecat](https://github.com/eggachecat) for adding ignore_order_func. - [SlavaSkvortsov](https://github.com/SlavaSkvortsov) for fixing unprocessed key error. +- [havardthom](https://github.com/havardthom) for adding UUID support.