o
    ˷epA                     @   s   d Z ddlZddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
 dZedZejjZejjZG dd deZd	d
 ZdddZdd ZdddZG dd deZeeZdd Zdd Zdd ZdS )zv
Decorator module, see
https://github.com/micheles/decorator/blob/master/docs/documentation.md
for the documentation.
    N)_GeneratorContextManager)getfullargspeciscoroutinefunctionisgeneratorfunctionz5.1.1z\s*def\s*([_\w][_\w\d]*)\s*\(c                   @   sb   e Zd ZdZe Zd Z Z Z	 Z
 ZZ		dddZdd Zdd	d
Ze		dddZdS )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.
     Nc                 C   s  || _ |r|j| _| jdkrd| _|j| _|j| _t|rt	|}t
|di | _dD ]}	t| |	t
||	 q+t| jD ]\}
}t| d|
 | q<t| j}t| j}| jrg|d| j  |d| j  n| jro|d | jD ]}	|d|	  |d|	|	f  qr| jr|d	| j  |d	| j  d
|| _d
|| _ |j | _|r|| _|d ur|| _|r|| _|r|| _|r|| _|r|| _t| dsJ t| dstd| d S )Nz<lambda>_lambda___annotations__)argsvarargsvarkwdefaults
kwonlyargskwonlydefaultszarg%d*z%s=Nonez%s=%sz**, name	signaturez%You are decorating a non function: %s)shortsignature__name__r   __doc__doc
__module__moduleinspect	isroutiner   getattrannotationssetattr	enumerater
   listr   appendr   r   joinr   __dict__copydictr   hasattr	TypeError)selffuncr   r   r   r   r   funcdictargspecaiargallargsallshortargsr   r   @/var/www/ideatree/venv/lib/python3.10/site-packages/decorator.py__init__@   s\   






zFunctionMaker.__init__c                 K   s   | j |_t| dd|_t| di |_| j|_| jpd|_t| dd|_	zt
d}W n ty5   d}Y nw |jdd}t| d||_|j| dS )	zD
        Update the signature of func with the data in self
        r   Nr%   r      ?r   r   )r   r   r   r   r#   r   __defaults__r   __kwdefaults__r	   sys	_getframeAttributeError	f_globalsgetr   update)r(   r)   kwframecallermoduler   r   r1   r<   t   s   zFunctionMaker.updateFc                 K   s  |t |  }|p	i }t|}|du rtd| |d}t|gdd | jdD  }|D ]}	|	dv r>td|	|f q0|	d	sH|d	7 }d
t
| j }
zt||
d}t|| W n tyr   tdtjd t|tjd  w || }|r}||d< | j|fi | |S )zT
        Make a new function from a given template and update the signature
        Nz not a valid function template
%s   c                 S   s   g | ]}| d qS )z *)strip.0r.   r   r   r1   
<listcomp>   s    z&FunctionMaker.make.<locals>.<listcomp>,)_func__call_z%s is overridden in
%s
z<decorator-gen-%d>singlezError in generated code:)file
__source__)varsDEFsearchSyntaxErrorgroupsetr   split	NameErrorendswithnext_compile_countcompileexec	Exceptionprintr7   stderrr<   )r(   	src_templevaldict	addsourceattrssrcmor   namesnfilenamecoder)   r   r   r1   make   s:   




zFunctionMaker.makeTc                 K   s   t |tr| dd\}	}
|
dd }d}nd}	d}|}| ||	||||}ddd | D }|d}|rGt|rGd	| d
d}nd| }|j	|||fi |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.
        (r@   NrH   c                 s   s    | ]}d | V  qdS )z    Nr   )rC   liner   r   r1   	<genexpr>       z'FunctionMaker.create.<locals>.<genexpr>rG   z#async def %(name)s(%(signature)s):
returnzreturn awaitzdef %(name)s(%(signature)s):
)

isinstancestrrA   rR   r"   
splitlinesr;   r   replacerf   )clsobjbodyr]   r   r   r   r^   r_   r   restr   r)   r(   ibodycallerr   r   r1   create   s    
	
zFunctionMaker.create)NNNNNNNNF)NNNT)r   r   __qualname__r   	itertoolscountrV   r
   r   r   r   r   r   r2   r<   rf   classmethodrw   r   r   r   r1   r   3   s    
