B
    f#                 @  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!   ]C:\Users\Lenovo\AppData\Local\Temp\pip-unpacked-wheel-4nia5yor\sqlalchemy\ext\asyncio\base.py_assign_proxied.   s    zReversibleProxy._assign_proxiedNonec             C  s   d S )Nr!   )r"   r   r!   r!   r#   r$   1   s    zOptional[_PT]c             C  s:   |d k	r6t |tj}t | ttj|}|tj|< |S )N)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 )N)r   pop)clsr'   r+   r!   r!   r#   r(   A   s    zReversibleProxy._target_gcedr   c             C  s
   t  d S )N)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 )Nr!   )r-   r   r0   r!   r!   r#   _retrieve_proxy_for_targetM   s    z*ReversibleProxy._retrieve_proxy_for_targetTboolzOptional[Self]c             C  s   d S )Nr!   )r-   r   r0   r!   r!   r#   r1   U   s    c             C  sR   y| j t| }W n tk
r(   Y nX | }|d k	r<|S |rJ| |S d S d S )N)r   r&   r'   KeyErrorr/   )r-   r   r0   r+   proxyr!   r!   r#   r1   [   s    
)N).)T)T)__name__
__module____qualname__r   __annotations__	__slots__r   r$   classmethodr(   r/   r1   r!   r!   r!   r#   r   (   s    
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!   Fr2   r   )is_ctxmanagerr    c               s
   t  d S )N)r.   )r"   r<   r!   r!   r#   startq   s    zStartableContext.startzGenerator[Any, Any, _T_co])r    c             C  s   |    S )N)r=   	__await__)r"   r!   r!   r#   r>   u   s    zStartableContext.__await__c               s   | j ddI d H S )NT)r<   )r=   )r"   r!   r!   r#   
__aenter__x   s    zStartableContext.__aenter__r   zOptional[bool])type_value	tracebackr    c               s   d S )Nr!   )r"   r@   rA   rB   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__r5   )r"   r!   r!   r#   _raise_for_not_started   s    z'StartableContext._raise_for_not_startedN)F)r5   r6   r7   r9   abcabstractmethodr=   r>   r?   rC   rF   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]rJ   z#Callable[..., AsyncIterator[_T_co]]zTuple[Any, ...]zDict[str, Any])funcargskwdsc             C  s   |||| _ d S )N)rJ   )r"   rK   rL   rM   r!   r!   r#   __init__   s    z"GeneratorStartableContext.__init__Fr2   r   )r<   r    c               sN   yt | jI d H }W n tk
r4   tdd Y nX |sJ| j I d H  |S )Nzgenerator didn't yield)r   anext_rJ   StopAsyncIterationRuntimeErroraclose)r"   r<   Zstart_valuer!   r!   r#   r=      s    zGeneratorStartableContext.startr   zOptional[bool])typrA   rB   r    c          
     s  |d kr>yt | jI d H  W n tk
r2   dS X tdn|d krL| }y| j|I d H  W n tk
r } z||k	S d }~X Y nx tk
r } z.||krdS t|ttfr|j|krdS  W d d }~X Y n. t	k
 r } z||k	r dS d }~X Y nX tdd S )NFzgenerator didn't stopz$generator didn't stop after athrow())
r   rO   rJ   rP   rQ   athrow
isinstanceStopIteration	__cause__BaseException)r"   rS   rA   rB   r   r!   r!   r#   rC      s0    
	
z#GeneratorStartableContext.__aexit__N)F)r5   r6   r7   r9   r8   rN   r=   rC   r!   r!   r!   r#   rI      s
   
rI   z#Callable[..., AsyncIterator[_T_co]]z/Callable[..., GeneratorStartableContext[_T_co]])rK   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::

        @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])rL   rM   r    c                s   t  | |S )N)rI   )rL   rM   )rK   r!   r#   helper   s    z%asyncstartablecontext.<locals>.helper)r)   wraps)rK   rY   r!   )rK   r#   asyncstartablecontext   s    # r[   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   )r    c             C  s
   t  d S )N)r.   )r"   r!   r!   r#   _proxied  s    zProxyComparable._proxiedintc             C  s   t | S )N)id)r"   r!   r!   r#   __hash__
  s    zProxyComparable.__hash__r   r2   )otherr    c             C  s   t || jo| j|jkS )N)rU   rE   r]   )r"   ra   r!   r!   r#   __eq__  s    zProxyComparable.__eq__c             C  s   t || j p| j|jkS )N)rU   rE   r]   )r"   ra   r!   r!   r#   __ne__  s    zProxyComparable.__ne__N)
r5   r6   r7   r9   r   Zro_non_memoized_propertyr]   r`   rb   rc   r!   r!   r!   r#   r\     s
   r\   )$
__future__r   rG   r)   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r&    r   rD   r   Zutil.typingr   r   r   r   r   r   ABCr;   rI   r[   r\   r!   r!   r!   r#   <module>   s:   FQ*