diff options
author | Kostya <suffering.death@gmail.com> | 2017-04-27 17:05:55 +0300 |
---|---|---|
committer | Kostya <suffering.death@gmail.com> | 2017-04-27 17:05:55 +0300 |
commit | e18a131be0aba0a065a5709f420ef88ec1a3fd83 (patch) | |
tree | 1e2d12c715dae5bd61cc2e89a7ff82f3984881cf /jsonpatch.py | |
parent | 05d9aceda8d0269c27d869f13d8ba0c7ca88104e (diff) | |
download | python-json-patch-e18a131be0aba0a065a5709f420ef88ec1a3fd83.tar.gz |
don't apply patch optimization when it's incorrect
Diffstat (limited to 'jsonpatch.py')
-rw-r--r-- | jsonpatch.py | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/jsonpatch.py b/jsonpatch.py index 1e2e3ac..0116ca2 100644 --- a/jsonpatch.py +++ b/jsonpatch.py @@ -171,6 +171,14 @@ def make_patch(src, dst): >>> new == dst True """ + + # TODO: fix patch optimiztion and remove the following check + # fix when patch with optimization is incorrect + patch = JsonPatch.from_diff(src, dst) + new = patch.apply(src) + if new != dst: + return JsonPatch.from_diff(src, dst, False) + return JsonPatch.from_diff(src, dst) @@ -268,7 +276,7 @@ class JsonPatch(object): return cls(patch) @classmethod - def from_diff(cls, src, dst): + def from_diff(cls, src, dst, optimization=True): """Creates JsonPatch instance based on comparing of two document objects. Json patch would be created for `src` argument against `dst` one. @@ -320,7 +328,7 @@ class JsonPatch(object): 'value': dst[key]} def compare_lists(path, src, dst): - return _compare_lists(path, src, dst) + return _compare_lists(path, src, dst, optimization=optimization) return cls(list(compare_values([], src, dst))) @@ -561,9 +569,12 @@ class CopyOperation(PatchOperation): return obj -def _compare_lists(path, src, dst): +def _compare_lists(path, src, dst, optimization=True): """Compares two lists objects and return JSON patch about.""" - return _optimize(_compare(path, src, dst, *_split_by_common_seq(src, dst))) + patch = list(_compare(path, src, dst, *_split_by_common_seq(src, dst))) + if optimization: + return list(_optimize(patch)) + return patch def _longest_common_subseq(src, dst): |