a
    `*jA2                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ G dd deZ	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZG dd  d eZG d!d" d"eZd(d$d%d&d'Zd#S ))z0Variants of ObjectProxy for different use cases.    )Callable)
ModuleType   )BaseObjectProxy)synchronizedc                       s4   e Zd ZdZedd Z fddZdd Z  ZS )ObjectProxya  A generic object proxy which forwards special methods as needed.
    For backwards compatibility this class adds support for `__iter__()`. If
    you don't need backward compatibility for `__iter__()` support then it is
    preferable to use `BaseObjectProxy` directly. If you want automatic
    support for special dunder methods for callables, iterators, and async,
    then use `AutoObjectProxy`.c                 C   s   t S N)r   self r   I/var/www/html/assistant/venv/lib/python3.9/site-packages/wrapt/proxies.py__object_proxy__   s    zObjectProxy.__object_proxy__c                    s   t  | S r   )super__new__)clsargskwargs	__class__r   r   r      s    zObjectProxy.__new__c                 C   s
   t | jS r   iter__wrapped__r	   r   r   r   __iter__   s    zObjectProxy.__iter__)	__name__
__module____qualname____doc__propertyr   r   r   __classcell__r   r   r   r   r      s
   
r   c                  O   s$   dd }||  \}} |j | i |S )Nc                 W   s   | |fS r   r   )r
   r   r   r   r   _unpack_self%   s    z&__wrapper_call__.<locals>._unpack_self)r   )r   r   r   r
   r   r   r   __wrapper_call__$   s    r    c                 C   s
   t | jS r   r   r	   r   r   r   __wrapper_iter__-   s    r!   c                 C   s
   | j  S r   )r   __next__r	   r   r   r   __wrapper_next__1   s    r#   c                 C   s
   | j  S r   )r   	__aiter__r	   r   r   r   __wrapper_aiter__5   s    r%   c                    s   | j  I d H S r   )r   	__anext__r	   r   r   r   __wrapper_anext__9   s    r'   c                 C   s
   | j  S r   )r   __length_hint__r	   r   r   r   __wrapper_length_hint__=   s    r)   c                 c   s   | j  E d H S r   )r   	__await__r	   r   r   r   __wrapper_await__A   s    r+   c                 C   s   | j ||S r   )r   __get__)r
   instanceownerr   r   r   __wrapper_get__E   s    r/   c                 C   s   | j ||S r   )r   __set__)r
   r-   valuer   r   r   __wrapper_set__I   s    r2   c                 C   s   | j |S r   )r   
__delete__)r
   r-   r   r   r   __wrapper_delete__M   s    r4   c                 C   s   | j ||S r   )r   __set_name__)r
   r.   namer   r   r   __wrapper_set_name__Q   s    r7   c                       s(   e Zd ZdZ fddZdd Z  ZS )AutoObjectProxya  An object proxy which can automatically adjust to the wrapped object
    and add special dunder methods as needed. Note that this creates a new
    class for each instance, so it has much higher memory overhead than using
    `BaseObjectProxy` directly. If you know what special dunder methods you need
    then it is preferable to use `BaseObjectProxy` directly and add them to a
    subclass as needed. If you only need `__iter__()` support for backwards
    compatibility then use `ObjectProxy` instead.
    c                    sX  i }t |}tt | }t|r0d|vr0t|d< d|v rHd|vrHt|d< d|v r`d|vr`t|d< d|v rxd|vrxt|d< d|v rd|vrt|d< d|v rd|vrt|d< d|v rd|vrt	|d< d|v rd|vrt
|d< d	|v rd	|vrt|d	< d
|v rd
|vrt|d
< d|v r(d|vr(t|d< | j}| tu r>tj}tt| t|| f|S )zInjects special dunder methods into a dynamically created subclass
        as needed based on the wrapped object.
        __call__r   r"   r$   r&   r(   r*   r,   r0   r3   r5   )dirsetcallabler    r!   r#   r%   r'   r)   r+   r/   r2   r4   r7   r   r8   r   r   r   type)r   wrapped	namespaceZwrapped_attrsclass_attrsr6   r   r   r   r   _   s:    
zAutoObjectProxy.__new__c                 C   s  t | }tt|}t| jr.d|vrHt|_nt|ddtu rHt|d t	| jdrdd|vr~t
|_nt|ddt
u r~t|d t	| jdrd|vrt|_nt|ddtu rt|d t	| jdrd|vrt|_nt|ddtu rt|d t	| jdr
d|vr&t|_nt|ddtu r&t|d t	| jdrFd|vrbt|_nt|ddtu rbt|d t	| jdrd|vrt|_nt|ddtu rt|d t	| jd	rd	|vrt|_nt|d	dtu rt|d	 t	| jd
rd
|vrt|_nt|d
dtu rt|d
 t	| jdr6d|vrRt|_nt|ddtu rRt|d t	| jdrrd|vrt|_nt|ddtu rt|d dS )zAdjusts special dunder methods on the class as needed based on the
        wrapped object, when `__wrapped__` is changed.
        r:   Nr   r"   r$   r&   r(   r*   r,   r0   r3   r5   )r>   r<   r;   r=   r   r    r:   getattrdelattrhasattrr!   r   r#   r"   r%   r$   r'   r&   r)   r(   r+   r*   r/   r,   r2   r0   r4   r3   r7   r5   )r
   r   rA   r   r   r   __wrapped_setattr_fixups__   sr    

















z*AutoObjectProxy.__wrapped_setattr_fixups__)r   r   r   r   r   rE   r   r   r   r   r   r8   U   s   	9r8   c                       sP   e Zd ZdZddd fddZddd fddZd	Zd
d Zdd Z  Z	S )LazyObjectProxyzhAn object proxy which can generate/create the wrapped object on demand
    when it is first needed.
    N.	interfacec                   s\  |du rt d}i }t|}tt| }d|v r@d|vr@t|d< d|v rXd|vrXt|d< d|v rpd|vrpt|d< d|v rd|vrt|d< d|v rd|vrt|d< d|v rd|vrt|d< d	|v rd	|vrt	|d	< d
|v rd
|vrt
|d
< d|v rd|vrt|d< d|v r d|vr t|d< d|v r<d|vr<t|d< | j}tt| t || f|S )r9   .Nr:   r   r"   r$   r&   r(   r*   r,   r0   r3   r5   )r>   r;   r<   r    r!   r#   r%   r'   r)   r+   r/   r2   r4   r7   r   r   r8   r   )r   callbackrH   r@   Zinterface_attrsrA   r6   r   r   r   r      s@    zLazyObjectProxy.__new__c                   s   |dur|| _ t d dS )a  Initialize the object proxy with wrapped object as `None` but due
        to presence of special `__wrapped_factory__` attribute addded first,
        this will actually trigger the deferred creation of the wrapped object
        when first needed.
        N)__wrapped_factory__r   __init__)r
   rI   rH   r   r   r   rK   $  s    zLazyObjectProxy.__init__Fc                 C   s   d S r   r   r	   r   r   r   rJ   2  s    z#LazyObjectProxy.__wrapped_factory__c                 C   s`   t t| @ | jr(| jW  d   S |  | _d| _| jW  d   S 1 sR0    Y  dS )z2Gets the wrapped object, creating it if necessary.NT)r   r>   __wrapped_get_called__r   rJ   r	   r   r   r   __wrapped_get__5  s    
zLazyObjectProxy.__wrapped_get__)N)N)
r   r   r   r   r   rK   rL   rJ   rM   r   r   r   r   r   rF      s   <rF   N.rG   c                   s<    dur|du r"t }n|du r"t} fdd}t||dS )aN  Lazily imports the module `name`, returning a `LazyObjectProxy` which
    will import the module when it is first needed. When `name is a dotted name,
    then the full dotted name is imported and the last module is taken as the
    target. If `attribute` is provided then it is used to retrieve an attribute
    from the module.
    N.c                     s$   t dgd}  d ur t|  S | S )N )fromlist)
__import__rB   )module	attributer6   r   r   _import]  s    
zlazy_import.<locals>._importrG   )r   r   rF   )r6   rS   rH   rT   r   rR   r   lazy_importN  s    rU   )N)r   collections.abcr   typesr   Z	__wrapt__r   Zsynchronizationr   r   r    r!   r#   r%   r'   r)   r+   r/   r2   r4   r7   r8   rF   rU   r   r   r   r   <module>   s(   	 k