summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKostya <suffering.death@gmail.com>2017-04-27 17:05:55 +0300
committerKostya <suffering.death@gmail.com>2017-04-27 17:05:55 +0300
commite18a131be0aba0a065a5709f420ef88ec1a3fd83 (patch)
tree1e2d12c715dae5bd61cc2e89a7ff82f3984881cf
parent05d9aceda8d0269c27d869f13d8ba0c7ca88104e (diff)
downloadpython-json-patch-e18a131be0aba0a065a5709f420ef88ec1a3fd83.tar.gz
don't apply patch optimization when it's incorrect
-rw-r--r--jsonpatch.py19
-rwxr-xr-xtests.py13
2 files changed, 26 insertions, 6 deletions
diff --git a/jsonpatch.py b/jsonpatch.py
index 1e2e3ac..0116ca2 100644
--- a/jsonpatch.py
+++ b/jsonpatch.py
@@ -171,6 +171,14 @@ def make_patch(src, dst):
>>> new == dst
True
"""
+
+ # TODO: fix patch optimiztion and remove the following check
+ # fix when patch with optimization is incorrect
+ patch = JsonPatch.from_diff(src, dst)
+ new = patch.apply(src)
+ if new != dst:
+ return JsonPatch.from_diff(src, dst, False)
+
return JsonPatch.from_diff(src, dst)
@@ -268,7 +276,7 @@ class JsonPatch(object):
return cls(patch)
@classmethod
- def from_diff(cls, src, dst):
+ def from_diff(cls, src, dst, optimization=True):
"""Creates JsonPatch instance based on comparing of two document
objects. Json patch would be created for `src` argument against `dst`
one.
@@ -320,7 +328,7 @@ class JsonPatch(object):
'value': dst[key]}
def compare_lists(path, src, dst):
- return _compare_lists(path, src, dst)
+ return _compare_lists(path, src, dst, optimization=optimization)
return cls(list(compare_values([], src, dst)))
@@ -561,9 +569,12 @@ class CopyOperation(PatchOperation):
return obj
-def _compare_lists(path, src, dst):
+def _compare_lists(path, src, dst, optimization=True):
"""Compares two lists objects and return JSON patch about."""
- return _optimize(_compare(path, src, dst, *_split_by_common_seq(src, dst)))
+ patch = list(_compare(path, src, dst, *_split_by_common_seq(src, dst)))
+ if optimization:
+ return list(_optimize(patch))
+ return patch
def _longest_common_subseq(src, dst):
diff --git a/tests.py b/tests.py
index 4b7d505..51d9517 100755
--- a/tests.py
+++ b/tests.py
@@ -267,7 +267,6 @@ class EqualityTestCase(unittest.TestCase):
self.assertEqual(json.dumps(patch_obj), patch.to_string())
-
class MakePatchTestCase(unittest.TestCase):
def test_apply_patch_to_copy(self):
@@ -336,7 +335,6 @@ class MakePatchTestCase(unittest.TestCase):
res = jsonpatch.apply_patch(src, patch)
self.assertEqual(res, dst)
-
def test_escape(self):
src = {"x/y": 1}
dst = {"x/y": 2}
@@ -368,6 +366,17 @@ class MakePatchTestCase(unittest.TestCase):
dest = [7, 2, 1, 0, 9, 4, 3, 6, 5, 8]
patch = jsonpatch.make_patch(src, dest)
+ def test_json_patch(self):
+ old = {
+ 'queue': {'teams_out': [{'id': 3, 'reason': 'If tied'}, {'id': 5, 'reason': 'If tied'}]},
+ }
+ new = {
+ 'queue': {'teams_out': [{'id': 5, 'reason': 'If lose'}]}
+ }
+ patch = jsonpatch.make_patch(old, new)
+ new_from_patch = jsonpatch.apply_patch(old, patch)
+ self.assertEqual(new, new_from_patch)
+
class OptimizationTests(unittest.TestCase):
def test_use_replace_instead_of_remove_add(self):