�
M`�p � � � d Z ddlmZ ddlZddlZddlZddlZddlZ ddlm Z n
# e
$ r eZ Y nw xY wddlm
Z
mZ dZdZ ddlmZmZ n# e
$ r
ddlmZmZ eZY nw xY wdZd Zd
ZdZej dk reefZ G d
� de� � Z G d� de� � Z G d� de� � Z G d� dee!� � Z"d� Z# ej$ ej% e#�� � Z&de
fd�Z'e
fd�Z( G d� de)� � Z* G d� de*� � Z+ G d� de*� � Z, G d � d!e*� � Z- G d"� d#e*� � Z. G d$� d%e*� � Z/ G d&� d'e*� � Z0 G d(� d)e)� � Z1 G d*� d+e)� � Z2d,� Z3dS )-z Apply JSON-Patches (RFC 6902) � )�unicode_literalsN)�MappingProxyType)�JsonPointer�JsonPointerException� )�MutableMapping�MutableSequenceu Stefan Kögl <stefan@skoegl.net>z1.32z0https://github.com/stefankoegl/python-json-patchzModified BSD License)� r c � � e Zd ZdZdS )�JsonPatchExceptionzBase Json Patch exceptionN��__name__�
__module__�__qualname__�__doc__� � �+/usr/lib/python3/dist-packages/jsonpatch.pyr r J � � � � � � �#�#�#�#r r c � � e Zd ZdZdS )�InvalidJsonPatchz, Raised if an invalid JSON Patch is created Nr
r r r r r N s � � � � � �6�6�6�6r r c � � e Zd ZdZdS )�JsonPatchConflicta
Raised if patch could not be applied due to conflict situation such as:
- attempt to add object key when it already exists;
- attempt to operate with nonexistence object key;
- attempt to insert value to array at position beyond its size;
- etc.
Nr
r r r r r R s � � � � � �� � � r r c � � e Zd ZdZdS )�JsonPatchTestFailedz A Test operation failed Nr
r r r r r [ r r r c �� � t j t � � }| D ] \ }}|| � |� � �!t d� |� � � D � � � � S )z'Convert duplicate keys values to lists.c 3 �Z K � | ]&\ }}|t |� � d k r|d n|fV � �'dS )r r N)�len)�.0�key�valuess r � <genexpr>zmultidict.<locals>.<genexpr>f sY � � � � � �
�C��
�3�v�;�;�!�+�+�f�Q�i�i��8�� � � � � r )�collections�defaultdict�list�append�dict�items)�
ordered_pairs�mdictr �values r � multidictr, _ sz � �
�#�D�)�)�E�#� !� !�
��U�
�c�
���%� � � � �� � � !�;�;�=�=�� � � � � r )�object_pairs_hookFc � � t |t � � rt � ||�� � }nt ||�� � }|� | |� � S )a� 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
:param pointer_cls: JSON pointer class to use.
:type pointer_cls: Type[JsonPointer]
: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
��pointer_cls)�
isinstance�
basestring� JsonPatch�from_string�apply)�doc�patch�in_placer0 s r �apply_patchr9 r sW � �B �%��$�$� :��%�%�e��%�E�E����%�[�9�9�9���;�;�s�H�%�%�%r c �< |