3
dGZ_
@ s d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl Z ddl
mZmZ dZ
dZyddlmZmZ W n( ek
r ddlmZmZ eZY nX dZdZd Zd
Ze jd0kreefZG dd
d
eZG dd deZG dd deZG dd dee Z!dd Z"ej#ej$e"dZ%d1ddZ&dd Z'G dd de(Z)G dd de(Z*G d d! d!e*Z+G d"d# d#e*Z,G d$d% d%e*Z-G d&d' d'e*Z.G d(d) d)e*Z/G d*d+ d+e*Z0G d,d- d-e(Z1d.d/ Z2dS )2z Apply JSON-Patches (RFC 6902) )unicode_literalsN)JsonPointerJsonPointerException )MutableMappingMutableSequenceu Stefan Kögl z1.21z0https://github.com/stefankoegl/python-json-patchzModified BSD License c @ s e Zd ZdZdS )JsonPatchExceptionzBase Json Patch exceptionN)__name__
__module____qualname____doc__ r r /usr/lib/python3.6/jsonpatch.pyr G s r c @ s e Zd ZdZdS )InvalidJsonPatchz, Raised if an invalid JSON Patch is created N)r
r r r
r r r r r K s r c @ s e Zd ZdZdS )JsonPatchConflicta Raised if patch could not be applied due to conflict situation such as:
- attempt to add object key then it already exists;
- attempt to operate with nonexistence object key;
- attempt to insert value to array at position beyond of it size;
- etc.
N)r
r r r
r r r r r O s r c @ s e Zd ZdZdS )JsonPatchTestFailedz A Test operation failed N)r
r r r
r r r r r X s r c C s@ t jt}x| D ]\}}|| j| qW tdd |j D S )z'Convert duplicate keys values to lists.c s s. | ]&\}}|t |d kr |d n|fV qdS )r r N)len).0keyvaluesr r r e s zmultidict..)collectionsdefaultdictlistappenddictitems)Z
ordered_pairsZmdictr valuer r r multidict\ s
r )Zobject_pairs_hookFc C s* t |trtj|}nt|}|j| |S )aO Apply list of patches to specified json document.
:param doc: Document object.
:type doc: dict
:param patch: JSON patch as list of dicts or raw JSON-encoded string.
:type patch: list or str
:param in_place: While :const:`True` patch will modify target document.
By default patch will be applied to document copy.
:type in_place: bool
:return: Patched document object.
:rtype: dict
>>> doc = {'foo': 'bar'}
>>> patch = [{'op': 'add', 'path': '/baz', 'value': 'qux'}]
>>> other = apply_patch(doc, patch)
>>> doc is not other
True
>>> other == {'foo': 'bar', 'baz': 'qux'}
True
>>> patch = [{'op': 'add', 'path': '/baz', 'value': 'qux'}]
>>> apply_patch(doc, patch, in_place=True) == {'foo': 'bar', 'baz': 'qux'}
True
>>> doc == other
True
)
isinstance
basestring JsonPatchfrom_stringapply)docpatchin_placer r r apply_patcho s
r( c C s t j| |S )a Generates patch by comparing of two document objects. Actually is
a proxy to :meth:`JsonPatch.from_diff` method.
:param src: Data source document object.
:type src: dict
:param dst: Data source document object.
:type dst: dict
>>> src = {'foo': 'bar', 'numbers': [1, 3, 4, 8]}
>>> dst = {'baz': 'qux', 'numbers': [1, 4, 7]}
>>> patch = make_patch(src, dst)
>>> new = patch.apply(src)
>>> new == dst
True
)r" from_diff)srcdstr r r
make_patch s r, c @ s e Zd ZdZdd Zdd Zdd ZeZdd Zd
d Z dd
Z
dd Zedd Z
edddZdd Zedd Zd ddZdd ZdS )!r" ag A JSON Patch is a list of Patch Operations.
>>> patch = 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'},
... ])
>>> doc = {}
>>> result = patch.apply(doc)
>>> expected = {'foo': 'bar', 'baz': [42]}
>>> result == expected
True
JsonPatch object is iterable, so you could easily access to each patch
statement in loop:
>>> lpatch = list(patch)
>>> expected = {'op': 'add', 'path': '/foo', 'value': 'bar'}
>>> lpatch[0] == expected
True
>>> lpatch == patch.patch
True
Also JsonPatch could be converted directly to :class:`bool` if it contains
any operation statements:
>>> bool(patch)
True
>>> bool(JsonPatch([]))
False
This behavior is very handy with :func:`make_patch` to write more readable
code:
>>> old = {'foo': 'bar', 'numbers': [1, 3, 4, 8]}
>>> new = {'baz': 'qux', 'numbers': [1, 4, 7]}
>>> patch = make_patch(old, new)
>>> if patch:
... # document have changed, do something useful
... patch.apply(old) #doctest: +ELLIPSIS
{...}
c C s || _ ttttttd| _d S )N)removeaddreplacemoveZtestcopy)r&