a
    _O                     @   sD  d Z ddlZejd dkZer0efZdddZnefZddlZe	edZ[ddl
mZ ddlmZmZmZ dd	lmZ dd
lmZmZ zddlmZ W n ey   Y n0 ddlmZmZmZmZ G dd deZG dd deZG dd deZG dd deZG dd de Z!G dd de!Z"e"Z#dddZ$dd Z%e e%_&dS ) zoThis module implements decorators for implementing other decorators
as well as some commonly used decorators.

    N   c                 C   sB   |du r*t d}|j}|du r&|j}~n|du r6|}td dS )zExecute code in a namespace.N   zexec _code_ in _globs_, _locs_)sys	_getframe	f_globalsf_localsexec)Z_code_Z_globs_Z_locs_frame r
   /lib/python3.9/site-packages/wrapt/decorators.pyexec_   s    
r   r   )partial)ismethodisclassformatargspec)
namedtuple)LockRLock)	signaturer   )FunctionWrapperBoundFunctionWrapperObjectProxyCallableObjectProxyc                       sX   e Zd Z fddZedd Zedd Zedd Zed	d
 Zedd Z	  Z
S )_AdapterFunctionCodec                    s   t t| | || _d S N)superr   __init___self_adapter_code)selfZwrapped_codeZadapter_code	__class__r
   r   r   6   s    z_AdapterFunctionCode.__init__c                 C   s   | j jS r   )r   co_argcountr   r
   r
   r   r!   :   s    z _AdapterFunctionCode.co_argcountc                 C   s   | j jS r   )r   co_coder"   r
   r
   r   r#   >   s    z_AdapterFunctionCode.co_codec                 C   s   | j jS r   )r   co_flagsr"   r
   r
   r   r$   B   s    z_AdapterFunctionCode.co_flagsc                 C   s   | j jS r   )r   co_kwonlyargcountr"   r
   r
   r   r%   F   s    z&_AdapterFunctionCode.co_kwonlyargcountc                 C   s   | j jS r   )r   co_varnamesr"   r
   r
   r   r&   J   s    z _AdapterFunctionCode.co_varnames)__name__
__module____qualname__r   propertyr!   r#   r$   r%   r&   __classcell__r
   r
   r   r   r   4   s   



r   c                       sX   e Zd Z fddZedd Zedd Zedd Zed	d
 Ze	rPeZ
eZ  ZS )_AdapterFunctionSurrogatec                    s   t t| | || _d S r   )r   r,   r   _self_adapter)r   wrappedadapterr   r
   r   r   P   s    z"_AdapterFunctionSurrogate.__init__c                 C   s   t | jj| jjS r   )r   __wrapped____code__r-   r"   r
   r
   r   r1   T   s    z"_AdapterFunctionSurrogate.__code__c                 C   s   | j jS r   )r-   __defaults__r"   r
   r
   r   r2   Y   s    z&_AdapterFunctionSurrogate.__defaults__c                 C   s   | j jS r   )r-   __kwdefaults__r"   r
   r
   r   r3   ]   s    z(_AdapterFunctionSurrogate.__kwdefaults__c                 C   s    dt  vr| jjS t| jS d S Nr   )globalsr-   __signature__r   r"   r
   r
   r   r6   a   s    
z'_AdapterFunctionSurrogate.__signature__)r'   r(   r)   r   r*   r1   r2   r3   r6   PY2	func_codefunc_defaultsr+   r
   r
   r   r   r,   N   s   



r,   c                   @   s,   e Zd Zedd Zedd Zer(eZdS )_BoundAdapterWrapperc                 C   s   t | jj| jjS r   )r,   r0   __func___self_parentr-   r"   r
   r
   r   r;   n   s    z_BoundAdapterWrapper.__func__c                 C   s"   dt  vr| jjS t| jjS d S r4   )r5   r0   r6   r   r<   r-   r"   r
   r
   r   r6   s   s    
z"_BoundAdapterWrapper.__signature__N)r'   r(   r)   r*   r;   r6   r7   Zim_funcr
   r
   r
   r   r:   l   s   

r:   c                       s\   e Zd ZeZ fddZedd Zedd Zedd Z	e
rHeZeZed	d
 Z  ZS )AdapterWrapperc                    s8   | d}tt| j|i | t| j|| _|| _d S )Nr/   )popr   r=   r   r,   r0   _self_surrogater-   )r   argskwargsr/   r   r
   r   r      s    
zAdapterWrapper.__init__c                 C   s   | j jS r   )r?   r1   r"   r
   r
   r   r1      s    zAdapterWrapper.__code__c                 C   s   | j jS r   )r?   r2   r"   r
   r
   r   r2      s    zAdapterWrapper.__defaults__c                 C   s   | j jS r   )r?   r3   r"   r
   r
   r   r3      s    zAdapterWrapper.__kwdefaults__c                 C   s   | j jS r   )r?   r6   r"   r
   r
   r   r6      s    zAdapterWrapper.__signature__)r'   r(   r)   r:   Z__bound_function_wrapper__r   r*   r1   r2   r3   r7   r8   r9   r6   r+   r
   r
   r   r   r=   }   s   


