o
    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(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#   ]/var/www/html/ecg_monitoring/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   
target_ref	proxy_refr#   r#   r&   r'   4   s   
Nr,   weakref.ref[_PT]r1   Optional[weakref.ref[Self]]c                 C  s   | j |d  d S r"   )r   pop)clsr,   r1   r#   r#   r&   r-   A   s   zReversibleProxy._target_gcedr   c                 C     t  r"   NotImplementedError)r5   r   r#   r#   r&   _regenerate_proxy_for_targetI      z,ReversibleProxy._regenerate_proxy_for_target.
regenerateLiteral[True]c                 C  r!   r"   r#   r5   r   r;   r#   r#   r&   _retrieve_proxy_for_targetM   s   z*ReversibleProxy._retrieve_proxy_for_targetTboolOptional[Self]c                 C  r!   r"   r#   r=   r#   r#   r&   r>   U   s   c                 C  sL   z
| j t| }W n	 ty   Y n
w | }|d ur|S |r$| |S d S r"   )r   r+   r,   KeyErrorr9   )r5   r   r;   r1   proxyr#   r#   r&   r>   [   s   
)r   r   r    r   )r   r)   r    r)   )r   r*   r    r*   r"   )r,   r2   r1   r3   r    r)   )r   r   r    r   ).)r   r   r;   r<   r    r   )T)r   r   r;   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_exc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   rX   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`   rb   rd   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   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   rg   r_   rh   ri   athrow
isinstanceStopIteration	__cause__BaseException)r%   rl   rQ   rR   r   r#   r#   r&   rT      s>   !	
z#GeneratorStartableContext.__aexit__N)r`   ra   rb   rc   rd   re   rY   rZ   )rl   r   rQ   r   rR   r   r    rS   )rC   rD   rE   rG   rF   rf   rK   rT   r#   r#   r#   r&   r]      s   
 
r]   r`   ra   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.


    rb   r   rd   r     GeneratorStartableContext[_T_co]c                    s   t  | |S r"   )r]   )rb   rd   r`   r#   r&   helper   s   z%asyncstartablecontext.<locals>.helperN)rb   r   rd   r   r    rs   )r.   wraps)r`   ru   r#   rt   r&   asyncstartablecontext   s   %rw   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  r:   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"   rn   rW   ry   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    rz   )r}   r   r    r?   )
rC   rD   rE   rG   r   ro_non_memoized_propertyry   r|   r   r   r#   r#   r#   r&   rx     s    

rx   )r`   ra   r    rr   )$
__future__r   r[   r.   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r+    r   rU   r   util.typingr   r   r   r   r   r   ABCrI   r]   rw   rx   r#   r#   r#   r&   <module>   s<   F
Q,