HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //usr/local/lib/python3.10/dist-packages/sqlalchemy/ext/asyncio/__pycache__/base.cpython-310.pyc
o

���g�"�@s�ddlmZddlZddlZddlmZddlmZddlmZddlmZddlm	Z	ddlm
Z
dd	lmZdd
lmZddlm
Z
ddlmZdd
lmZddlmZddlmZddlmZddlZddlmZddlmZddlmZddlmZeded�Zededd�Zeded�ZGdd�de
e�ZGdd �d eeej�Z Gd!d"�d"e e�Z!d+d'd(�Z"Gd)d*�d*ee�Z#dS),�)�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�eZdZUiZded<dZed!dd��Zed"d
d��Zd#dd�Ze	
d$d%dd��Z	ed&dd��Z
ee	d'd(dd���Zee	d)d*dd���Ze	d)d*d d��Zd
S)+�ReversibleProxyzCClassVar[Dict[weakref.ref[Any], weakref.ref[ReversibleProxy[Any]]]]�_proxy_objects)�__weakref__�targetr�returncC�dS�N���selfrr#r#�F/usr/local/lib/python3.10/dist-packages/sqlalchemy/ext/asyncio/base.py�_assign_proxied.�zReversibleProxy._assign_proxied�NonecCr!r"r#r$r#r#r&r'1r(�
Optional[_PT]cCs:|durt�|tj�}t�|t�tj|��}|tj|<|Sr")�weakref�refr�_target_gced�	functools�partialr)r%r�
target_ref�	proxy_refr#r#r&r'4s��
Nr,�weakref.ref[_PT]r1�Optional[weakref.ref[Self]]cCs|j�|d�dSr")r�pop)�clsr,r1r#r#r&r-AszReversibleProxy._target_gcedrcC�t��r"��NotImplementedError)r5rr#r#r&�_regenerate_proxy_for_targetI�z,ReversibleProxy._regenerate_proxy_for_target.�
regenerate�
Literal[True]cCr!r"r#�r5rr;r#r#r&�_retrieve_proxy_for_targetMsz*ReversibleProxy._retrieve_proxy_for_targetT�bool�Optional[Self]cCr!r"r#r=r#r#r&r>UscCsLz
|jt�|�}Wn	tyYn
w|�}|dur|S|r$|�|�SdSr")rr+r,�KeyErrorr9)r5rr;r1�proxyr#r#r&r>[s�
)rrr r)rr)r r))rr*r r*r")r,r2r1r3r r))rrr r).)rrr;r<r r)T)rrr;r?r r@)�__name__�
__module__�__qualname__r�__annotations__�	__slots__rr'�classmethodr-r9r>r#r#r#r&r(s2

�

����rc@sPeZdZdZejdddd��Zdd
d�Zddd
�Zejddd��Z	ddd�Z
dS)�StartableContextr#F�
is_ctxmanagerr?r rc�s�t��r"r7)r%rJr#r#r&�startqs�zStartableContext.start�Generator[Any, Any, _T_co]cCs|����Sr")rK�	__await__�r%r#r#r&rMuszStartableContext.__await__c�s�|jdd�IdHS)NT)rJ)rKrNr#r#r&�
__aenter__xs�zStartableContext.__aenter__�type_r�value�	traceback�Optional[bool]c�s�dSr"r#)r%rPrQrRr#r#r&�	__aexit__{s�zStartableContext.__aexit__rcCst�d|jj��)Nz@%s context has not been started and object has not been awaited.)�	async_exc�AsyncContextNotStarted�	__class__rCrNr#r#r&�_raise_for_not_started�s
��z'StartableContext._raise_for_not_startedN�F�rJr?r r)r rL)r r)rPrrQrrRrr rS)r r)rCrDrErG�abc�abstractmethodrKrMrOrTrXr#r#r#r&rIns

rIc@s:eZdZUdZded<dd
d�Zdddd�Zddd�ZdS)�GeneratorStartableContext��genzAsyncGenerator[_T_co, Any]r_�func�#Callable[..., AsyncIterator[_T_co]]�args�Tuple[Any, ...]�kwds�Dict[str, Any]cCs||i|��|_dSr"r^)r%r`rbrdr#r#r&�__init__�sz"GeneratorStartableContext.__init__FrJr?r rc�sJ�zt�|j�IdH}Wntytd�d�w|s#|j��IdH|S)Nzgenerator didn't yield)r�anext_r_�StopAsyncIteration�RuntimeError�aclose)r%rJ�start_valuer#r#r&rK�s�
�zGeneratorStartableContext.start�typrrQrRrSc
�s�|durzt�|j�IdHWtd��tyYdSw|dur%|�}z|j�|�IdHWtd��tyI}z
||uWYd}~Sd}~wtys}z||ur[WYd}~dSt|ttf�rn|j|urnWYd}~dS�d}~wt	y�}z||ur�WYd}~dSd}~ww)NFzgenerator didn't stopz$generator didn't stop after athrow())
rrgr_rhri�athrow�
isinstance�
StopIteration�	__cause__�
BaseException)r%rlrQrRrr#r#r&rT�s>���!��	�
���z#GeneratorStartableContext.__aexit__N)r`rarbrcrdrerYrZ)rlrrQrrRrr rS)rCrDrErGrFrfrKrTr#r#r#r&r]�s

r]r`rar �/Callable[..., GeneratorStartableContext[_T_co]]cst���d	�fdd��}|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.


    rbrrdr � GeneratorStartableContext[_T_co]cst�||�Sr")r])rbrd�r`r#r&�helper�sz%asyncstartablecontext.<locals>.helperN)rbrrdrr rs)r.�wraps)r`rur#rtr&�asyncstartablecontext�s%rwc@s>eZdZdZejddd��Zddd�Zddd
�Zddd�Z	dS)�ProxyComparabler#r rcCr6r"r7rNr#r#r&�_proxiedr:zProxyComparable._proxied�intcCst|�Sr")�idrNr#r#r&�__hash__szProxyComparable.__hash__�otherrr?cCst||j�o|j|jkSr"�rnrWry�r%r}r#r#r&�__eq__s
�zProxyComparable.__eq__cCst||j�p|j|jkSr"r~rr#r#r&�__ne__s
�zProxyComparable.__ne__N)r r)r rz)r}rr r?)
rCrDrErGr�ro_non_memoized_propertyryr|r�r�r#r#r#r&rxs

rx)r`rar rr)$�
__future__rr[r.�typingrrrrrrr	r
rrr
rrrr+�rrUr�util.typingrrrrrr�ABCrIr]rwrxr#r#r#r&�<module>s<F
Q,