qRb*FdZddlmZdZdZdZdZ ddlmZe Z dZ n#e $re Zd Z YnwxYw dd lmZmZn#e $r dd lmZmZYnwxYwdd lmZmZdd lZdd lZeZddZefdZdZGddeZGddeZGddeZdZdZ d S)z7 Identify specific nodes in a JSON document (RFC 6901) )unicode_literalsu Stefan Kögl z2.3z2https://github.com/stefankoegl/python-json-pointerzModified BSD License)izipc,|dS)Nraw_unicode_escape)encodeus -/usr/lib/python3/dist-packages/jsonpointer.pyr /s188$899c|SNrs r r r 2s1r )MappingSequence)teechainNTcNt|}||||S)aResolves pointer against doc and sets the value of the target within doc. With inplace set to true, doc is modified as long as pointer is not the root. >>> obj = {'foo': {'anArray': [ {'prop': 44}], 'another prop': {'baz': 'A string' }}} >>> set_pointer(obj, '/foo/anArray/0/prop', 55) == {'foo': {'another prop': {'baz': 'A string'}, 'anArray': [{'prop': 55}]}} True >>> set_pointer(obj, '/foo/yet another prop', 'added prop') == {'foo': {'another prop': {'baz': 'A string'}, 'yet another prop': 'added prop', 'anArray': [{'prop': 55}]}} True >>> obj = {'foo': {}} >>> set_pointer(obj, '/foo/a%20b', 'x') == {'foo': {'a%20b': 'x' }} True ) JsonPointerset)docpointervalueinplaces r set_pointerrAs','""G ;;sE7 + ++r cLt|}|||S)aa Resolves pointer against doc and returns the referenced object >>> obj = {'foo': {'anArray': [ {'prop': 44}], 'another prop': {'baz': 'A string' }}, 'a%20b': 1, 'c d': 2} >>> resolve_pointer(obj, '') == obj True >>> resolve_pointer(obj, '/foo') == obj['foo'] True >>> resolve_pointer(obj, '/foo/another prop') == obj['foo']['another prop'] True >>> resolve_pointer(obj, '/foo/another prop/baz') == obj['foo']['another prop']['baz'] True >>> resolve_pointer(obj, '/foo/anArray/0') == obj['foo']['anArray'][0] True >>> resolve_pointer(obj, '/some/path', None) == None True >>> resolve_pointer(obj, '/a b', None) == None True >>> resolve_pointer(obj, '/a%20b') == 1 True >>> resolve_pointer(obj, '/c d') == 2 True >>> resolve_pointer(obj, '/c%20d', None) == None True )rresolve)rrdefaults r resolve_pointerr[s&H'""G ??3 ( ((r cPt|\}}|D]}t||S)z Transforms a list to a list of tuples of adjacent items s -> (s0,s1), (s1,s2), (s2, s3), ... >>> list(pairwise([])) [] >>> list(pairwise([1])) [] >>> list(pairwise([1, 2, 3, 4])) [(1, 2), (2, 3), (3, 4)] )rr)iterableab_s r pairwiser%s3 x==DAq  1::r ceZdZdS)JsonPointerExceptionN)__name__ __module__ __qualname__rr r r'r'sDr r'ceZdZdZdZdZdS) EndOfListz)Result of accessing element "-" of a listc||_dSr)list_)selfr.s r __init__zEndOfList.__init__s  r chd|jjt|jS)Nz {cls}({lst}))clslst)format __class__r(reprr.r/s r __repr__zEndOfList.__repr__s3$$)@)-dj)9)9%;; ;r N)r(r)r*__doc__r0r8rr r r,r,s833;;;;;r r,ceZdZdZejdZejdZdZdZ e fdZ e Z ddZ ed Zd Zd Zd Zd ZdZdZeZedZdZdZdZdZedZdS)rz:A JSON Pointer that can reference parts of a JSON documentz0|[1-9][0-9]*$z (~[^01]|~$)cF|j|}|r4td||d}|ddkrtdd|D}||_dS)NzFound invalid escape {}/rzLocation must start with /c,g|]}t|Sr)unescape.0parts r z(JsonPointer.__init__..s222D$222r )_RE_INVALID_ESCAPEsearchr'r4groupsplitpopparts)r/rinvalid_escaperIs r r0zJsonPointer.__init__s077@@  )&'@'G'G$$&&(((()) ) c"" 99Q<<2  &'CDD D22E222 r c|js|dfS|jddD]}|||}|t||jdfS)z>Resolves ptr until the last step, returns (sub-doc, last-step)N)rIwalkrget_partr/rrBs r to_lastzJsonPointer.to_lastsgz 9 JssO ' 'D))C&&CCK((djn====r c|jD]7} |||}#t$r|tur|cYcSwxYw|S)zBResolves the pointer against doc and returns the referenced object)rIrMr'_nothing)r/rrrBs r rzJsonPointer.resolveslJ # #D #iiT**' # # #h&&"NNNNN  #  s "==Tc$t|jdkr|rtd|S|stj|}||\}}t |tr|dkr||n|||<|S)zFResolve the pointer against the doc and replace the target with value.rzCannot set root in place-) lenrIr'copydeepcopyrP isinstancerappend)r/rrrparentrBs r rzJsonPointer.sets tz??a   G*+EFFFL %-$$Cc** fh ' ' !DCKK MM%  F4L r cft|tr|St|trU|dkr|Stjt |std|zt|St|dr|Stdt|z)z)Returns the next step in the correct typerTz"'%s' is not a valid sequence index __getitem__zXDocument '%s' does not support indexing, must be mapping/sequence or support __getitem__) rXrrr_RE_ARRAY_INDEXmatchstrr'inthasattrtype)r2rrBs r rNzJsonPointer.get_parts c7 # # fK X & & fs{{ .44SYY?? X*+ORV+VWWWt99  S- ( ( fK'(Y[_`c[d[d(eff fr c|jS)zYReturns the list of the parts. For example, JsonPointer('/a/b').get_parts() == ['a', 'b'])rIr7s r get_partszJsonPointer.get_partss zr ct||}t|dsJdt|t |t r?|dkrt |S ||S#t$rtd|dwxYw ||S#t$rtd|d|wxYw)z7 Walks one step in doc and returns the referenced part r\zinvalid document type rTzindex 'z' is out of boundszmember 'z' not found in ) rrNrarbrXrr, IndexErrorr'KeyErrorrOs r rMzJsonPointer.walk s##C..sM**UUU$s))),UUUU c8 $ $ Us{{ ~~% U4y  U U U**DDD+STTT U Tt9  T T T&&cc'RSS S Ts1A99BB## CcV|jdt|j|jkS)- Returns True if self contains the given ptr N)rIrU)r/ptrs r containszJsonPointer.contains&s"z/3sy>>/*ci77r c,||S)ri)rk)r/items r __contains__zJsonPointer.__contains__*s}}T"""r ct|tr|j}n,t|trt|j}n|} tt |j|S#t dxYw)zD Returns a new JsonPointer with the given suffix append to this ptr zInvalid suffix)rXrrIr_ from_partsrr')r/suffix suffix_partss r joinzJsonPointer.join.s fk * * "!>> ptr = JsonPointer('/~0/0/~1').path == '/~0/0/~1' c,g|]}t|Sr)escaper@s r rCz$JsonPointer.path..Es555$555r r=c3 K|] }d|zV dSr<Nrr@s r z#JsonPointer.path..Fs&44dsTz444444r )rIrs)r/rIs r pathzJsonPointer.path?s: 65$*555ww44e444444r cPt|tsdS|j|jkS)aCompares a pointer to another object Pointers can be compared by comparing their strings (or splitted strings), because no two different parts can point to the same structure in an object (eg no different number representations) F)rXrrI)r/others r __eq__zJsonPointer.__eq__Hs*%-- 5zU[((r cDtt|jSr)hashtuplerIr7s r __hash__zJsonPointer.__hash__UsE$*%%&&&r c*t|jSr) encode_strr}r7s r __str__zJsonPointer.__str__Xs$)$$$r c6dt|jzdzS)Nz JsonPointer())r6r}r7s r r8zJsonPointer.__repr__[sTY/#55r cnd|D}|dd|D}|S)zConstructs a JsonPointer from a list of (unescaped) paths >>> JsonPointer.from_parts(['a', '~', '/', 0]).path == '/a/~0/~1/0' True cFg|]}tt|Sr)ryr_r@s r rCz*JsonPointer.from_parts..es&555tD ""555r r=c3 K|] }d|zV dSr{rr@s r r|z)JsonPointer.from_parts..fs&77#*777777r ru)r2rIrjs r rpzJsonPointer.from_parts^sF65u555c"''777777788 r NT)r(r)r*r9recompiler]rDr0rPrRrgetr classmethodrNrdrMrkrnrsrv__div__propertyr}rrrr8rprr r rrsDD!bj!122O#M22    > > >$,     C(ff[f2 TTT2888### 9 9 9!!!G 55X5 ) ) )'''%%%666[r rcV|ddddS)N~~0r<~1replacess r ryryjs& 99S$   ' 'T 2 22r cV|ddddS)Nrr<rrrrs r r?r?ms& 99T3   ' 'c 2 22r r)!r9 __future__r __author__ __version__ __website__ __license__ itertoolsrunicoder_r ImportErrorzipcollections.abcrr collectionsrrrrVobjectrRrrr% Exceptionr'r,rryr?rr r rsB>=''''''0  B $  C99JJ DJJJ.111111111...----------.!  688,,,,4+3%)%)%)%)P(     9   ;;;;;;;;AAAAA&AAAH33333333s  ++8 AA