-
Notifications
You must be signed in to change notification settings - Fork 95
Open
Description
I encountered unexpected behavior when running the example in the docs here. After applying, the patch itself has changed. I expected it to be immutable so I could re-use the patch object, but this is not the case.
Example:
patch = jsonpatch.JsonPatch([
{'op': 'add', 'path': '/foo', 'value': 'bar'},
{'op': 'add', 'path': '/baz', 'value': [1, 2, 3]},
{'op': 'remove', 'path': '/baz/1'},
{'op': 'test', 'path': '/baz', 'value': [1, 3]},
{'op': 'replace', 'path': '/baz/0', 'value': 42},
{'op': 'remove', 'path': '/baz/1'},
])
d = {}
patch.apply(d)
print(patch.patch)
> # Prints:
> # [{'op': 'add', 'path': '/foo', 'value': 'bar'}
> # {'op': 'add', 'path': '/baz', 'value': [42]},
> # {'op': 'remove', 'path': '/baz/1'},
> # {'op': 'test', 'path': '/baz', 'value': [1, 3]},
> # {'op': 'replace', 'path': '/baz/0', 'value': 42},
> # {'op': 'remove', 'path': '/baz/1'}]
# d is still the same empty dict
print(d)
> # Prints:
> # {}
# Try to patch again:
patch.apply(d)
> # ...omitted some traceback
> # JsonPatchConflict: can't remove a non-existent object '1'
Note that the second operation is now different from what it was originally.
In the docs here, it says
If a patch is only used once, it is not necessary to create a patch object explicitly.
which implies that a jsonpatch.JsonPatch
object can be used more than once. However, it appears that a patch is potentially single-use, depending on whether it includes mutable values (lists/dicts).
I think this can be resolved by doing a deepcopy when initializing the operation
attribute in the PatchOperation
class.
Benoye
Metadata
Metadata
Assignees
Labels
No labels