update "test" behaviour according to latest spec
This commit is contained in:
2
README
2
README
@@ -3,7 +3,7 @@ python-json-patch: Applying JSON Patches
|
|||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Library to apply JSON Patches according to
|
Library to apply JSON Patches according to
|
||||||
http://tools.ietf.org/html/draft-ietf-appsawg-json-patch-03
|
http://tools.ietf.org/html/draft-ietf-appsawg-json-patch-04
|
||||||
|
|
||||||
See Sourcecode for Examples
|
See Sourcecode for Examples
|
||||||
|
|
||||||
|
|||||||
17
jsonpatch.py
17
jsonpatch.py
@@ -31,7 +31,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
"""Apply JSON-Patches according to
|
"""Apply JSON-Patches according to
|
||||||
http://tools.ietf.org/html/draft-ietf-appsawg-json-patch-03"""
|
http://tools.ietf.org/html/draft-ietf-appsawg-json-patch-04"""
|
||||||
|
|
||||||
# Will be parsed by setup.py to determine package metadata
|
# Will be parsed by setup.py to determine package metadata
|
||||||
__author__ = 'Stefan Kögl <stefan@skoegl.net>'
|
__author__ = 'Stefan Kögl <stefan@skoegl.net>'
|
||||||
@@ -63,6 +63,9 @@ class JsonPatchConflict(JsonPatchException):
|
|||||||
- etc.
|
- etc.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
class JsonPatchTestFailed(JsonPatchException, AssertionError):
|
||||||
|
""" A Test operation failed """
|
||||||
|
|
||||||
|
|
||||||
def apply_patch(doc, patch, in_place=False):
|
def apply_patch(doc, patch, in_place=False):
|
||||||
"""Apply list of patches to specified json document.
|
"""Apply list of patches to specified json document.
|
||||||
@@ -412,9 +415,17 @@ class TestOperation(PatchOperation):
|
|||||||
"""Test value by specified location."""
|
"""Test value by specified location."""
|
||||||
|
|
||||||
def apply(self, obj):
|
def apply(self, obj):
|
||||||
value = self.operation['value']
|
try:
|
||||||
subobj, part = self.locate(obj, self.location)
|
subobj, part = self.locate(obj, self.location)
|
||||||
assert subobj[part] == value
|
except JsonPatchConflict, c:
|
||||||
|
raise JsonPatchTestFailed(str(c))
|
||||||
|
|
||||||
|
val = subobj[part]
|
||||||
|
|
||||||
|
if 'value' in self.operation:
|
||||||
|
value = self.operation['value']
|
||||||
|
if val != value:
|
||||||
|
raise JsonPatchTestFailed('%s is not equal to tested value %s' % (val, value))
|
||||||
|
|
||||||
|
|
||||||
class CopyOperation(PatchOperation):
|
class CopyOperation(PatchOperation):
|
||||||
|
|||||||
30
tests.py
30
tests.py
@@ -105,11 +105,39 @@ class ApplyPatchTestCase(unittest.TestCase):
|
|||||||
|
|
||||||
def test_test_error(self):
|
def test_test_error(self):
|
||||||
obj = {'bar': 'qux'}
|
obj = {'bar': 'qux'}
|
||||||
self.assertRaises(AssertionError,
|
self.assertRaises(jsonpatch.JsonPatchTestFailed,
|
||||||
jsonpatch.apply_patch,
|
jsonpatch.apply_patch,
|
||||||
obj, [{'test': '/bar', 'value': 'bar'}])
|
obj, [{'test': '/bar', 'value': 'bar'}])
|
||||||
|
|
||||||
|
|
||||||
|
def test_test_not_existing(self):
|
||||||
|
obj = {'bar': 'qux'}
|
||||||
|
self.assertRaises(jsonpatch.JsonPatchTestFailed,
|
||||||
|
jsonpatch.apply_patch,
|
||||||
|
obj, [{'test': '/baz', 'value': 'bar'}])
|
||||||
|
|
||||||
|
|
||||||
|
def test_test_noval_existing(self):
|
||||||
|
obj = {'bar': 'qux'}
|
||||||
|
jsonpatch.apply_patch(obj, [{'test': '/bar'}])
|
||||||
|
|
||||||
|
|
||||||
|
def test_test_noval_not_existing(self):
|
||||||
|
obj = {'bar': 'qux'}
|
||||||
|
self.assertRaises(jsonpatch.JsonPatchTestFailed,
|
||||||
|
jsonpatch.apply_patch,
|
||||||
|
obj, [{'test': '/baz'}])
|
||||||
|
|
||||||
|
|
||||||
|
def test_test_noval_not_existing_nested(self):
|
||||||
|
obj = {'bar': {'qux': 2}}
|
||||||
|
self.assertRaises(jsonpatch.JsonPatchTestFailed,
|
||||||
|
jsonpatch.apply_patch,
|
||||||
|
obj, [{'test': '/baz/qx'}])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MakePatchTestCase(unittest.TestCase):
|
class MakePatchTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def test_apply_patch_to_copy(self):
|
def test_apply_patch_to_copy(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user