Optimize "deep" `replace` operation, fixes #36
This commit is contained in:
11
jsonpatch.py
11
jsonpatch.py
@@ -756,10 +756,17 @@ def _optimize(operations):
|
|||||||
|
|
||||||
|
|
||||||
def _optimize_using_replace(prev, cur):
|
def _optimize_using_replace(prev, cur):
|
||||||
"""Optimises JSON patch by using ``replace`` operation instead of
|
"""Optimises by replacing ``add``/``remove`` with ``replace`` on same path
|
||||||
``remove`` and ``add`` against the same path."""
|
|
||||||
|
For nested strucures, tries to recurse replacement, see #36 """
|
||||||
prev['op'] = 'replace'
|
prev['op'] = 'replace'
|
||||||
if cur['op'] == 'add':
|
if cur['op'] == 'add':
|
||||||
|
# make recursive patch
|
||||||
|
patch = make_patch(prev['value'], cur['value'])
|
||||||
|
if len(patch.patch) == 1:
|
||||||
|
prev['path'] = prev['path'] + patch.patch[0]['path']
|
||||||
|
prev['value'] = patch.patch[0]['value']
|
||||||
|
else:
|
||||||
prev['value'] = cur['value']
|
prev['value'] = cur['value']
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
18
tests.py
18
tests.py
@@ -366,6 +366,24 @@ class MakePatchTestCase(unittest.TestCase):
|
|||||||
dest = [7, 2, 1, 0, 9, 4, 3, 6, 5, 8]
|
dest = [7, 2, 1, 0, 9, 4, 3, 6, 5, 8]
|
||||||
patch = jsonpatch.make_patch(src, dest)
|
patch = jsonpatch.make_patch(src, dest)
|
||||||
|
|
||||||
|
def test_minimal_patch(self):
|
||||||
|
""" Test whether a minimal patch is created, see #36 """
|
||||||
|
src = [{"foo": 1, "bar": 2}]
|
||||||
|
dst = [{"foo": 2, "bar": 2}]
|
||||||
|
import pudb
|
||||||
|
#pudb.set_trace()
|
||||||
|
patch = jsonpatch.make_patch(src, dst)
|
||||||
|
|
||||||
|
exp = [
|
||||||
|
{
|
||||||
|
"path": "/0/foo",
|
||||||
|
"value": 2,
|
||||||
|
"op": "replace"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
self.assertEqual(patch.patch, exp)
|
||||||
|
|
||||||
|
|
||||||
class InvalidInputTests(unittest.TestCase):
|
class InvalidInputTests(unittest.TestCase):
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user