r=   c                   @   s   e Zd Zdd ZdS )AdapterFactoryc                 C   s
   t  d S r   )NotImplementedErrorr   r.   r
   r
   r   __call__   s    zAdapterFactory.__call__N)r'   r(   r)   rE   r
   r
   r
   r   rB      s   rB   c                       s$   e Zd Z fddZdd Z  ZS )DelegatedAdapterFactoryc                    s   t t|   || _d S r   )r   rF   r   factory)r   rG   r   r
   r   r      s    z DelegatedAdapterFactory.__init__c                 C   s
   |  |S r   )rG   rD   r
   r
   r   rE      s    z DelegatedAdapterFactory.__call__)r'   r(   r)   r   rE   r+   r
   r
   r   r   rF      s   rF   c                    sD   d ur2ddd  fdd} |t dS tt dS d S )Nc                 S   sl   |r^t |tr|| }t|sNi }t |ts4t| }td||| |d }t| |||dS t| ||dS )Nzdef adapter{}: passr/   )r.   wrapperenabledr/   )r.   rH   rI   )	
isinstancerB   callablestring_typesr   r   formatr=   r   )r.   rH   rI   r/   nsr
   r
   r   _build   s    

zdecorator.<locals>._buildc                    s   |d u r,t r,|s, fdd}|S |d }}t|tu rP|sL|S d }|d u rnt rh }q}n&t |rd |}n|t|}|||S )Nc                    s8   }t |tu r|s| S d }f i } | ||S r   )typebool)target_wrapped_enabledtarget_wrapper)rO   r/   rI   rA   r.   r
   r   _capture   s    z-decorator.<locals>._wrapper.<locals>._capturer   )r   rP   rQ   __get__)r.   instancer@   rA   rU   rR   rS   rT   rO   r/   rI   rH   )rA   r.   r   _wrapper   s"    zdecorator.<locals>._wrapper)r/   )rI   r/   )NN)	decoratorr   )rH   rI   r/   rY   r
   rX   r   rZ      s    
 1rZ   c                    sz   t | drFt | drF| tfdd}G fdddt}||dS dd	   fd
d}G  fdddt}|| |dS )Nacquirereleasec                    s6     | |i |W  d    S 1 s(0    Y  d S r   r
   r.   rW   r@   rA   lockr
   r   _synchronized  s    z#synchronized.<locals>._synchronizedc                       s$   e Zd Z fddZ fddZdS )z'synchronized.<locals>._PartialDecoratorc                    s        S r   )r[   r"   r^   r
   r   	__enter__  s    z1synchronized.<locals>._PartialDecorator.__enter__c                    s       d S r   )r\   r   r@   r^   r
   r   __exit__  s    z0synchronized.<locals>._PartialDecorator.__exit__Nr'   r(   r)   ra   rc   r
   r^   r
   r   _PartialDecorator  s   re   )r.   c                 S   sl   t | dd }|d u rhtj: t | dd }|d u rJt }t| d| W d    n1 s^0    Y  |S )N_synchronized_lock)varsgetsynchronized_synchronized_meta_lockr   setattr)contextr_   r
   r
   r   rf     s    *z(synchronized.<locals>._synchronized_lockc                    sF    |d ur|n|  | |i |W  d    S 1 s80    Y  d S r   r
   r]   rf   r
   r   _synchronized_wrapper  s    z+synchronized.<locals>._synchronized_wrapperc                       s    e Zd Z fddZdd ZdS )z%synchronized.<locals>._FinalDecoratorc                    s    | j | _| j  | jS r   )r0   
_self_lockr[   r"   rm   r
   r   ra     s    
z/synchronized.<locals>._FinalDecorator.__enter__c                 W   s   | j   d S r   )ro   r\   rb   r
   r
   r   rc     s    z.synchronized.<locals>._FinalDecorator.__exit__Nrd   r
   rm   r
   r   _FinalDecorator  s   rp   )r.   rH   )hasattrrZ   r   r   )r.   r`   re   rn   rp   r
   )rf   r_   r   ri     s    	
 
ri   )NN)NNN)'__doc__r   version_infor7   Z
basestringrL   r   strbuiltinsgetattr	functoolsr   inspectr   r   r   collectionsr   Z	threadingr   r   r   ImportErrorZwrappersr   r   r   r   r   r,   r:   r=   objectrB   rF   Zadapter_factoryrZ   ri   rj   r
   r
   r
   r   <module>   s:   
		
 x]