o
    E6dT$                     @  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#   rC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\sqlalchemy/ext/asyncio/base.py_assign_proxied.      zReversibleProxy._assign_proxiedNonec                 C  r!   r"   r#   r$   r#   r#   r&   r'   2   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'   6   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-   E   s   zReversibleProxy._target_gcedr   c                 C     t  r"   NotImplementedError)r4   r   r#   r#   r&   _regenerate_proxy_for_targetM      z,ReversibleProxy._regenerate_proxy_for_target.
regenerateLiteral[True]c                 C  r!   r"   r#   r4   r   r:   r#   r#   r&   _retrieve_proxy_for_targetQ   s   z*ReversibleProxy._retrieve_proxy_for_targetTboolOptional[Self]c                 C  r!   r"   r#   r<   r#   r#   r&   r=   Z   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,   KeyErrorr8   )r4   r   r:   r0   proxyr#   r#   r&   r=   a   s   
)r   r   r    r   )r   r)   r    r)   )r   r*   r    r*   r"   )r,   r1   r0   r2   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-   r8   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"   r6   )r%   rI   r#   r#   r&   startw   s   zStartableContext.startGenerator[Any, Any, _T_co]c                 C  s   |    S r"   )rJ   	__await__r%   r#   r#   r&   rL   {   s   zStartableContext.__await__c                   s   | j ddI d H S )NT)rI   )rJ   rM   r#   r#   r&   
__aenter__~   s   zStartableContext.__aenter__type_r   value	tracebackOptional[bool]c                   s   d S r"   r#   )r%   rO   rP   rQ   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__rB   rM   r#   r#   r&   _raise_for_not_started   s
   z'StartableContext._raise_for_not_startedNFrI   r>   r    r   )r    rK   )r    r   )rO   r   rP   r   rQ   r   r    rR   )r    r   )rB   rC   rD   rF   abcabstractmethodrJ   rL   rN   rS   rV   r#   r#   r#   r&   rH   t   s    

rH   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^   r`   rb   r#   r#   r&   __init__   s   z"GeneratorStartableContext.__init__FrI   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%   rI   Zstart_valuer#   r#   r&   rJ      s   
zGeneratorStartableContext.starttypr   rP   rQ   rR   c              
     s  |d u rzt | jI d H  W td ty   Y dS w |d u r%| }zt | j|||I d H  W td tyL } z
||uW  Y d }~S d }~w tyv } z||u r^W Y d }~dS t|ttfrq|j|u rqW 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   re   r]   rf   rg   athrow
isinstanceStopIteration	__cause__BaseException)r%   ri   rP   rQ   r   r#   r#   r&   rS      s>   !	
z#GeneratorStartableContext.__aexit__N)r^   r_   r`   ra   rb   rc   rW   rX   )ri   r   rP   r   rQ   r   r    rR   )rB   rC   rD   rF   rE   rd   rJ   rS   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::

        @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`   r   rb   r     GeneratorStartableContext[_T_co]c                    s   t  | |S r"   )r[   )r`   rb   r^   r#   r&   helper  s   z%asyncstartablecontext.<locals>.helperN)r`   r   rb   r   r    rp   )r.   wraps)r^   rr   r#   rq   r&   asyncstartablecontext   s   #rt   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  r5   r"   r6   rM   r#   r#   r&   _proxied  r9   zProxyComparable._proxiedintc                 C  s   t | S r"   )idrM   r#   r#   r&   __hash__  s   zProxyComparable.__hash__otherr   r>   c                 C  s   t || jo| j|jkS r"   rk   rU   rv   r%   rz   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    rw   )rz   r   r    r>   )
rB   rC   rD   rF   r   Zro_non_memoized_propertyrv   ry   r}   r~   r#   r#   r#   r&   ru   	  s    

ru   )r^   r_   r    ro   )$
__future__r   rY   r.   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r+    r   rT   r   Zutil.typingr   r   r   r   r   r   ABCrH   r[   rt   ru   r#   r#   r#   r&   <module>   s<   L
Q*