4
$r   c                 C   s$   |j | i |}|  |j|jfS )zA
    Fix args and kwargs to be consistent with the signature
    )bindapply_defaultsr
   kwargs)r
   r   sigbar   r   r1   fix   s   r   r   Fc                    s(  t t r fdd}nt r# fdd}n
 fdd}j|_j|_|_|_j|_zj	|_	W n	 t
yN   Y nw zj|_W n	 t
y^   Y nw zj|_W n	 t
yn   Y nw zj|_W n	 t
y~   Y nw z
|jj W |S  t
y   Y |S w )af  
    Decorates a function/generator/coroutine using a caller.
    If kwsyntax is True calling the decorated functions with keyword
    syntax will pass the named arguments inside the ``kw`` dictionary,
    even if such argument are positional, similarly to what functools.wraps
    does. By default kwsyntax is False and the the arguments are untouched.
    c                     s6   st | |\} } g|  R i |I d H S Nr   r
   r=   rv   extrasr)   kwsyntaxr   r   r1   fun   s    zdecorate.<locals>.func                  ?   s@    st | |\} } g|  R i |D ]}|V  qd S r   r   )r
   r=   resr   r   r1   r      s   c                     s.   s
t | |\} } g|  R i |S r   r   r   r   r   r1   r      s   )r   r   r   r   r   r   __wrapped____signature__ry   r5   r9   r6   r	   r   r#   r<   )r)   rv   r   r   r   r   r   r1   decorate   sL   
r   c                    s    fdd}|S )z
    A version of "decorator" implemented via "exec" and not via the
    Signature object. Use this if you are want to preserve the `.__code__`
    object properties (https://github.com/micheles/decorator/issues/129).
    c                    s   t j| dt | d| | jdS )Nz)return _call_(_func_, %(shortsignature)s))rG   rF   )r   ry   )r   rw   r%   ry   r)   rv   r   r1   dec  s   
zdecoratorx.<locals>.decr   )rv   r   r   r   r1   
decoratorx  s   r   c                    s   |durt | dS t }dd |j D d	 fdd	}|jd|_ j|_ j|_ |_	 j
|_
t dd|_|j j |S )
zG
    decorator(caller) converts a caller function into a decorator
    Nr   c                 S   s   g | ]	}|j tu r|qS r   )kindPOSrC   pr   r   r1   rD     s    zdecorator.<locals>.<listcomp>c                    sT   t |d }|tfdd|d  D   | d u r# fddS t|  S )Nr@   c                 3   s*    | ]}|j tur |j|j V  qd S r   )defaultEMPTYr;   r   r   )r=   r   r1   rj   "  s    
z)decorator.<locals>.dec.<locals>.<genexpr>c                    s   t |  S r   r   r   )rv   r   r   r   r1   <lambda>&  s    z(decorator.<locals>.dec.<locals>.<lambda>)lentupler   )r)   r
   r=   narv   
dec_paramsr   )r   r=   r1   r      s   

zdecorator.<locals>.dec)
parametersr6   r   )r   r   r   r   valuesrp   r   r   r   r   ry   r   r6   r#   r<   )rv   _funcr   r   r   r   r   r1   	decorator  s   
	r   c                   @   s   e Zd Zdd Zdd ZdS )ContextManagerc                 O   s   t | ||| d S r   )r   r2   )r(   gr,   kr   r   r1   r2   7  s   zContextManager.__init__c                    s    fdd}t ||S )Nc                    sP    j  jg jR i  j | |i |W  d    S 1 s!w   Y  d S r   )	__class__r)   r
   kwds)fr,   r   r(   r   r1   rv   ;  s    $z'ContextManager.__call__.<locals>.callerr   )r(   r)   rv   r   r   r1   __call__:  s   
zContextManager.__call__N)r   r   ry   r2   r   r   r   r   r1   r   6  s    r   c                 C   s   t | S r   )_contextmanagerr   r   r   r1   contextmanagerD  s   r   c                 C   sT   d}t |D ]\}}t|| rd} nt| |r| ||< d}q|r(||  dS dS )z_
    Append ``a`` to the list of the virtual ancestors, unless it is already
    included.
    TFN)r   
