diff --git a/jsondiff-2.0.0.tar.gz b/jsondiff-2.0.0.tar.gz deleted file mode 100644 index 4fb2328..0000000 --- a/jsondiff-2.0.0.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5cf3dfb212dcdc6ee104f40e30824a2f3ddaa05938d111ce0eea6646518b8339 -size 15405 diff --git a/jsondiff-2.2.0.tar.gz b/jsondiff-2.2.0.tar.gz new file mode 100644 index 0000000..5d7789f --- /dev/null +++ b/jsondiff-2.2.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:060e9a10fe136c643e9d2bf264ea1fbe966ed17d2fd37348dd65b1c650c2df4f +size 26597 diff --git a/python-jsondiff.changes b/python-jsondiff.changes index d79922b..3bfec32 100644 --- a/python-jsondiff.changes +++ b/python-jsondiff.changes @@ -1,3 +1,22 @@ +------------------------------------------------------------------- +Tue Aug 13 03:18:20 UTC 2024 - Steve Kowalik + +- Update to 2.2.0: + * Exclude a list of paths from diff. + * really drop python<=3.7 support + * remove last bits of python2 support + * Fix pypi release readme formatting + * Minimal conversion to pytest+hypothesis + * Added simple equality operator for class Symbol + * jsondiff: fix symbol equality + * setup.py: migrate to pyproject.toml + * fix: better diffing of empty containers + * add rightonly jsondiff syntax + * Introduce YAML support + * packaging: revert to requirements files +- Switch back to PyPi tarball. (required for setuptools_scm) +- Drop patch remove_nose.patch, no longer required. + ------------------------------------------------------------------- Tue Mar 26 12:08:46 UTC 2024 - John Paul Adrian Glaubitz diff --git a/python-jsondiff.spec b/python-jsondiff.spec index 3b87c91..fa58130 100644 --- a/python-jsondiff.spec +++ b/python-jsondiff.spec @@ -18,22 +18,22 @@ %{?sle15_python_module_pythons} Name: python-jsondiff -Version: 2.0.0 +Version: 2.2.0 Release: 0 Summary: Module to diff JSON and JSON-like structures in Python License: MIT URL: https://github.com/ZoomerAnalytics/jsondiff -Source: https://github.com/ZoomerAnalytics/jsondiff/archive/%{version}.tar.gz#/jsondiff-%{version}.tar.gz -# PATCH-FEATURE-UPSTREAM remove_nose.patch bsc#[0-9]+ mcepl@suse.com -# Replace nose-random plugin with ripped of version independent of nose. -Patch0: remove_nose.patch +Source: https://files.pythonhosted.org/packages/source/j/jsondiff/jsondiff-%{version}.tar.gz +BuildRequires: %{python_module PyYAML} +BuildRequires: %{python_module base >= 3.8} +BuildRequires: %{python_module hypothesis} BuildRequires: %{python_module pip} BuildRequires: %{python_module pytest} -BuildRequires: %{python_module setuptools} +BuildRequires: %{python_module setuptools_scm} BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: python-rpm-macros -Requires: python-setuptools +Requires: python-PyYAML Requires(post): update-alternatives Requires(postun): update-alternatives BuildArch: noarch @@ -54,7 +54,7 @@ Package to show differences between JSON and JSON-like structures in Python %python_expand %fdupes %{buildroot}%{$python_sitelib} %check -%pytest tests/__init__.py +%pytest %post %python_install_alternative jdiff @@ -64,9 +64,9 @@ Package to show differences between JSON and JSON-like structures in Python %files %{python_files} %license LICENSE -%doc README.rst +%doc README.md %{python_sitelib}/jsondiff -%{python_sitelib}/jsondiff-*.dist-info +%{python_sitelib}/jsondiff-%{version}.dist-info %python_alternative %{_bindir}/jdiff %changelog diff --git a/remove_nose.patch b/remove_nose.patch deleted file mode 100644 index 09971fd..0000000 --- a/remove_nose.patch +++ /dev/null @@ -1,300 +0,0 @@ -diff -Nru jsondiff-1.3.0.orig/tests/__init__.py jsondiff-1.3.0/tests/__init__.py ---- jsondiff-1.3.0.orig/tests/__init__.py 2021-04-19 21:51:14.000000000 +0200 -+++ jsondiff-1.3.0/tests/__init__.py 2021-12-07 10:25:30.252455974 +0100 -@@ -1,130 +1,15 @@ - import sys --import unittest - --from jsondiff import diff, replace, add, discard, insert, delete, update, JsonDiffer -- --from .utils import generate_random_json, perturbate_json -- --from nose_random import randomize -- -- --class JsonDiffTests(unittest.TestCase): -- -- def test_a(self): -- -- self.assertEqual({}, diff(1, 1)) -- self.assertEqual({}, diff(True, True)) -- self.assertEqual({}, diff('abc', 'abc')) -- self.assertEqual({}, diff([1, 2], [1, 2])) -- self.assertEqual({}, diff((1, 2), (1, 2))) -- self.assertEqual({}, diff({1, 2}, {1, 2})) -- self.assertEqual({}, diff({'a': 1, 'b': 2}, {'a': 1, 'b': 2})) -- self.assertEqual({}, diff([], [])) -- self.assertEqual({}, diff(None, None)) -- self.assertEqual({}, diff({}, {})) -- self.assertEqual({}, diff(set(), set())) -- -- self.assertEqual(2, diff(1, 2)) -- self.assertEqual(False, diff(True, False)) -- self.assertEqual('def', diff('abc', 'def')) -- self.assertEqual([3, 4], diff([1, 2], [3, 4])) -- self.assertEqual((3, 4), diff((1, 2), (3, 4))) -- self.assertEqual({3, 4}, diff({1, 2}, {3, 4})) -- self.assertEqual({replace: {'c': 3, 'd': 4}}, diff({'a': 1, 'b': 2}, {'c': 3, 'd': 4})) -- -- self.assertEqual({replace: {'c': 3, 'd': 4}}, diff([1, 2], {'c': 3, 'd': 4})) -- self.assertEqual(123, diff({'a': 1, 'b': 2}, 123)) -- -- self.assertEqual({delete: ['b']}, diff({'a': 1, 'b': 2}, {'a': 1})) -- self.assertEqual({'b': 3}, diff({'a': 1, 'b': 2}, {'a': 1, 'b': 3})) -- self.assertEqual({'c': 3}, diff({'a': 1, 'b': 2}, {'a': 1, 'b': 2, 'c': 3})) -- self.assertEqual({delete: ['b'], 'c': 3}, diff({'a': 1, 'b': 2}, {'a': 1, 'c': 3})) -- -- self.assertEqual({add: {3}}, diff({1, 2}, {1, 2, 3})) -- self.assertEqual({add: {3}, discard: {4}}, diff({1, 2, 4}, {1, 2, 3})) -- self.assertEqual({discard: {4}}, diff({1, 2, 4}, {1, 2})) -- -- self.assertEqual({insert: [(1, 'b')]}, diff(['a', 'c'], ['a', 'b', 'c'])) -- self.assertEqual({insert: [(1, 'b')], delete: [3, 0]}, diff(['x', 'a', 'c', 'x'], ['a', 'b', 'c'])) -- self.assertEqual( -- {insert: [(2, 'b')], delete: [4, 0], 1: {'v': 20}}, -- diff(['x', 'a', {'v': 11}, 'c', 'x'], ['a', {'v': 20}, 'b', 'c']) -- ) -- self.assertEqual( -- {insert: [(2, 'b')], delete: [4, 0], 1: {'v': 20}}, -- diff(['x', 'a', {'u': 10, 'v': 11}, 'c', 'x'], ['a', {'u': 10, 'v': 20}, 'b', 'c']) -- ) -- -- def test_marshal(self): -- differ = JsonDiffer() -- -- d = { -- delete: 3, -- '$delete': 4, -- insert: 4, -- '$$something': 1 -- } -- -- dm = differ.marshal(d) -- -- self.assertEqual(d, differ.unmarshal(dm)) -- -- def generate_scenario(self, rng): -- a = generate_random_json(rng, sets=True) -- b = perturbate_json(a, rng, sets=True) -- return a, b -- -- def generate_scenario_no_sets(self, rng): -- a = generate_random_json(rng, sets=False) -- b = perturbate_json(a, rng, sets=False) -- return a, b -- -- @randomize(1000, generate_scenario_no_sets) -- def test_dump(self, scenario): -- a, b = scenario -- diff(a, b, syntax='compact', dump=True) -- diff(a, b, syntax='explicit', dump=True) -- diff(a, b, syntax='symmetric', dump=True) -- -- @randomize(1000, generate_scenario) -- def test_compact_syntax(self, scenario): -- a, b = scenario -- differ = JsonDiffer(syntax='compact') -- d = differ.diff(a, b) -- self.assertEqual(b, differ.patch(a, d)) -- dm = differ.marshal(d) -- self.assertEqual(d, differ.unmarshal(dm)) -- -- -- @randomize(1000, generate_scenario) -- def test_explicit_syntax(self, scenario): -- a, b = scenario -- differ = JsonDiffer(syntax='explicit') -- d = differ.diff(a, b) -- # self.assertEqual(b, differ.patch(a, d)) -- dm = differ.marshal(d) -- self.assertEqual(d, differ.unmarshal(dm)) -- -- @randomize(1000, generate_scenario) -- def test_symmetric_syntax(self, scenario): -- a, b = scenario -- differ = JsonDiffer(syntax='symmetric') -- d = differ.diff(a, b) -- self.assertEqual(b, differ.patch(a, d)) -- self.assertEqual(a, differ.unpatch(b, d)) -- dm = differ.marshal(d) -- self.assertEqual(d, differ.unmarshal(dm)) -- -- def test_long_arrays(self): -- size = 100 -- a = [{'a': i, 'b': 2 * i} for i in range(1, size)] -- b = [{'a': i, 'b': 3 * i} for i in range(1, size)] -- r = sys.getrecursionlimit() -- sys.setrecursionlimit(size - 1) -- -- try: -- diff(a, b) -- except RecursionError: -- self.fail('cannot diff long arrays') -- finally: -- sys.setrecursionlimit(r) -+def test_long_arrays(self): -+ size = 100 -+ a = [{'a': i, 'b': 2 * i} for i in range(1, size)] -+ b = [{'a': i, 'b': 3 * i} for i in range(1, size)] -+ r = sys.getrecursionlimit() -+ sys.setrecursionlimit(size - 1) -+ -+ try: -+ diff(a, b) -+ except RecursionError: -+ self.fail('cannot diff long arrays') -+ finally: -+ sys.setrecursionlimit(r) -diff -Nru jsondiff-1.3.0.orig/tests/_random.py jsondiff-1.3.0/tests/_random.py ---- jsondiff-1.3.0.orig/tests/_random.py 1970-01-01 01:00:00.000000000 +0100 -+++ jsondiff-1.3.0/tests/_random.py 2021-12-07 10:21:59.457195559 +0100 -@@ -0,0 +1,33 @@ -+import sys -+from random import Random -+ -+PY3 = (sys.version_info[0] == 3) -+ -+ -+def _generate_tag(n, rng): -+ return ''.join(rng.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') -+ for _ in range(n)) -+ -+ -+def randomize(n, scenario_generator, seed=12038728732): -+ def decorator(test): -+ def randomized_test(self): -+ rng_seed = Random(seed) -+ nseeds = n -+ # (rng_seed.getrandbits(32) for i in range(n)) -+ seeds = (_generate_tag(12, rng_seed) for i in range(n)) -+ for i, rseed in enumerate(seeds): -+ rng = Random(rseed) -+ scenario = scenario_generator(self, rng) -+ try: -+ test(self, scenario) -+ except Exception as e: -+ import sys -+ if PY3: -+ raise type(e).with_traceback(type(e)('%s with scenario %s (%i of %i)' % -+ (e.message, rseed, i+1, nseeds)), sys.exc_info()[2]) -+ else: -+ raise (type(e), type(e)('%s with scenario %s (%i of %i)' -+ % (e.message, rseed, i+1, nseeds)), sys.exc_info()[2]) -+ return randomized_test -+ return decorator -diff -Nru jsondiff-1.3.0.orig/tests/test_jsondiff.py jsondiff-1.3.0/tests/test_jsondiff.py ---- jsondiff-1.3.0.orig/tests/test_jsondiff.py 1970-01-01 01:00:00.000000000 +0100 -+++ jsondiff-1.3.0/tests/test_jsondiff.py 2021-12-07 10:21:59.457195559 +0100 -@@ -0,0 +1,112 @@ -+import unittest -+ -+from jsondiff import diff, replace, add, discard, insert, delete, update, JsonDiffer -+from tests.utils import generate_random_json, perturbate_json -+from tests._random import randomize -+ -+ -+class JsonDiffTests(unittest.TestCase): -+ -+ def test_a(self): -+ -+ self.assertEqual({}, diff(1, 1)) -+ self.assertEqual({}, diff(True, True)) -+ self.assertEqual({}, diff('abc', 'abc')) -+ self.assertEqual({}, diff([1, 2], [1, 2])) -+ self.assertEqual({}, diff((1, 2), (1, 2))) -+ self.assertEqual({}, diff({1, 2}, {1, 2})) -+ self.assertEqual({}, diff({'a': 1, 'b': 2}, {'a': 1, 'b': 2})) -+ self.assertEqual({}, diff([], [])) -+ self.assertEqual({}, diff(None, None)) -+ self.assertEqual({}, diff({}, {})) -+ self.assertEqual({}, diff(set(), set())) -+ -+ self.assertEqual(2, diff(1, 2)) -+ self.assertEqual(False, diff(True, False)) -+ self.assertEqual('def', diff('abc', 'def')) -+ self.assertEqual([3, 4], diff([1, 2], [3, 4])) -+ self.assertEqual((3, 4), diff((1, 2), (3, 4))) -+ self.assertEqual({3, 4}, diff({1, 2}, {3, 4})) -+ self.assertEqual({replace: {'c': 3, 'd': 4}}, diff({'a': 1, 'b': 2}, {'c': 3, 'd': 4})) -+ -+ self.assertEqual({replace: {'c': 3, 'd': 4}}, diff([1, 2], {'c': 3, 'd': 4})) -+ self.assertEqual(123, diff({'a': 1, 'b': 2}, 123)) -+ -+ self.assertEqual({delete: ['b']}, diff({'a': 1, 'b': 2}, {'a': 1})) -+ self.assertEqual({'b': 3}, diff({'a': 1, 'b': 2}, {'a': 1, 'b': 3})) -+ self.assertEqual({'c': 3}, diff({'a': 1, 'b': 2}, {'a': 1, 'b': 2, 'c': 3})) -+ self.assertEqual({delete: ['b'], 'c': 3}, diff({'a': 1, 'b': 2}, {'a': 1, 'c': 3})) -+ -+ self.assertEqual({add: {3}}, diff({1, 2}, {1, 2, 3})) -+ self.assertEqual({add: {3}, discard: {4}}, diff({1, 2, 4}, {1, 2, 3})) -+ self.assertEqual({discard: {4}}, diff({1, 2, 4}, {1, 2})) -+ -+ self.assertEqual({insert: [(1, 'b')]}, diff(['a', 'c'], ['a', 'b', 'c'])) -+ self.assertEqual({insert: [(1, 'b')], delete: [3, 0]}, diff(['x', 'a', 'c', 'x'], ['a', 'b', 'c'])) -+ self.assertEqual( -+ {insert: [(2, 'b')], delete: [4, 0], 1: {'v': 20}}, -+ diff(['x', 'a', {'v': 11}, 'c', 'x'], ['a', {'v': 20}, 'b', 'c']) -+ ) -+ self.assertEqual( -+ {insert: [(2, 'b')], delete: [4, 0], 1: {'v': 20}}, -+ diff(['x', 'a', {'u': 10, 'v': 11}, 'c', 'x'], ['a', {'u': 10, 'v': 20}, 'b', 'c']) -+ ) -+ -+ def test_marshal(self): -+ differ = JsonDiffer() -+ -+ d = { -+ delete: 3, -+ '$delete': 4, -+ insert: 4, -+ '$$something': 1 -+ } -+ -+ dm = differ.marshal(d) -+ -+ self.assertEqual(d, differ.unmarshal(dm)) -+ -+ def generate_scenario(self, rng): -+ a = generate_random_json(rng, sets=True) -+ b = perturbate_json(a, rng, sets=True) -+ return a, b -+ -+ def generate_scenario_no_sets(self, rng): -+ a = generate_random_json(rng, sets=False) -+ b = perturbate_json(a, rng, sets=False) -+ return a, b -+ -+ @randomize(1000, generate_scenario_no_sets) -+ def test_dump(self, scenario): -+ a, b = scenario -+ diff(a, b, syntax='compact', dump=True) -+ diff(a, b, syntax='explicit', dump=True) -+ diff(a, b, syntax='symmetric', dump=True) -+ -+ @randomize(1000, generate_scenario) -+ def test_compact_syntax(self, scenario): -+ a, b = scenario -+ differ = JsonDiffer(syntax='compact') -+ d = differ.diff(a, b) -+ self.assertEqual(b, differ.patch(a, d)) -+ dm = differ.marshal(d) -+ self.assertEqual(d, differ.unmarshal(dm)) -+ -+ @randomize(1000, generate_scenario) -+ def test_explicit_syntax(self, scenario): -+ a, b = scenario -+ differ = JsonDiffer(syntax='explicit') -+ d = differ.diff(a, b) -+ # self.assertEqual(b, differ.patch(a, d)) -+ dm = differ.marshal(d) -+ self.assertEqual(d, differ.unmarshal(dm)) -+ -+ @randomize(1000, generate_scenario) -+ def test_symmetric_syntax(self, scenario): -+ a, b = scenario -+ differ = JsonDiffer(syntax='symmetric') -+ d = differ.diff(a, b) -+ self.assertEqual(b, differ.patch(a, d)) -+ self.assertEqual(a, differ.unpatch(b, d)) -+ dm = differ.marshal(d) -+ self.assertEqual(d, differ.unmarshal(dm))