B
    dTS                 @   sF  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 dd	lmZmZ d
dlmZ yddlmZ W n ek
r   Y nX 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ef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kr*t d}|j}|dkr&|j}~n|dk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
   B/var/www/html/venv/lib/python3.7/site-packages/wrapt/decorators.pyexec_   s    
r   r   )partial)isclass)LockRLockr   )formatargspec)	signature)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   7   s    z_AdapterFunctionCode.__init__c             C   s   | j jS )N)r   co_argcount)r   r
   r
   r   r   ;   s    z _AdapterFunctionCode.co_argcountc             C   s   | j jS )N)r   co_code)r   r
   r
   r   r   ?   s    z_AdapterFunctionCode.co_codec             C   s   | j jS )N)r   co_flags)r   r
   r
   r   r   C   s    z_AdapterFunctionCode.co_flagsc             C   s   | j jS )N)r   co_kwonlyargcount)r   r
   r
   r   r    G   s    z&_AdapterFunctionCode.co_kwonlyargcountc             C   s   | j jS )N)r   co_varnames)r   r
   r
   r   r!   K   s    z _AdapterFunctionCode.co_varnames)__name__
__module____qualname__r   propertyr   r   r   r    r!   __classcell__r
   r
   )r   r   r   5   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 )N)r   r'   r   _self_adapter)r   wrappedadapter)r   r
   r   r   Q   s    z"_AdapterFunctionSurrogate.__init__c             C   s   t | jj| jjS )N)r   __wrapped____code__r(   )r   r
   r
   r   r,   U   s    z"_AdapterFunctionSurrogate.__code__c             C   s   | j jS )N)r(   __defaults__)r   r
   r
   r   r-   Z   s    z&_AdapterFunctionSurrogate.__defaults__c             C   s   | j jS )N)r(   __kwdefaults__)r   r
   r
   r   r.   ^   s    z(_AdapterFunctionSurrogate.__kwdefaults__c             C   s    dt  kr| jjS t| jS d S )Nr   )globalsr(   __signature__r   )r   r
   r
   r   r0   b   s    
z'_AdapterFunctionSurrogate.__signature__)r"   r#   r$   r   r%   r,   r-   r.   r0   PY2	func_codefunc_defaultsr&   r
   r
   )r   r   r'   O   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 )N)r'   r+   __func___self_parentr(   )r   r
   r
   r   r5   o   s    z_BoundAdapterWrapper.__func__c             C   s"   dt  kr| jjS t| jjS d S )Nr   )r/   r+   r0   r   r6   r(   )r   r
   r
   r   r0   t   s    
z"_BoundAdapterWrapper.__signature__N)r"   r#   r$   r%   r5   r0   r1   Zim_funcr
   r
   r
   r   r4   m   s   r4   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                s4   | d}tt| j|| t| j|| _|| _d S )Nr*   )popr   r7   r   r'   r+   _self_surrogater(   )r   argskwargsr*   )r   r
   r   r      s
    
zAdapterWrapper.__init__c             C   s   | j jS )N)r9   r,   )r   r
   r
   r   r,      s    zAdapterWrapper.__code__c             C   s   | j jS )N)r9   r-   )r   r
   r
   r   r-      s    zAdapterWrapper.__defaults__c             C   s   | j jS )N)r9   r.   )r   r
   r
   r   r.      s    zAdapterWrapper.__kwdefaults__c             C   s   | j jS )N)r9   r0   )r   r
   r
   r   r0      s    zAdapterWrapper.__signature__)r"   r#   r$   r4   Z__bound_function_wrapper__r   r%   r,   r-   r.   r1   r2   r3   r0   r&   r
   r
   )r   r   r7   ~   s   r7   c               @   s   e Zd Zdd ZdS )AdapterFactoryc             C   s
   t  d S )N)NotImplementedError)r   r)   r
   r
   r   __call__   s    zAdapterFactory.__call__N)r"   r#   r$   r>   r
   r
   r
   r   r<      s   r<   c                   s$   e Zd Z fddZdd Z  ZS )DelegatedAdapterFactoryc                s   t t|   || _d S )N)r   r?   r   factory)r   r@   )r   r
   r   r      s    z DelegatedAdapterFactory.__init__c             C   s
   |  |S )N)r@   )r   r)   r
   r
   r   r>      s    z DelegatedAdapterFactory.__call__)r"   r#   r$   r   r>   r&   r
   r
   )r   r   r?      s   r?   c                sJ   d k	r6dfdd	  fdd} |t dS tt dS d S )Nc                s   |rt |tr|| }t|s|i }i }t |tsXt|dkrP|d }|d d }t| }td||| |d }|r|||_t	| |||dS  | ||dS )N   zdef adapter{}: passr*   )r)   wrapperenabledr*   )r)   rC   rD   )

isinstancer<   callablestring_typeslenr   r   format__annotations__r7   )r)   rC   rD   r*   nsannotations)proxyr
   r   _build   s$    



zdecorator.<locals>._buildc                s   |d kr,t r,|s, fdd}|S |d }}t|tkrP|sL|S d }|d krnt rh }q}n&t |rd |}n|t|}|||S )Nc                s4   }t |tkr|s| S d }f } | ||S )N)typebool)target_wrapped_enabledtarget_wrapper)rN   r*   rD   r;   r)   r
   r   _capture  s    
z-decorator.<locals>._wrapper.<locals>._capturer   )r   rO   rP   __get__)r)   instancer:   r;   rT   rQ   rR   rS   )rN   r*   rD   rC   )r;   r)   r   _wrapper   s"    zdecorator.<locals>._wrapper)r*   )rD   r*   rM   )NN)	decoratorr   )rC   rD   r*   rM   rW   r
   )rN   r*   rD   rM   rC   r   rX      s    . 1rX   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          	      s     | ||S Q R X d S )Nr
   )r)   rV   r:   r;   )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 )N)rY   )r   )r[   r
   r   	__enter__  s    z1synchronized.<locals>._PartialDecorator.__enter__c                s       d S )N)rZ   )r   r:   )r[   r
   r   __exit__  s    z0synchronized.<locals>._PartialDecorator.__exit__N)r"   r#   r$   r]   r^   r
   )r[   r
   r   _PartialDecorator  s   r_   )r)   c          	   S   sX   t | dd }|d krTtj0 t | dd }|d krJt }t| d| W d Q R X |S )N_synchronized_lock)varsgetsynchronized_synchronized_meta_lockr   setattr)contextr[   r
   r
   r   r`     s    z(synchronized.<locals>._synchronized_lockc          	      s*    |d k	r|n|  | ||S Q R X d S )Nr
   )r)   rV   r:   r;   )r`   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 )N)r+   
_self_lockrY   )r   )r`   r
   r   r]     s    
z/synchronized.<locals>._FinalDecorator.__enter__c             W   s   | j   d S )N)rh   rZ   )r   r:   r
   r
   r   r^     s    z.synchronized.<locals>._FinalDecorator.__exit__N)r"   r#   r$   r]   r^   r
   )r`   r
   r   _FinalDecorator  s   ri   )r)   rC   )hasattrrX   r   r   )r)   r\   r_   rg   ri   r
   )r`   r[   r   rc     s    	
 
rc   )NN)%__doc__r   version_infor1   
basestringrG   r   strbuiltinsgetattr	functoolsr   inspectr   	threadingr   r   	argumentsr   r   ImportErrorZwrappersr   r   r   r   r   r'   r4   r7   objectr<   r?   Zadapter_factoryrX   rc   rd   r
   r
   r
   r   <module>   s<   
		  ]