o
    pf=                     @   sp  d Z ddlmZ ddlZddlZddlZddlZddlZddlZdZ	ej
dkr2ddlmZ dd ZnG d	d
 d
eZdd ZeddZdd ZedZG dd deZdd Zd$ddZzddlmZ W n eyu   ddlmZ Y nw G dd deZeejZeejZedkrej sdd Zee_nedkrej rnedkrdd Zee_eeZ!d d! Z"d"d# Z#dS )%zT
Decorator module, see http://pypi.python.org/pypi/decorator
for the documentation.
    )print_functionNz4.0.10   )getfullargspecc                 C   s   | j S N)__init__cls r
   T/home/ertert/spirit/venv/lib/python3.10/site-packages/prometheus_client/decorator.pyget_init1   s   r   c                   @   s&   e Zd ZdZdd Zdd ZejZdS )r   z?A quick and dirty replacement for getfullargspec for Python 2.Xc                 C   s*   t |\| _| _| _| _g | _d | _d S r   )inspect
getargspecargsvarargsvarkwdefaults
kwonlyargskwonlydefaults)selffr
   r
   r   r   7   s   
zgetfullargspec.__init__c                 c   s&    | j V  | jV  | jV  | jV  d S r   )r   r   r   r   )r   r
   r
   r   __iter__=   s
   zgetfullargspec.__iter__N)__name__
__module____qualname____doc__r   r   r   r   r
   r
   r
   r   r   4   s
    
r   c                 C   s   | j jS r   )r   __func__r   r
   r
   r   r   F   s   ArgSpeczargs varargs varkw defaultsc                 C   s   t | }t|j|j|j|jS )z$A replacement for inspect.getargspec)r   r   r   r   r   r   )r   specr
   r
   r   r   N   s   r   z\s*def\s*([_\w][_\w\d]*)\s*\(c                   @   sJ   e Zd ZdZe 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dk ratj|ddd	 id
d  | _ | _n[t| j}t| j}| jr|d| j  |d| j  n| jr|d | jD ]}	|d|	  |d|	|	f  q| 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 )N<lambda>_lambda___annotations__)r   r   r   r   r   r   zarg%dr   formatvaluec                 S   s   dS )N r
   )valr
   r
   r   <lambda>w   s    z(FunctionMaker.__init__.<locals>.<lambda>   *z%s=Nonez%s=%sz**, name	signaturez%You are decorating a non function: %s)shortsignaturer   r+   r   docr   moduler   
isfunctionr   getattrannotationssetattr	enumerater   sysversion_infoformatargspecr,   listr   appendr   r   join__dict__copydictr   hasattr	TypeError)r   funcr+   r,   r   r.   r/   funcdictargspecaiargallargsallshortargsr
   r
   r   r   b   sn   







zFunctionMaker.__init__c                 K   s   | j |_t| dd|_t| di |_t| dd|_t| dd|_t| dd|_zt	d}W n t
y9   d	}Y nw |jd
d	}t| d||_|j| dS )z2Update the signature of func with the data in selfr.   Nr=   r   r
   r   r2   r   ?r   r/   )r+   r   r1   r   r;   __defaults____kwdefaults__r"   r5   	_getframeAttributeError	f_globalsgetr   update)r   r@   kwframecallermoduler
   r
   r   rO      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f }
zt||
d}t|| W n   tdtjd t|tjd  || }|rz||d< | j|fi | |S )zBMake a new function from a given template and update the signatureNz not a valid function template
%sr'   c                 S   s   g | ]}| d qS )z *)strip.0rE   r
   r
   r   
<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matchSyntaxErrorgroupsetr-   split	NameErrorendswithnext_compile_countcompileexecprintr5   stderrrO   )r   	src_templevaldict	addsourceattrssrcmor+   namesnfilenamecoder@   r
   r
   r   make   s8   




zFunctionMaker.makeTc                 K   s   t |tr| dd\}	}
|
dd }d}nd}	d}|}| ||	||||}ddd | D }|jd| ||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'   Nr(   rZ   c                 s   s    | ]}d | V  qdS )z    Nr
   )rU   liner
   r
   r   	<genexpr>       z'FunctionMaker.create.<locals>.<genexpr>zdef %(name)s(%(signature)s):
)
isinstancestrrS   rd   r:   
splitlinesrw   )r	   objbodyrn   r   r.   r/   ro   rp   r+   restr,   r@   r   ibodyr
   r
   r   create   s   
	
