a
    [g"                     @  s  d dl mZ d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlZddlmZ ddlmZ ddlmZ ddlmZ ededZededdZededZG dd dee ZG dd  d ee ejZ G d!d" d"e e Z!d#d$d%d&d'Z"G d(d) d)ee Z#dS )*    )annotationsN)Any)AsyncGenerator)AsyncIterator)	Awaitable)Callable)ClassVar)Dict)	Generator)Generic)NoReturn)Optional)overload)Tuple)TypeVar   )exc   )util)Literal)Self_T)bound_T_coT)r   	covariant_PTc                   @  s   e Zd ZU i Zded< dZedddddZedddd	dZd
d
dddZedddddddZ	edddddZ
eed ddddddZeed!ddddddZed"ddddddZdS )#ReversibleProxyzCClassVar[Dict[weakref.ref[Any], weakref.ref[ReversibleProxy[Any]]]]_proxy_objects)__weakref__r   )targetreturnc                 C  s   d S N selfr   r"   r"   i/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/base.py_assign_proxied.   s    zReversibleProxy._assign_proxiedNonec                 C  s   d S r!   r"   r#   r"   r"   r%   r&   1   s    zOptional[_PT]c                 C  s:   |d ur6t |tj}t | ttj|}|tj|< |S r!   )weakrefrefr   _target_gced	functoolspartialr   )r$   r   Z
target_ref	proxy_refr"   r"   r%   r&   4   s    
Nzweakref.ref[_PT]zOptional[weakref.ref[Self]])r)   r-   r    c                 C  s   | j |d  d S r!   )r   pop)clsr)   r-   r"   r"   r%   r*   A   s    zReversibleProxy._target_gcedr   c                 C  s
   t  d S r!   NotImplementedError)r/   r   r"   r"   r%   _regenerate_proxy_for_targetI   s    z,ReversibleProxy._regenerate_proxy_for_target.zLiteral[True])r   
regenerater    c                 C  s   d S r!   r"   r/   r   r3   r"   r"   r%   _retrieve_proxy_for_targetM   s    z*ReversibleProxy._retrieve_proxy_for_targetTboolzOptional[Self]c                 C  s   d S r!   r"   r4   r"   r"   r%   r5   U   s    c                 C  sP   z| j t| }W n ty&   Y n0 | }|d ur:|S |rH| |S d S d S r!   )r   r(   r)   KeyErrorr2   )r/   r   r3   r-   proxyr"   r"   r%   r5   [   s    
)N).)T)T)__name__
__module____qualname__r   __annotations__	__slots__r   r&   classmethodr*   r2   r5   r"   r"   r"   r%   r   (   s0   

    r   c                   @  sl   e Zd ZdZejddddddZdd	d
dZdd	ddZejdddddddZ	dd	ddZ
dS )StartableContextr"   Fr6   r   is_ctxmanagerr    c                   s
   t  d S r!   r0   )r$   rA   r"   r"   r%   startq   s    zStartableContext.startzGenerator[Any, Any, _T_co]r    c                 C  s   |    S r!   )rB   	__await__r$   r"   r"   r%   rD   u   s    zStartableContext.__await__c                   s   | j ddI d H S )NT)rA   )rB   rE   r"   r"   r%   
