stefankoegl / python-json-patch

Applying JSON Patches in Python
https://python-json-patch.readthedocs.org/
BSD 3-Clause "New" or "Revised" License
440 stars 96 forks source link

atomic patch application #115

Open johanneswilm opened 3 years ago

johanneswilm commented 3 years ago

Hey, I have a situation in which I am restrained in terms of memory, so I patch the the original object in place. That works fine, except that the patches are user provided, so sometimes they don't apply fully. If the patch has multiple steps, only the first steps up to the failure are applied. Fro example:

[
    {op: 'add', path: '/attrs/language', value: 'de-DE'},  # 1, valid
    {op: 'add', path: '/attrs/country', value: 'US'},  # 2, valid
    {op: 'remove', path: '/fish'},  # 3, invalid
    {op: 'remove', path: '/attrs/copyright'} # 4, valid 
]

What happens in this situation is that 1 and 2 are applied, then an error is thrown. Unfortunately, it is not possible for me to find out which steps are applied or to undo those steps, as far as I can tell. Is there a way I can have it unapply 1 and 2 after 3 threw an error?

Alanscut commented 3 years ago

Hi @johanneswilm, it seems that the original object is not changed only when in_place is set to false, as you mentioned, this will take up some memory. I think the un_apply API will make sense. May I ask what system are you using? what the size of your original object?

johanneswilm commented 3 years ago

Hey @Alanscut what do you mean by "system"? I can say that I am using this library within https://github.com/fiduswriter/fiduswriter to receive changes within a document from clients on the server. So the documents will be of varying sizes but there will normally be many documents opened by many different users at the same time. Where can I find more about the un_apply API? I did look at the documentation and didn't find it there.

Alanscut commented 3 years ago

I mean OS, never mind it. This lib doesn't have un_apply now, I just think this suggestion makes sense.