zFunctionMaker.create)NNNNNNN)NF)NNNT)r   r   r   r   	itertoolscountrh   r   rO   rw   classmethodr   r
   r
   r
   r   r   X   s    
9
"r   c                 C   s4   t || d}tj| d|| d}t| dr| j|_|S )zE
    decorate(func, caller) decorates a function using a caller.
    )rY   rX   z)return _call_(_func_, %(shortsignature)s)__wrapped__r   )r=   r   r   r>   r   )r@   callerrn   funr
   r
   r   decorate   s   
r   c                 C   s   |dur	t || S t| r| j }d| j| jf }nt| r0| jdkr)d}n| j}| j}n
| jj }| jj}t	| t d}t
jd| d||| j| dS )	z=decorator(caller) converts a caller function into a decoratorNzHdecorator(%s) converts functions/generators into factories of %s objectsr    r!   )rY   
_decorate_z%s(func)zreturn _decorate_(func, _call_))r.   r/   r   )r   r   isclassr   lowerr0   r   	__class____call__r=   r   r   r   )r   _funcr+   r.   rn   r
   r
   r   	decorator   s(   





r   )_GeneratorContextManager)GeneratorContextManagerc                   @   s   e Zd Zdd ZdS )ContextManagerc                 C   s   t j|dt| |d|dS )zContext manager decoratorz.with _self_: return _func_(%(shortsignature)s))_self_rX   r   )r   r   r=   )r   r@   r
   r
   r   r     s   zContextManager.__call__N)r   r   r   r   r
   r
   r
   r   r     s    r      c                 O   s   t | ||i |S r   r   r   r   grC   kr
   r
   r   r     s   r      c                 O   s   t | |||S r   r   r   r
   r
   r   r   '  s   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)r4   
issubclassr9   )rC   
vancestorsaddjvar
   r
   r   r9   2  s   

r9   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*   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)lenr?   )	argumentswrongmsg)dispatch_argsr
   r   checkL  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                     sl    |  dd t tD }D ]}t| ||D ]\}}}t||r-||j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
   )rU   _r
   r
   r   rV   a  s    zIdispatch_on.<locals>.gen_func_dec.<locals>.vancestors.<locals>.<listcomp>c                 S   s   g | ]}t |qS r
   )rc   )rU   rar
   r
   r   rV   f  s    )ranger   zipr   __mro__r9   )typesrastypes_ttype_r   )r   r   typemapr
   r   r   \  s   
z5dispatch_on.<locals>.gen_func_dec.<locals>.vancestorsc                     s    |  g }t | |  D ]5\}}t|}|dkr!td||f |dkr6|\}td||fi jdd }n|j}||dd  q|S )zG
            Get a list of virtual MROs, one for each type
            r'   zAmbiguous dispatch for %s: %sr   Nr(   )r   r   RuntimeErrortyper   r9   )r   listsr   vasn_vasr   mro)r   r   r
   r   	ancestorsh  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
   r   dec  s   z@dispatch_on.<locals>.gen_func_dec.<locals>.register.<locals>.decr
   )r   r   )r   r   )r   r   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   )rU   rC   r
   r
   r   rz     s    zKdispatch_on.<locals>.gen_func_dec.<locals>.dispatch_info.<locals>.<genexpr>)r   productr9   tuple)r   lstanc)r   r   r
   r   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   rT   r
   r
   r   rz     r{   zGdispatch_on.<locals>.gen_func_dec.<locals>._dispatch.<locals>.<genexpr>)r   KeyErrorr   r   rg   rN   )r   r   rP   r   r   combinationsr   )r   r@   r   r
   r   	_dispatch  s   
z4dispatch_on.<locals>.gen_func_dec.<locals>._dispatchz#return _f_(%s, %%(shortsignature)s))_f_)r   defaultr   r   r   r   r   )rc   r   r   re   r   r   r=   )r@   argsetr   r   r   r   r   dispatch_str)r   r@   r   r   r   gen_func_decR  s   
z!dispatch_on.<locals>.gen_func_decdispatch_on)r:   r   ner   )r   r   r
   r   r   r   D  s   
Xr   r   )$r   
__future__r   collectionsr   r   r   rer5   __version__r6   r   r   object
namedtupler   r   ri   r_   r   r   r   
contextlibr   ImportErrorr   r   r   initr   r   n_argsr   contextmanagerr9   r   r
   r
   r
   r   <module>   sT   


 


