o
    XJ@hH#                     @  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(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Zed$d
dZd%ddZe	d&d'ddZ	ed(ddZ
ee	d)d*ddZee	d+d,d!dZe	d+d,d"dZdS )-ReversibleProxyzCClassVar[Dict[weakref.ref[Any], weakref.ref[ReversibleProxy[Any]]]]_proxy_objects)__weakref__targetr   returnc                 C     d S N selfr   r#   r#   N/var/www/html/venv/lib/python3.10/site-packages/sqlalchemy/ext/asyncio/base.py_assign_proxied.      zReversibleProxy._assign_proxiedNonec                 C  r!   r"   r#   r$   r#   r#   r&   r'   1   r(   Optional[_PT]c                 C  s:   |d urt |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   
Nr,   weakref.ref[_PT]r0   Optional[weakref.ref[Self]]c                 C  s   | j |d  d S r"   )r   pop)clsr,   r0   r#   r#   r&   r-   A   s   zReversibleProxy._target_gcedadditional_kwr   r   c                 K     t  r"   NotImplementedError)r4   r   r5   r#   r#   r&   _regenerate_proxy_for_targetI   s   z,ReversibleProxy._regenerate_proxy_for_target.
regenerateLiteral[True]c                 K  r!   r"   r#   r4   r   r:   r5   r#   r#   r&   _retrieve_proxy_for_targetO      z*ReversibleProxy._retrieve_proxy_for_targetTboolOptional[Self]c                 K  r!   r"   r#   r<   r#   r#   r&   r=   U   r>   c                 K  sT   z
| j t| }W n	 ty   Y n
w | }|d ur|S |r(| j|fi |S d S r"   )r   r+   r,   KeyErrorr9   )r4   r   r:   r5   r0   proxyr#   r#   r&   r=   [   s   )r   r   r    r   )r   r)   r    r)   )r   r*   r    r*   r"   )r,   r1   r0   r2   r    r)   )r   r   r5   r   r    r   ).)r   r   r:   r;   r5   r   r    r   )T)r   r   r:   r?   r5   r   r    r@   )__name__
__module____qualname__r   __annotations__	__slots__r   r'   classmethodr-   r9   r=   r#   r#   r#   r&   r   (   s2   
 

r   c                   @  sP   e Zd ZdZejddddZdd
dZdddZejdddZ	dddZ
dS )StartableContextr#   Fis_ctxmanagerr?   r    r   c                   s   t  r"   r7   )r%   rJ   r#   r#   r&   startq   s   zStartableContext.startGenerator[Any, Any, _T_co]c                 C  s   |    S r"   )rK   	__await__r%   r#   r#   r&   rM   u   s   zStartableContext.__await__c                   s   | j ddI d H S )NT)rJ   )rK   rN   r#   r#   r&   
__aenter__x   s   zStartableContext.__aenter__type_r   value	tracebackOptional[bool]c                   s   d S r"   r#   )r%   rP   rQ   rR   r#   r#   r&   	__aexit__{   s   zStartableContext.__aexit__r   c                 C  s   t d| jj )Nz@%s context has not been started and object has not been awaited.)	async_excZAsyncContextNotStarted	__class__rC   rN   r#   r#   r&   _raise_for_not_started   s
   z'StartableContext._raise_for_not_startedNFrJ   r?   r    r   )r    rL   )r    r   )rP   r   rQ   r   rR   r   r    rS   )r    r   )rC   rD   rE   rG   abcabstractmethodrK   rM   rO   rT   rW   r#   r#   r#   r&   rI   n   s    

rI   c                   @  s:   e Zd ZU dZded< dd
dZddddZdddZdS )GeneratorStartableContextgenzAsyncGenerator[_T_co, Any]r^   func#Callable[..., AsyncIterator[_T_co]]argsTuple[Any, ...]kwdsDict[str, Any]c                 C  s   ||i || _ d S r"   r]   )r%   r_   ra   rc   r#   r#   r&   __init__   s   z"GeneratorStartableContext.__init__FrJ   r?   r    r   c                   sJ   zt | jI d H }W n ty   tdd w |s#| j I d H  |S )Nzgenerator didn't yield)r   anext_r^   StopAsyncIterationRuntimeErroraclose)r%   rJ   Zstart_valuer#   r#   r&   rK      s   
zGeneratorStartableContext.starttypr   rQ   rR   rS   c              
     s  |d u rzt | jI d H  W td ty   Y dS w |d u r%| }z| j|I d H  W td tyI } z
||uW  Y d }~S d }~w tys } z||u r[W Y d }~dS t|ttfrn|j|u rnW Y d }~dS  d }~w t	y } z||ur W Y d }~dS d }~ww )NFzgenerator didn't stopz$generator didn't stop after athrow())
r   rf   r^   rg   rh   athrow
isinstanceStopIteration	__cause__BaseException)r%   rj   rQ   rR   r   r#   r#   r&   rT      s>   !	
z#GeneratorStartableContext.__aexit__N)r_   r`   ra   rb   rc   rd   rX   rY   )rj   r   rQ   r   rR   r   r    rS   )rC   rD   rE   rG   rF   re   rK   rT   r#   r#   r#   r&   r\      s   
 
r\   r_   r`   r    /Callable[..., GeneratorStartableContext[_T_co]]c                   s   t  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.


    ra   r   rc   r     GeneratorStartableContext[_T_co]c                    s   t  | |S r"   )r\   )ra   rc   r_   r#   r&   helper   s   z%asyncstartablecontext.<locals>.helperN)ra   r   rc   r   r    rq   )r.   wraps)r_   rs   r#   rr   r&   asyncstartablecontext   s   %ru   c                   @  s>   e Zd ZdZejdddZdddZdddZdddZ	dS )ProxyComparabler#   r    r   c                 C  r6   r"   r7   rN   r#   r#   r&   _proxied  s   zProxyComparable._proxiedintc                 C  s   t | S r"   )idrN   r#   r#   r&   __hash__  s   zProxyComparable.__hash__otherr   r?   c                 C  s   t || jo| j|jkS r"   rl   rV   rw   r%   r{   r#   r#   r&   __eq__  s   
zProxyComparable.__eq__c                 C  s   t || j p| j|jkS r"   r|   r}   r#   r#   r&   __ne__  s   
zProxyComparable.__ne__N)r    r   )r    rx   )r{   r   r    r?   )
rC   rD   rE   rG   r   Zro_non_memoized_propertyrw   rz   r~   r   r#   r#   r#   r&   rv     s    

rv   )r_   r`   r    rp   )$
__future__r   rZ   r.   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r+    r   rU   r   Zutil.typingr   r   r   r   r   r   ABCrI   r\   ru   rv   r#   r#   r#   r&   <module>   s<   F
Q,