3 5*[Z¸@ã@s¸dZddlmZddlZddlZddlZddlZddlZddlZdZ ej dkrdddlm Z dd„Z nej d d ƒZd d „Z d d„Z y ejZWnek r¦dd„ZYnXej ddƒZdd„ZejdƒZGdd„deƒZffdd„Zd*dd„ZyddlmZWn"ek �rddlmZYnXGdd„deƒZe ejƒZe ej!ƒZ"e"dk�rhej# �rhd d!„Zee_n,e"dk�r|ej#�r|ne"d"k�r”d#d!„Zee_eeƒZ$d$d%„Z%d&d'„Z&d(d)„Z'dS)+zT Decorator module, see http://pypi.python.org/pypi/decorator for the documentation. é)Úprint_functionNz4.2.1Ú3)ÚgetfullargspeccCs|jS)N)Ú__init__)Úcls©rú/usr/lib/python3.6/decorator.pyÚget_init0sr Ú FullArgSpecz5args varargs varkw defaults kwonlyargs kwonlydefaultscCstjtj|ƒgdfƒS)z?A quick and dirty replacement for getfullargspec for Python 2.XN)r Ú_makeÚinspectÚ getargspec)Úfrrrr7srcCs|jjS)N)rÚ__func__)rrrrr ;scCsdS)NFr)rrrrÚiscoroutinefunctionBsrÚArgSpeczargs varargs varkw defaultscCst|ƒ}t|j|j|j|jƒS)z$A replacement for inspect.getargspec)rrÚargsÚvarargsÚvarkwÚdefaults)rÚspecrrrr Jsr z\s*def\s*([_\w][_\w\d]*)\s*\(c@sZeZdZdZejƒZfZZZ Z Z Z d dd„Z dd„Zddd „Zedd d „ƒZdS)Ú FunctionMakerz´ An object with the ability to create functions with a given signature. It has attributes name, doc, module, signature, defaults, dict and methods update and make. NcCsÞ||_|�rf|j|_|jdkr$d|_|j|_|j|_tj|ƒ�rft |ƒ}t |diƒ|_ xdD]} t || t || ƒƒq\Wx&t |jƒD]\} } t |d | | ƒq‚Wt|jƒ} t|jƒ} |jrÚ| jd |jƒ| jd |jƒn|jrê| jd ƒx.|jD]$} | jd | ƒ| jd | | fƒqòW|j�rB| jd|jƒ| jd|jƒdj| ƒ|_dj| ƒ|_|jjƒ|_|�rr||_|dk �r‚||_|�rŽ||_|�rš||_|�r¦||_|�r²||_t|dƒ�sÂt‚t|dƒ�sÚtd|ƒ‚dS)NzÚ_lambda_Ú__annotations__rrrrÚ kwonlyargsÚkwonlydefaultszarg%dÚ*z%s=Nonez%s=%sz**z, ÚnameÚ signaturez%You are decorating a non function: %s)rrrrrr)ÚshortsignatureÚ__name__rÚ__doc__ÚdocÚ __module__Úmoduler Ú isfunctionrÚgetattrÚ annotationsÚsetattrÚ enumeraterÚlistrÚappendrrÚjoinrÚ__dict__ÚcopyÚdictrÚhasattrÚAssertionErrorÚ TypeError)ÚselfÚfuncrrrr"r$ZfuncdictZargspecÚaÚiÚargZallargsZ allshortargsrrrras\           zFunctionMaker.__init__c Ksš|j|_t|ddƒ|_t|diƒ|_|j|_|jp4d|_t|ddƒ|_ yt j dƒ}Wnt k rld}YnX|j jddƒ}t|d|ƒ|_|jj|ƒdS) z2Update the signature of func with the data in selfr"Nr/r'éú?r r$)rr r&r!r-rÚ __defaults__rÚ__kwdefaults__rÚsysÚ _getframeÚAttributeErrorÚ f_globalsÚgetr#Úupdate)r3r4ÚkwÚframeZ callermodulerrrrA•s  zFunctionMaker.updateFc Ks|t|ƒ}|pi}tj|ƒ}|dkr2td|ƒ‚|jdƒ}t|gdd„|jjdƒDƒƒ}x$|D]} | dkrbtd | |fƒ‚qbW|j d ƒs”|d 7}d t |j ƒf} yt || d ƒ} t | |ƒWn*td tjd�t|tjd�‚YnX||} |�r||d<|j| f|Ž| S)zBMake a new function from a given template and update the signatureNz not a valid function template %sécSsg|]}|jdƒ‘qS)z *)Ústrip)Ú.0r7rrrú ®sz&FunctionMaker.make..ú,Ú_func_Ú_call_z%s is overridden in %sÚ zZsinglezError in generated code:)ÚfileZ __source__)rIrJ)ÚvarsÚDEFÚsearchÚ SyntaxErrorÚgroupÚsetrÚsplitÚ NameErrorÚendswithÚnextÚ_compile_countÚcompileÚexecÚprintr<ÚstderrrA) r3Z src_templÚevaldictÚ addsourceÚattrsÚsrcÚmorÚnamesÚnÚfilenameÚcoder4rrrÚmake¦s4        zFunctionMaker.makeTcKs¨t|tƒr0|jƒjddƒ\} } | dd …} d} n d} d} |} || | | |||ƒ} djdd„|jƒDƒƒ}|jdƒ}|rŽt|ƒrŽd|jd d ƒ}nd |}| j |||f|ŽS) zú Create a function from the strings name, signature and body. evaldict is the evaluation dictionary. If addsource is true an attribute __source__ is added to the result. The attributes attrs are added, if any. ú(rDNrKcss|]}d|VqdS)z Nr)rFÚlinerrrú Úsz'FunctionMaker.create..rJz#async def %(name)s(%(signature)s): Úreturnz return awaitzdef %(name)s(%(signature)s): éÿÿÿÿ) Ú isinstanceÚstrrErSr,Ú splitlinesr@rÚreplacere)rÚobjZbodyr\rr"r$r]r^rÚrestrr4r3ZibodyÚcallerrrrÚcreateÈs     zFunctionMaker.create)NNNNNNN)NF)NNNT)r r#Ú __qualname__r!Ú itertoolsÚcountrWrrrrrrrrAreÚ classmethodrrrrrrrTs 3 "rc Csnt||d�}d}x0t|ƒD]$\}}d|}|||<||d7}qWtj|d|||d�}t|dƒrj|j|_|S)zE decorate(func, caller) decorates a function using a caller. )rJrIÚz_e%d_z, z,return _call_(_func_, %s%%(shortsignature)s))Ú __wrapped__rs)r/r)rrrr0rs) r4rqZextrasr\Zesr6ZextraZexZfunrrrÚdecorateäs   ryc Cs|dk rt||ƒSdf}}tj|ƒrB|jjƒ}d|j|jf}n~tj|ƒr¬|jdkr\d}n|j}|j}|jj}t |j pzfƒ}dj |jj |||…ƒ}|r¤|d7}|j }n|j jjƒ}|jj}t|td�}tjd ||fd ||f|||j|d �} |�rd || _ | S) z=decorator(caller) converts a caller function into a decoratorNrwzHdecorator(%s) converts functions/generators into factories of %s objectszrz, rH)Ú_callZ _decorate_z %s(func, %s)zhif func is None: return lambda func: _decorate_(func, _call, (%s)) return _decorate_(func, _call, (%s)))r"r$rx)N)ryr Zisclassr Úlowerr%r!Ú__code__Ú co_argcountÚlenr:r,Ú co_varnamesÚ __class__Ú__call__r/rrrr#) rqZ_funcZ defaultargsrrr"ÚnargsZndefsr\ÚdecrrrÚ decoratorös:          r„)Ú_GeneratorContextManager)ÚGeneratorContextManagerc@seZdZdd„ZdS)ÚContextManagercCstj|dt||d�|d�S)zContext manager decoratorz.with _self_: return _func_(%(shortsignature)s))Z_self_rI)rx)rrrr/)r3r4rrrr�#szContextManager.__call__N)r r#rsr�rrrrr‡"sr‡écOstj||||ŽƒS)N)r…r)r3Úgr5Úkrrrr-srécOstj||||ƒS)N)r…r)r3r‰r5rŠrrrr3scCst|ƒS)N)Ú_contextmanager)r4rrrÚcontextmanager:sr�cCsRd}x:t|ƒD].\}}t||ƒr&d}Pt||ƒr|||<d}qW|rN|j|ƒdS)z_ Append ``a`` to the list of the virtual ancestors, unless it is already included. TFN)r)Ú issubclassr+)r5Ú vancestorsÚaddÚjÚvarrrr+As  r+csLˆs tdƒ‚ddjˆƒ‰tjdf‡fdd„ ‰‡‡‡fdd„}d ˆ|_|S) zr Factory of decorators turning a function into a generic function dispatching on the given arguments. zNo dispatch args passedz(%s,)z, rwcs0|t|ƒtˆƒƒr,tdtˆƒt|ƒ|fƒ‚dS)z5Make sure one passes the expected number of argumentszExpected %d arguments, got %d%sN)r~r2)Z argumentsZwrongÚmsg)Ú dispatch_argsrrÚcheck[szdispatch_on..checkc sœttˆƒjƒ}tˆƒ|ks&tdˆƒ‚i‰‡‡‡fdd„‰‡‡fdd„‰‡‡fdd„}‡‡fdd „}‡‡‡fd d „}tjˆd ˆt|d �|ˆˆˆˆ|ˆd� S)z4Decorator turning a function into a generic functionzUnknown dispatch arguments %scsvˆ|ƒdd„ttˆƒƒDƒ}xHˆD]@}x:t|||ƒD]*\}}}t||ƒr6||jƒkr6t||ƒq6Wq$Wdd„|DƒS)zU Get a list of sets of virtual ancestors for the given types cSsg|]}g‘qSrr)rFÚ_rrrrGpszIdispatch_on..gen_func_dec..vancestors..cSsg|] }t|ƒ‘qSr)rR)rFÚrarrrrGus)Úranger~ÚziprŽÚmror+)ÚtypesZrasÚtypes_ÚtZtype_r—)r•r”Útypemaprrr�ks z5dispatch_on..gen_func_dec..vancestorscs”ˆ|ƒg}x‚t|ˆ|ŽƒD]p\}}t|ƒ}|dkrFtd||fƒ‚n4|dkrr|\}td||fiƒjƒdd…}n|jƒ}|j|dd…ƒqW|S)zG Get a list of virtual MROs, one for each type rDzAmbiguous dispatch for %s: %sr�Nrj)r™r~Ú RuntimeErrorÚtyperšr+)r›Zlistsr�ZvasZn_vasr’rš)r•r�rrÚ ancestorswsz4dispatch_on..gen_func_dec..ancestorscsˆˆƒ‡‡‡fdd„}|S)zU Decorator to register an implementation for the given types cs&ˆt|ƒjtjd|jƒ|ˆˆ<|S)Nz in )rrÚoperatorÚltr )r)r•ržr›rrrƒ�sz@dispatch_on..gen_func_dec..register..decr)r›rƒ)r•rž)r›rÚregisterŠsz3dispatch_on..gen_func_dec..registercs@ˆ|ƒg}x.tjˆ|ŽŽD]}|jtdd„|DƒƒƒqW|S)zI An utility to introspect the dispatch algorithm css|] }|jVqdS)N)r )rFr5rrrrh�szKdispatch_on..gen_func_dec..dispatch_info..)rtÚproductr+Útuple)r›ZlstZanc)r¡r•rrÚ dispatch_info–s z8dispatch_on..gen_func_dec..dispatch_infoc sˆtdd„|Dƒƒ}y ˆ|}Wntk r2Yn X|||ŽStjˆ|ŽŽ}t|ƒx(|D] }ˆj|ƒ}|dk rZ|||ŽSqZWˆ||ŽS)Ncss|]}t|ƒVqdS)N)r )rFr7rrrrh¡szGdispatch_on..gen_func_dec.._dispatch..)r¦ÚKeyErrorrtr¥rVr@)r”rrBr›rÚ combinationsrœ)r¡r4ržrrÚ _dispatch s    z4dispatch_on..gen_func_dec.._dispatchz#return _f_(%s, %%(shortsignature)s))Z_f_)r¤Údefaultržr�r¡r§rx)rRrrrTrrrr/)r4Zargsetr¤r§rª)r•r”Ú dispatch_str)r¡r4ržr�rÚ gen_func_decas      z!dispatch_on..gen_func_decÚ dispatch_on)r1r,r¢Úner )r”r­r)r•r”r¬rr®Ss  W r®)N)(r!Z __future__rÚrer<r r¢rtÚ collectionsÚ __version__Úversionrr Ú namedtupler rr>rr rXrNÚobjectrryr„Ú contextlibr…Ú ImportErrorr†r‡rZinitr~rZn_argsrrŒr�r+r®rrrrÚ!s\        &