issubclassr!   )r,   
vancestorsaddjvar   r   r1   r!   K  s   

r!   c                     sL   sJ ddd  tjdffdd	  fdd}d	 |_|S )
zr
    Factory of decorators turning a function into a generic function
    dispatching on the given arguments.
    zNo dispatch args passedz(%s,)r    c                    s0   |t | t  rtdt  t | |f dS )z5Make sure one passes the expected number of argumentszExpected %d arguments, got %d%sN)r   r'   )	argumentswrongmsg)dispatch_argsr   r1   checke  s
   zdispatch_on.<locals>.checkc                    s   t tj}t |kstd i fddfdd fdd} fdd	} fd
d}tjd t|d| |d
S )z4Decorator turning a function into a generic functionzUnknown dispatch arguments %sc                     sn    |  dd t tD }D ]}t| ||D ]\}}}t||r.|| vr.t|| qqdd |D S )zU
            Get a list of sets of virtual ancestors for the given types
            c                 S   s   g | ]}g qS r   r   )rC   _r   r   r1   rD   z  s    zIdispatch_on.<locals>.gen_func_dec.<locals>.vancestors.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   )rQ   )rC   rar   r   r1   rD     s    )ranger   zipr   mror!   )typesrastypes_ttype_r   )r   r   typemapr   r1   r   u  s   
z5dispatch_on.<locals>.gen_func_dec.<locals>.vancestorsc                     s    |  g }t | |  D ]7\}}t|}|dkr!td||f |dkr7|\}td||fi  dd }n| }||dd  q|S )zG
            Get a list of virtual MROs, one for each type
            r@   zAmbiguous dispatch for %s: %sr   Nrh   )r   r   RuntimeErrortyper   r!   )r   listsr   vasn_vasr   r   )r   r   r   r1   	ancestors  s   
z4dispatch_on.<locals>.gen_func_dec.<locals>.ancestorsc                     s      fdd}|S )zU
            Decorator to register an implementation for the given types
            c                    s&    t | jtjd| j  | < | S )Nz in )r   r
   operatorltr   )r   )r   r   r   r   r1   r     s   z@dispatch_on.<locals>.gen_func_dec.<locals>.register.<locals>.decr   )r   r   )r   r   )r   r1   register  s   z3dispatch_on.<locals>.gen_func_dec.<locals>.registerc                     s<   |  g }t j |   D ]}|tdd |D  q|S )zI
            An utility to introspect the dispatch algorithm
            c                 s   s    | ]}|j V  qd S r   )r   )rC   r,   r   r   r1   rj     s    zKdispatch_on.<locals>.gen_func_dec.<locals>.dispatch_info.<locals>.<genexpr>)rz   productr!   r   )r   lstanc)r   r   r   r1   dispatch_info  s
   z8dispatch_on.<locals>.gen_func_dec.<locals>.dispatch_infoc                    s   t dd | D }z| }W n	 ty   Y nw ||i |S tj |  }t| |D ]}|}|d urA||i |  S q-|i |S )Nc                 s   s    | ]}t |V  qd S r   )r   rB   r   r   r1   rj     rk   zGdispatch_on.<locals>.gen_func_dec.<locals>._dispatch.<locals>.<genexpr>)r   KeyErrorrz   r   rU   r;   )r   r
   r=   r   r   combinationsr   )r   r)   r   r   r1   	_dispatch  s   
z4dispatch_on.<locals>.gen_func_dec.<locals>._dispatchz#return _f_(%s, %%(shortsignature)s))_f_)r   r   r   r   r   r   r   )rQ   r   r
   rS   r   rw   r%   )r)   argsetr   r   r   r   r   dispatch_str)r   r)   r   r   r1   gen_func_deck  s   
z!dispatch_on.<locals>.gen_func_decdispatch_on)r"   r   ner   )r   r   r   r   r1   r   ]  s   
Wr   )r   Frx   )r   rer7   r   r   rz   
contextlibr   r   r   r   __version__rW   rM   	ParameterPOSITIONAL_OR_KEYWORDr   emptyr   objectr   r   r   r   r   r   r   r   r!   r   r   r   r   r1   <module>   s.   
 
	6
!