Current File : //usr/lib/python2.7/site-packages/jsonpatch.pyo
�
��URc@s�ddlmZdZdZdZdZddlZddlZddlZddl	Z	ddl
Z
ddlZejd#kr�e
efZnejZd	efd
��YZdefd��YZd
eefd��YZd�Zd�Ze�e
_ed�Zd�Zdefd��YZdefd��YZdefd��YZdefd��YZ defd��YZ!defd��YZ"defd ��YZ#d!efd"��YZ$dS($i����(tunicode_literalsu Stefan Kögl <stefan@skoegl.net>u1.2u0https://github.com/stefankoegl/python-json-patchuModified BSD LicenseNiitJsonPatchExceptioncBseZdZRS(uBase Json Patch exception(t__name__t
__module__t__doc__(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR:stJsonPatchConflictcBseZdZRS(u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.
    (RRR(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR>stJsonPatchTestFailedcBseZdZRS(u A Test operation failed (RRR(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyRFscCs�tjt�}x%|D]\}}||j|�qWx=|j�D]/\}}t|�dkrD|d||<qDqDWt|�S(u'Convert duplicate keys values to lists.ii(tcollectionstdefaultdicttlisttappendtitemstlentdict(t
ordered_pairstdtktv((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt	multidictJscCsVddl}ddl}|jtj�}d|jkr@tjS|jtjdt�S(u� adds the object_pairs_hook parameter to json.load when possible

    The "object_pairs_hook" parameter is used to handle duplicate keys when
    loading a JSON object. This parameter does not exist in Python 2.6. This
    methods returns an unmodified json.load for Python 2.6 and a partial
    function with object_pairs_hook set to multidict for Python versions that
    support the parameter. i����Nuobject_pairs_hooktobject_pairs_hook(tinspectt	functoolst
getargspectjsontloadtargstpartialR(RRtargspec((s-/usr/lib/python2.7/site-packages/jsonpatch.pytget_loadjsonXs	cCs=t|t�r!tj|�}nt|�}|j||�S(u#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'}
    >>> other = apply_patch(doc, [{'op': 'add', 'path': '/baz', 'value': 'qux'}])
    >>> doc is not other
    True
    >>> other == {'foo': 'bar', 'baz': 'qux'}
    True
    >>> apply_patch(doc, [{'op': 'add', 'path': '/baz', 'value': 'qux'}], in_place=True) == {'foo': 'bar', 'baz': 'qux'}
    True
    >>> doc == other
    True
    (t
isinstancet
basestringt	JsonPatchtfrom_stringtapply(tdoctpatchtin_place((s-/usr/lib/python2.7/site-packages/jsonpatch.pytapply_patchmscCstj||�S(u�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
    (Rt	from_diff(tsrctdst((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt
make_patch�sRcBs�eZdZd�Zd�Zd�ZeZd�Zd�Zd�Z	e
d��Ze
d��Zd	�Z
ed
��Zed�Zd�ZRS(
ugA 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
    {...}
    cCs@||_itd6td6td6td6td6td6|_dS(Nuremoveuaddureplaceumoveutestucopy(R#tRemoveOperationtAddOperationtReplaceOperationt
MoveOperationt
TestOperationt
CopyOperationt
operations(tselfR#((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt__init__�s	cCs
|j�S(ustr(self) -> self.to_string()(t	to_string(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt__str__�scCs
t|j�S(N(tboolR#(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt__bool__�scCs
t|j�S(N(titerR#(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt__iter__�scCstt|j��S(N(thashttuplet_ops(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt__hash__�scCs\t|t�stStt|j��tt|j��ko[tttj	|j|j��S(N(
RRtFalseRR	R;talltmaptoperatorteq(R1tother((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt__eq__�s*cCstj|�}||�S(u�Creates JsonPatch instance from string source.

        :param patch_str: JSON patch as raw string.
        :type patch_str: str

        :return: :class:`JsonPatch` instance.
        (Rtloads(tclst	patch_strR#((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR �s	csO��fd���fd���fd��|t�dg||���S(uOCreates JsonPatch instance based on comparing of two document
        objects. Json patch would be created for `src` argument against `dst`
        one.

        :param src: Data source document object.
        :type src: dict

        :param dst: Data source document object.
        :type dst: dict

        :return: :class:`JsonPatch` instance.

        >>> src = {'foo': 'bar', 'numbers': [1, 3, 4, 8]}
        >>> dst = {'baz': 'qux', 'numbers': [1, 4, 7]}
        >>> patch = JsonPatch.from_diff(src, dst)
        >>> new = patch.apply(src)
        >>> new == dst
        True
        c3s�||krdSt|t�rSt|t�rSx��|||�D]}|VqAWnft|t�r�t|t�r�xE�|||�D]}|Vq�Wn#idd6dj|�d6|d6VdS(Nureplaceuopu/upathuvalue(RR
R	tjoin(tpathtvalueRBt	operation(tcompare_dicttcompare_list(s-/usr/lib/python2.7/site-packages/jsonpatch.pytcompare_valuessc3s�xz|D]r}||krBidd6dj||g�d6Vqn||g}x'�|||||�D]}|VqjWqWxK|D]C}||kr�idd6dj||g�d6||d6Vq�q�WdS(Nuremoveuopu/upathuadduvalue(RG(RHR'R(tkeytcurrentRJ(RM(s-/usr/lib/python2.7/site-packages/jsonpatch.pyRK#s
#
!

c3s5t|�t|�}}xZtt||��D]C}|t|�g}x'�|||||�D]}|VqcWq/W||kr�x�t||�D]@}|t|�g}idd6dj|�d6||d6Vq�WnX||kr1xItt||��D]/}idd6dj|t|�g�d6Vq�WndS(Nuadduopu/upathuvalueuremove(RtrangetmintstrRGtreversed(RHR'R(tlsrctldsttidxRORJ(RM(s-/usr/lib/python2.7/site-packages/jsonpatch.pyRL/s!
.u(R	(RER'R(((RKRLRMs-/usr/lib/python2.7/site-packages/jsonpatch.pyR&scCstj|j�S(u!Returns patch set as JSON string.(RtdumpsR#(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR3?scCst|j|j�S(N(R?t_get_operationR#(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR;CscCs?|stj|�}nx |jD]}|j|�}q"W|S(u/Applies the patch to given object.

        :param obj: Document object.
        :type obj: dict

        :param in_place: Tweaks way how patch would be applied - directly to
                         specified `obj` or to his copy.
        :type in_place: bool

        :return: Modified `obj`.
        (tcopytdeepcopyR;R!(R1tobjR$RJ((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR!Gs

cCs|d|krtd��n|d}t|t�sCtd��n||jkretd|��n|j|}||�S(Nuopu&Operation does not contain 'op' memberuOperation must be a stringuUnknown operation '%s'(RRRR0(R1RJtopRE((s-/usr/lib/python2.7/site-packages/jsonpatch.pyRX\s

(RRRR2R4R6t__nonzero__R8R<RCtclassmethodR R&R3tpropertyR;R=R!RX(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR�s-						=	tPatchOperationcBs2eZdZd�Zd�Zd�Zd�ZRS(u'A single operation inside a JSON Patch.cCs/|d|_tj|j�|_||_dS(Nupath(tlocationtjsonpointertJsonPointertpointerRJ(R1RJ((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR2ps
cCstd��dS(uAAbstract method that applies patch operation to specified object.u!should implement patch operation.N(tNotImplementedError(R1R[((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR!uscCstt|jj���S(N(R9t	frozensetRJR(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR<zscCs#t|t�stS|j|jkS(N(RR`R=RJ(R1RB((s-/usr/lib/python2.7/site-packages/jsonpatch.pyRC~s(RRRR2R!R<RC(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR`ms
			R*cBseZdZd�ZRS(u/Removes an object property or an array element.cCsO|jj|�\}}y||=Wn%tk
rJ}tt|���nX|S(N(Rdtto_lastt
IndexErrorRRR(R1R[tsubobjtparttex((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR!�s(RRRR!(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR*�sR+cBseZdZd�ZRS(u,Adds an object property or an array element.cCs�|jd}|jj|�\}}t|t�r�|dkrP|j|�q�|t|�ksn|dkr}td��q�|j||�n1t|t	�r�|dkr�|}q�|||<n|S(Nuvalueu-iucan't insert outside of list(RJRdRgRR	R
RRtinsertR
tNone(R1R[RIRiRj((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR!�s
	
(RRRR!(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR+�sR,cBseZdZd�ZRS(u=Replaces an object property or an array element by new value.cCs�|jd}|jj|�\}}|dkr5|St|t�rt|t|�ksb|dkr�td��q�n1t|t�r�||kr�td|��q�n|||<|S(Nuvalueiucan't replace outside of listu&can't replace non-existant object '%s'(	RJRdRgRmRR	RRR
(R1R[RIRiRj((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR!�s

(RRRR!(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR,�sR-cBseZdZd�ZRS(u=Moves an object property or an array element to new location.cCs�tj|jd�}|j|�\}}||}|jj|�rVtd��ntidd6|jdd6�j|�}t	idd6|j
d6|d6�j|�}|S(Nufromu(Cannot move values into its own childrenuremoveuopupathuadduvalue(RbRcRJRgRdtcontainsRR*R!R+Ra(R1R[tfrom_ptrRiRjRI((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR!�s
*-(RRRR!(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR-�sR.cBseZdZd�ZRS(u!Test value by specified location.cCs�yF|jj|�\}}|dkr0|}n|jj||�}Wn%tk
rm}tt|���nXd|jkr�|jd}||kr�td||t|�t|�f��q�n|S(Nuvalueu4%s is not equal to tested value %s (types %s and %s)(	RdRgRmtwalktJsonPointerExceptionRRRRJttype(R1R[RiRjtvalRkRI((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR!�s	
.(RRRR!(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR.�sR/cBseZdZd�ZRS(uA Copies an object property or an array element to a new location cCsotj|jd�}|j|�\}}tj||�}tidd6|jd6|d6�j|�}|S(Nufromuadduopupathuvalue(	RbRcRJRgRYRZR+RaR!(R1R[RoRiRjRI((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR!�s
-(RRRR!(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR/�s(ii(%t
__future__Rt
__author__t__version__t__website__t__license__RYtsysR@RRRbtversion_infotbytesRRRRqt	ExceptionRRtAssertionErrorRRRRR=R%R)tobjectRR`R*R+R,R-R.R/(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt<module>!s:			"	�
"