summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kögl <stefan@skoegl.net>2017-09-10 12:44:37 +0200
committerGitHub <noreply@github.com>2017-09-10 12:44:37 +0200
commit7583258b618a4b651bb2fa41c12ff1c27de15d18 (patch)
tree38893919bbe11b680d468612f844fa8dc9da9dbc
parentf0a4f51e32c77f9c774c26ef339dbd95cfa8ffa7 (diff)
parent845cf4ad5dc2e7ebe2284bb499cbe32136d6f0ab (diff)
downloadpython-json-patch-7583258b618a4b651bb2fa41c12ff1c27de15d18.tar.gz
Merge pull request #65 from thunderstruck47/master
fixing array diff bug (issue #30)
-rw-r--r--jsonpatch.py7
-rwxr-xr-xtests.py10
2 files changed, 14 insertions, 3 deletions
diff --git a/jsonpatch.py b/jsonpatch.py
index 636e807..b1c56d0 100644
--- a/jsonpatch.py
+++ b/jsonpatch.py
@@ -175,7 +175,11 @@ def make_patch(src, dst):
# 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)
+ try:
+ new = patch.apply(src)
+ except JsonPatchConflict: # see TODO
+ return JsonPatch.from_diff(src, dst, False)
+
if new != dst:
return JsonPatch.from_diff(src, dst, False)
@@ -601,7 +605,6 @@ def _longest_common_subseq(src, dst):
matrix[i][j] = matrix[i-1][j-1] + 1
if matrix[i][j] > z:
z = matrix[i][j]
- if matrix[i][j] == z:
range_src = (i-z+1, i+1)
range_dst = (j-z+1, j+1)
else:
diff --git a/tests.py b/tests.py
index 6a8234f..78b06f5 100755
--- a/tests.py
+++ b/tests.py
@@ -376,7 +376,15 @@ class MakePatchTestCase(unittest.TestCase):
patch = jsonpatch.make_patch(old, new)
new_from_patch = jsonpatch.apply_patch(old, patch)
self.assertEqual(new, new_from_patch)
-
+
+ def test_arrays_one_element_sequences(self):
+ """ Tests the case of multiple common one element sequences inside an array """
+ # see https://github.com/stefankoegl/python-json-patch/issues/30#issuecomment-155070128
+ src = [1,2,3]
+ dst = [3,1,4,2]
+ patch = jsonpatch.make_patch(src, dst)
+ res = jsonpatch.apply_patch(src, patch)
+ self.assertEqual(res, dst)
class OptimizationTests(unittest.TestCase):
def test_use_replace_instead_of_remove_add(self):