summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shorin <kxepal@gmail.com>2012-06-16 23:35:57 +0400
committerAlexander Shorin <kxepal@gmail.com>2012-06-16 23:35:57 +0400
commitbe9be6d96366c899cb0793e6502a40ccaca57473 (patch)
tree72d209c4b56269ba9d75a75c8cb015a55d0f7481
parente90dba067e912ad65e5d7c0d519a5d97ed5f89d4 (diff)
downloadpython-json-patch-be9be6d96366c899cb0793e6502a40ccaca57473.tar.gz
Let apply_patch to handle patch as JSON-encoded string.
-rw-r--r--jsonpatch.py10
-rwxr-xr-xtests.py8
2 files changed, 16 insertions, 2 deletions
diff --git a/jsonpatch.py b/jsonpatch.py
index 25d04d4..b93a14f 100644
--- a/jsonpatch.py
+++ b/jsonpatch.py
@@ -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,7 +92,10 @@ def apply_patch(doc, patch, in_place=False):
True
"""
- patch = JsonPatch(patch)
+ if isinstance(patch, basestring):
+ patch = JsonPatch.from_string(patch)
+ else:
+ patch = JsonPatch(patch)
return patch.apply(doc, in_place)
def make_patch(src, dst):
diff --git a/tests.py b/tests.py
index b195064..82a3e34 100755
--- a/tests.py
+++ b/tests.py
@@ -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'}])