diff --git a/jsonpatch.py b/jsonpatch.py index 96fe6f9..32508e2 100644 --- a/jsonpatch.py +++ b/jsonpatch.py @@ -767,7 +767,7 @@ def _optimize_using_replace(prev, cur): if cur['op'] == 'add': # make recursive patch patch = make_patch(prev['value'], cur['value']) - if len(patch.patch) == 1: + if len(patch.patch) == 1 and patch.patch[0]['op'] != 'remove': prev['path'] = prev['path'] + patch.patch[0]['path'] prev['value'] = patch.patch[0]['value'] else: diff --git a/tests.py b/tests.py index 8b0b52c..5acf24b 100755 --- a/tests.py +++ b/tests.py @@ -317,6 +317,15 @@ class MakePatchTestCase(unittest.TestCase): res = jsonpatch.apply_patch(src, patch) self.assertEqual(res, dst) + def test_use_replace_instead_of_remove_add_nested(self): + src = {'foo': [{'bar': 1, 'baz': 2}, {'bar': 2, 'baz': 3}]} + dst = {'foo': [{'bar': 1}, {'bar': 2, 'baz': 3}]} + patch = list(jsonpatch.make_patch(src, dst)) + self.assertEqual(len(patch), 1) + self.assertEqual(patch[0]['op'], 'replace') + res = jsonpatch.apply_patch(src, patch) + self.assertEqual(res, dst) + def test_use_move_instead_of_remove_add(self): src = {'foo': [4, 1, 2, 3]} dst = {'foo': [1, 2, 3, 4]}