Let apply_patch to handle patch as JSON-encoded string.

This commit is contained in:
Alexander Shorin
2012-06-16 23:35:57 +04:00
parent e90dba067e
commit be9be6d963
2 changed files with 16 additions and 2 deletions

View File

@@ -47,6 +47,9 @@ if sys.version_info < (2, 6):
else:
import json
if sys.version_info >= (3, 0):
basestring = (bytes, str)
class JsonPatchException(Exception):
"""Base Json Patch exception"""
@@ -67,7 +70,7 @@ def apply_patch(doc, patch, in_place=False):
:param doc: Document object.
:type doc: dict
:param patch: JSON patch as list of dicts.
:param patch: JSON patch as list of dicts or raw JSON-encoded string.
:type patch: list
:param in_place: While :const:`True` patch will modify target document.
@@ -89,6 +92,9 @@ def apply_patch(doc, patch, in_place=False):
True
"""
if isinstance(patch, basestring):
patch = JsonPatch.from_string(patch)
else:
patch = JsonPatch(patch)
return patch.apply(doc, in_place)

View File

@@ -8,6 +8,14 @@ import jsonpatch
class ApplyPatchTestCase(unittest.TestCase):
def test_apply_patch_from_string(self):
obj = {'foo': 'bar'}
patch = '[{"add": "/baz", "value": "qux"}]'
res = jsonpatch.apply_patch(obj, patch)
self.assertTrue(obj is not res)
self.assertTrue('baz' in res)
self.assertEqual(res['baz'], 'qux')
def test_apply_patch_to_copy(self):
obj = {'foo': 'bar'}
res = jsonpatch.apply_patch(obj, [{'add': '/baz', 'value': 'qux'}])