__aenter__x   s    zStartableContext.__aenter__r   Optional[bool])type_value	tracebackr    c                   s   d S r!   r"   )r$   rH   rI   rJ   r"   r"   r%   	__aexit__{   s    zStartableContext.__aexit__r   c                 C  s   t d| jj d S )Nz@%s context has not been started and object has not been awaited.)	async_excZAsyncContextNotStarted	__class__r9   rE   r"   r"   r%   _raise_for_not_started   s
    z'StartableContext._raise_for_not_startedN)F)r9   r:   r;   r=   abcabstractmethodrB   rD   rF   rK   rN   r"   r"   r"   r%   r?   n   s   r?   c                   @  sR   e Zd ZU dZded< dddddd	ZddddddZdddddddZdS )GeneratorStartableContextgenzAsyncGenerator[_T_co, Any]rS   #Callable[..., AsyncIterator[_T_co]]zTuple[Any, ...]zDict[str, Any])funcargskwdsc                 C  s   ||i || _ d S r!   rR   )r$   rU   rV   rW   r"   r"   r%   __init__   s    z"GeneratorStartableContext.__init__Fr6   r   r@   c                   sL   zt | jI d H }W n ty2   tdd Y n0 |sH| j I d H  |S )Nzgenerator didn't yield)r   anext_rS   StopAsyncIterationRuntimeErroraclose)r$   rA   Zstart_valuer"   r"   r%   rB      s    zGeneratorStartableContext.startr   rG   )typrI   rJ   r    c              
     s2  |d u r@zt | jI d H  W n ty2   Y dS 0 td n|d u rN| }z| j|I d H  W n ty } z||uW  Y d }~S d }~0  t y } zJ||u rW Y d }~dS t|ttfr|j|u rW Y d }~dS  W Y d }~n<d }~0  t	y$ } z||ur W Y d }~dS d }~0 0 tdd S )NFzgenerator didn't stopz$generator didn't stop after athrow())
r   rY   rS   rZ   r[   athrow
isinstanceStopIteration	__cause__BaseException)r$   r]   rI   rJ   r   r"   r"   r%   rK      s4    	
z#GeneratorStartableContext.__aexit__N)F)r9   r:   r;   r=   r<   rX   rB   rK   r"   r"   r"   r%   rQ      s
   
rQ   rT   z/Callable[..., GeneratorStartableContext[_T_co]])rU   r    c                   s$   t  dddd fdd}|S )a=  @asyncstartablecontext decorator.

    the decorated function can be called either as ``async with fn()``, **or**
    ``await fn()``.   This is decidedly different from what
    ``@contextlib.asynccontextmanager`` supports, and the usage pattern
    is different as well.

    Typical usage:

    .. sourcecode:: text

        @asyncstartablecontext
        async def some_async_generator(<arguments>):
            <setup>
            try:
                yield <value>
            except GeneratorExit:
                # return value was awaited, no context manager is present
                # and caller will .close() the resource explicitly
                pass
            else:
                <context manager cleanup>


    Above, ``GeneratorExit`` is caught if the function were used as an
    ``await``.  In this case, it's essential that the cleanup does **not**
    occur, so there should not be a ``finally`` block.

    If ``GeneratorExit`` is not invoked, this means we're in ``__aexit__``
    and we were invoked as a context manager, and cleanup should proceed.


    r   z GeneratorStartableContext[_T_co])rV   rW   r    c                    s   t  | |S r!   )rQ   )rV   rW   rU   r"   r%   helper   s    z%asyncstartablecontext.<locals>.helper)r+   wraps)rU   rd   r"   rc   r%   asyncstartablecontext   s    %rf   c                   @  sR   e Zd ZdZejddddZddddZd	d
dddZd	d
dddZ	dS )ProxyComparabler"   r   rC   c                 C  s
   t  d S r!   r0   rE   r"   r"   r%   _proxied  s    zProxyComparable._proxiedintc                 C  s   t | S r!   )idrE   r"   r"   r%   __hash__  s    zProxyComparable.__hash__r   r6   )otherr    c                 C  s   t || jo| j|jkS r!   r_   rM   rh   r$   rl   r"   r"   r%   __eq__  s    
zProxyComparable.__eq__c                 C  s   t || j p| j|jkS r!   rm   rn   r"   r"   r%   __ne__  s    
zProxyComparable.__ne__N)
r9   r:   r;   r=   r   Zro_non_memoized_propertyrh   rk   ro   rp   r"   r"   r"   r%   rg     s   rg   )$
__future__r   rO   r+   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r(    r   rL   r   Zutil.typingr   r   r   r   r   r   ABCr?   rQ   rf   rg   r"   r"   r"   r%   <module>   s:   FQ,