a
    [g#                     @  s  d dl mZ d dlZ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mZ edZejrG dd deZddddZnd dlmZ d dlmZ ee dZddd d!d"ZG d#d$ d$eZ ed%d&d'Z!er|d(d)d*d+d,Z"nej"Z"d-d.d*d/d0Z#ddd1d2Z$d3dd*d4d5Z%d3dd*d6d7Z&d8d9d:d;dd;dd<d=d>Z'G d?d@ d@Z(dAddBdCZ)eserej*Z+nG dDdE dEZ+dS )F    )annotationsN)Context)Any)	Awaitable)Callable)	Coroutine)Optional)TYPE_CHECKING)TypeVar)Union   )memoized_property   )exc)py311)Literal)Protocol)Self)	TypeGuard_Tc                   @  sN   e Zd ZU ded< ded< dd dddZd	d	d
ddZd	d	dddZdS )greenletbooldeadzOptional[Context]
gr_contextCallable[..., Any]fndriverc                 C  s   d S N selfr   r   r   r   o/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/sqlalchemy/util/_concurrency_py3k.py__init__(       zgreenlet.__init__r   )argreturnc                 G  s   d S r   r   )r!   r%   r   r   r"   throw*   s    zgreenlet.throw)valuer&   c                 C  s   d S r   r   )r!   r(   r   r   r"   switch-   s    zgreenlet.switchN)__name__
__module____qualname____annotations__r#   r'   r)   r   r   r   r"   r   $   s
   
r   r&   c                   C  s   d S r   r   r   r   r   r"   
getcurrent0   r$   r/   )r/   )r   r   BaseExceptionr   )er&   c                 C  s   t | t pt | tjtjfS r   )
isinstance	ExceptionasyncioTimeoutErrorCancelledError)r1   r   r   r"   is_exit_exception=   s    r7   c                   @  s*   e Zd ZU ded< dZdddddZd	S )
_AsyncIoGreenletr   r   Tr   r   r   c                 C  s   t | || tr|j| _d S r   )r   r#   _has_gr_contextr   r    r   r   r"   r#   O   s    z_AsyncIoGreenlet.__init__N)r*   r+   r,   r-    __sqlalchemy_greenlet_provider__r#   r   r   r   r"   r8   J   s   
r8   _T_coT)	covariantzAwaitable[_T_co]z%TypeGuard[Coroutine[Any, Any, _T_co]])	awaitabler&   c                 C  s   d S r   r   r=   r   r   r"   iscoroutineY   s    r?   zAwaitable[Any]Nonec                 C  s   t | r|   d S r   )r?   closer>   r   r   r"   _safe_cancel_awaitablea   s    rB   c                  C  s   t  } t| ddS )Nr:   F)r/   getattr)currentr   r   r"   in_greenleth   s    rE   zAwaitable[_T]c                 C  s0   t  }t|dds$t|  td|j| S )zAwaits an async function in a sync method.

    The sync method must be inside a :func:`greenlet_spawn` context.
    :func:`await_only` calls cannot be nested.

    :param awaitable: The coroutine to call.

    r:   Fzjgreenlet_spawn has not been called; can't call await_only() here. Was IO attempted in an unexpected place?)r/   rC   rB   r   MissingGreenletparentr)   )r=   rD   r   r   r"   
await_onlym   s    
	rH   c                 C  sH   t  }t|dds<t }| r2t|  td|| S |j	| S )a  Awaits an async function in a sync method.

    The sync method must be inside a :func:`greenlet_spawn` context.
    :func:`await_fallback` calls cannot be nested.

    :param awaitable: The coroutine to call.

    .. deprecated:: 2.0.24 The ``await_fallback()`` function will be removed
       in SQLAlchemy 2.1.  Use :func:`_util.await_only` instead, running the
       function / program / etc. within a top-level greenlet that is set up
       using :func:`_util.greenlet_spawn`.

    r:   Fzgreenlet_spawn has not been called and asyncio event loop is already running; can't call await_fallback() here. Was IO attempted in an unexpected place?)
