summaryrefslogtreecommitdiff
path: root/jsonpatch.py
diff options
context:
space:
mode:
Diffstat (limited to 'jsonpatch.py')
-rw-r--r--jsonpatch.py19
1 files changed, 15 insertions, 4 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):