allow replacing the root of the document

This fixes the test from
https://github.com/json-patch/json-patch-tests/commit/4db5098183c0e1d706b4525
This commit is contained in:
Stefan Kögl
2013-04-03 15:37:55 +02:00
parent 14fa4dd06c
commit f3e067281f

View File

@@ -300,7 +300,7 @@ class JsonPatch(object):
for operation in self.patch:
operation = self._get_operation(operation)
operation.apply(obj)
obj = operation.apply(obj)
return obj
@@ -351,6 +351,8 @@ class RemoveOperation(PatchOperation):
except KeyError as ex:
raise JsonPatchConflict(str(ex))
return obj
class AddOperation(PatchOperation):
"""Adds an object property or an array element."""
@@ -371,12 +373,19 @@ class AddOperation(PatchOperation):
subobj.insert(part, value)
elif isinstance(subobj, dict):
subobj[part] = value
if part is None:
# we're replacing the root
obj = value
else:
subobj[part] = value
else:
raise JsonPatchConflict("can't add to type '%s'"
"" % subobj.__class__.__name__)
return obj
class ReplaceOperation(PatchOperation):
"""Replaces an object property or an array element by new value."""
@@ -399,6 +408,7 @@ class ReplaceOperation(PatchOperation):
"" % subobj.__class__.__name__)
subobj[part] = value
return obj
class MoveOperation(PatchOperation):
@@ -412,8 +422,9 @@ class MoveOperation(PatchOperation):
if from_ptr.contains(self.pointer):
raise JsonPatchException('Cannot move values into its own children')
RemoveOperation({'op': 'remove', 'path': self.operation['from']}).apply(obj)
AddOperation({'op': 'add', 'path': self.location, 'value': value}).apply(obj)
obj = RemoveOperation({'op': 'remove', 'path': self.operation['from']}).apply(obj)
obj = AddOperation({'op': 'add', 'path': self.location, 'value': value}).apply(obj)
return obj
class TestOperation(PatchOperation):
@@ -435,6 +446,8 @@ class TestOperation(PatchOperation):
if val != value:
raise JsonPatchTestFailed('%s is not equal to tested value %s (types %s and %s)' % (val, value, type(val), type(value)))
return obj
class CopyOperation(PatchOperation):
""" Copies an object property or an array element to a new location """
@@ -443,4 +456,5 @@ class CopyOperation(PatchOperation):
from_ptr = jsonpointer.JsonPointer(self.operation['from'])
subobj, part = from_ptr.to_last(obj)
value = copy.deepcopy(subobj[part])
AddOperation({'op': 'add', 'path': self.location, 'value': value}).apply(obj)
obj = AddOperation({'op': 'add', 'path': self.location, 'value': value}).apply(obj)
return obj