r/   rC   get_event_loop
is_runningrB   r   rF   run_until_completerG   r)   )r=   rD   loopr   r   r"   await_fallback   s    
rM   F)_require_awaitzCallable[..., _T]r   )r   argsrN   kwargsr&   c                  s|   t | t }d}|j|i |}|jsfd}z|I dH }W n  tyX   |jt  }Y q 0 ||}q |rx|sxt	d|S )aG  Runs a sync function ``fn`` in a new greenlet.

    The sync function can then use :func:`await_only` to wait for async
    functions.

    :param fn: The sync callable to call.
    :param \*args: Positional arguments to pass to the ``fn`` callable.
    :param \*\*kwargs: Keyword arguments to pass to the ``fn`` callable.
    FTNzThe current operation required an async execution but none was detected. This will usually happen when using a non compatible DBAPI driver. Please ensure that an async DBAPI is used.)
r8   r/   r)   r   r0   r'   sysexc_infor   ZAwaitRequired)r   rN   rO   rP   contextZswitch_occurredresultr(   r   r   r"   greenlet_spawn   s    rU   c                   @  s>   e Zd ZeddddZddddZddd	d
ddZdS )AsyncAdaptedLockzasyncio.Lockr.   c                 C  s   t  S r   )r4   Lockr!   r   r   r"   mutex   s    zAsyncAdaptedLock.mutexr   c                 C  s   t | j S r   )rM   rY   acquirerX   r   r   r"   	__enter__   s    zAsyncAdaptedLock.__enter__r   r@   )r%   kwr&   c                 O  s   | j   d S r   )rY   release)r!   r%   r\   r   r   r"   __exit__   s    zAsyncAdaptedLock.__exit__N)r*   r+   r,   r   rY   r[   r^   r   r   r   r"   rV      s   rV   asyncio.AbstractEventLoopc                   C  s*   z
t  W S  ty   Y n0 t   S )z}vendor asyncio.get_event_loop() for python 3.7 and above.

    Python 3.10 deprecates get_event_loop() as a standalone.

    )r4   get_running_loopRuntimeErrorget_event_loop_policyrI   r   r   r   r"   rI      s
    
rI   c                   @  s   e Zd ZU dZded< ddddZddd	d
ZdddddddZddddZddddZ	dddddZ
ddddZdS )_Runnerz#Runner implementation for test onlyz6Union[None, asyncio.AbstractEventLoop, Literal[False]]_loopr@   r.   c                 C  s
   d | _ d S r   )rd   rX   r   r   r"   r#      s    z_Runner.__init__r   c                 C  s   |    | S r   )
_lazy_initrX   r   r   r"   r[      s    z_Runner.__enter__r   )exc_typeexc_valexc_tbr&   c                 C  s   |    d S r   )rA   )r!   rf   rg   rh   r   r   r"   r^     s    z_Runner.__exit__c                 C  sD   | j r@z&| j | j   W | j   d| _ n| j   d| _ 0 d S )NF)rd   rK   shutdown_asyncgensrA   rX   r   r   r"   rA     s    

z_Runner.closer_   c                 C  s   |    | jsJ | jS )zReturn embedded event loop.)re   rd   rX   r   r   r"   get_loop  s    
z_Runner.get_loopzCoroutine[Any, Any, _T]r   )coror&   c                 C  s   |    | jsJ | j|S r   )re   rd   rK   )r!   rk   r   r   r"   run  s    
z_Runner.runc                 C  s*   | j du rtd| j d u r&t | _ d S )NFzRunner is closed)rd   ra   r4   new_event_looprX   r   r   r"   re     s    

z_Runner._lazy_initN)r*   r+   r,   __doc__r-   r#   r[   r^   rA   rj   rl   re   r   r   r   r"   rc      s   

rc   ),
__future__r   r4   contextvarsr   rQ   typingr   r   r   r   r   r	   r
   r   Zlanghelpersr    r   utilr   Zutil.typingr   r   r   r   r   r   r/   hasattrr9   r7   r8   r;   r?   rB   rE   rH   rM   rU   rV   rI   ZRunnerrc   r   r   r   r"   <module>	   sV   #/