o
    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#   o/var/www/html/construction_image-detection-poc/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_gcedadditional_kwr   r   c                 K     t  r"   NotImplementedError)r5   r   r6   r#   r#   r&   _regenerate_proxy_for_targetI   s   z,ReversibleProxy._regenerate_proxy_for_target.
regenerateLiteral[True]c                 K  r!   r"   r#   r5   r   r;   r6   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,   KeyErrorr:   )r5   r   r;   r6   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   r6   r   r    r   ).)r   r   r;   r<   r6   r   r    r   )T)r   r   r;   r@   r6   r   r    rA   )__name__
__module____qualname__r   __annotations__	__slots__r   r'   classmethodr-   r:   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"   r8   )r%   rK   r#   r#   r&   startq   s   zStartableContext.startGenerator[Any, Any, _T_co]c                 C  s   |    S r"   )rL   	__await__r%   r#   r#   r&   rN   u   s   zStartableContext.__await__c                   s   | j ddI d H S )NT)rK   )rL   rO   r#   r#   r&   
__aenter__x   s   zStartableContext.__aenter__type_r   value	tracebackOptional[bool]c                   s   d S r"   r#   )r%   rQ   rR   rS   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__rD   rO   r#   r#   r&   _raise_for_not_started   s
   z'StartableContext._raise_for_not_startedNFrK   r@   r    r   )r    rM   )r    r   )rQ   r   rR   r   rS   r   r    rT   )r    r   )rD   rE   rF   rH   abcabstractmethodrL   rN   rP   rU   rY   r#   r#   r#   r&   rJ   n   s    

rJ   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%   ra   rc   re   r#   r#   r&   __init__   s   z"GeneratorStartableContext.__init__FrK   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%   rK   start_valuer#   r#   r&   rL      s   
zGeneratorStartableContext.starttypr   rR   rS   rT   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   rh   r`   ri   rj   athrow
isinstanceStopIteration	__cause__BaseException)r%   rm   rR   rS   r   r#   r#   r&   rU      s>   !	
z#GeneratorStartableContext.__aexit__N)ra   rb   rc   rd   re   rf   rZ   r[   )rm   r   rR   r   rS   r   r    rT   )rD   rE   rF   rH   rG   rg   rL   rU   r#   r#   r#   r&   r^      s   
 
r^   ra   rb   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.


    rc   r   re   r     GeneratorStartableContext[_T_co]c                    s   t  | |S r"   )r^   )rc   re   ra   r#   r&   helper   s   z%asyncstartablecontext.<locals>.helperN)rc   r   re   r   r    rt   )r.   wraps)ra   rv   r#   ru   r&   asyncstartablecontext   s   %rx   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  r7   r"   r8   rO   r#   r#   r&   _proxied  s   zProxyComparable._proxiedintc                 C  s   t | S r"   )idrO   r#   r#   r&   __hash__  s   zProxyComparable.__hash__otherr   r@   c                 C  s   t || jo| j|jkS r"   ro   rX   rz   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    r{   )r~   r   r    r@   )
rD   rE   rF   rH   r   ro_non_memoized_propertyrz   r}   r   r   r#   r#   r#   r&   ry     s    

ry   )ra   rb   r    rs   )$
__future__r   r\   r.   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r+    r   rV   r   util.typingr   r   r   r   r   r   ABCrJ   r^   rx   ry   r#   r#   r#   r&   <module>   s<   F
Q,