From 72a90e3ff1e75c6628106509568de9e22ca2b259 Mon Sep 17 00:00:00 2001 From: Kirill Goldshtein Date: Wed, 4 May 2016 09:53:57 +0300 Subject: Fix KeyError in add/remove optimization --- jsonpatch.py | 2 +- tests.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) 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]} -- cgit v1.2.1