o
    "i~!                     @  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 edZejroG dd deZdHddZnd dlmZ d dlmZ ee dZdIddZG dd  d eZed!d"d#ZerdJd'd(ZnejZdKd+d,ZdLd-d.ZdMd0d1Z dMd2d3Z!d4d5dNd<d=Z"G d>d? d?Z#dOdAdBZ$dOdCdDZ%dPdFdGZ&dS )Q    )annotationsN)Context)Any)	Awaitable)Callable)	Coroutine)Optional)TYPE_CHECKING)TypeVar   )memoized_property   )exc)Protocol)	TypeGuard_Tc                   @  s<   e Zd ZU ded< ded< ddd	ZdddZdddZdS )greenletbooldeadzOptional[Context]
gr_contextfnCallable[..., Any]driverc                 C     d S N selfr   r   r   r   e/var/www/html/voicebot/backend/venv/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py__init__$       zgreenlet.__init__argr   returnc                 G  r   r   r   )r   r!   r   r   r   throw&      zgreenlet.throwvaluec                 C  r   r   r   )r   r%   r   r   r   switch)   r$   zgreenlet.switchNr   r   r   r   )r!   r   r"   r   )r%   r   r"   r   )__name__
__module____qualname____annotations__r   r#   r&   r   r   r   r   r       s   
 

r   r"   c                   C  r   r   r   r   r   r   r   
getcurrent,   r    r,   )r,   )r   r   eBaseExceptionr   c                 C  s   t | t pt | tjtjfS r   )
isinstance	ExceptionasyncioTimeoutErrorCancelledError)r-   r   r   r   is_exit_exception9   s   r4   c                   @  s    e Zd ZU ded< d
ddZd	S )_AsyncIoGreenletr   r   r   r   r   r   c                 C  s(   t | || || _tr|j| _d S d S r   )r   r   r   _has_gr_contextr   r   r   r   r   r   I   s
   z_AsyncIoGreenlet.__init__Nr'   )r(   r)   r*   r+   r   r   r   r   r   r5   F   s   
 r5   _T_coT)	covariant	awaitableAwaitable[_T_co]%TypeGuard[Coroutine[Any, Any, _T_co]]c                 C  r   r   r   r9   r   r   r   iscoroutineT   s   r=   Awaitable[Any]Nonec                 C  s   t | r
|   d S d S r   )r=   closer<   r   r   r   _safe_cancel_awaitable\   s   rA   c                  C  s   t  } t| tS r   )r,   r/   r5   )currentr   r   r   in_greenletc   s   
rC   Awaitable[_T]c                 C  s.   t  }t|t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.

    zjgreenlet_spawn has not been called; can't call await_only() here. Was IO attempted in an unexpected place?)r,   r/   r5   rA   r   MissingGreenletr   r&   )r9   rB   r   r   r   
await_onlyh   s   

	rF   c                 C  sF   t  }t|tst }| rt|  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`.

    zgreenlet_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,   r/   r5   get_event_loop
is_runningrA   r   rE   run_until_completer   r&   )r9   rB   loopr   r   r   await_fallback   s   

rK   F)_require_awaitr   Callable[..., _T]argsr   rL   kwargsc                  s   t | t }d}z1|j|i |}|js7d}z|I dH }W n ty.   |jt  }Y nw ||}|jrW |`n|`w |rG|sGt	
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.)r5   r,   r&   r   r.   r#   sysexc_infor   r   AwaitRequired)r   rL   rN   rO   contextswitch_occurredresultr%   r   r   r   greenlet_spawn   s*   
rV   c                   @  s.   e Zd ZedddZdddZdddZdS )AsyncAdaptedLockr"   asyncio.Lockc                 C  s   t  S r   )r1   Lockr   r   r   r   mutex   s   zAsyncAdaptedLock.mutexr   c                 C  s   t | j S r   )rK   r[   acquirerZ   r   r   r   	__enter__   s   zAsyncAdaptedLock.__enter__r!   r   kwr?   c                 O  s   | j   d S r   )r[   release)r   r!   r^   r   r   r   __exit__   s   zAsyncAdaptedLock.__exit__N)r"   rX   r"   r   )r!   r   r^   r   r"   r?   )r(   r)   r*   r   r[   r]   r`   r   r   r   r   rW      s
    
rW   'Callable[..., Coroutine[Any, Any, Any]]c                 O  s*   t  }| rtd|| |i |S )for test suite/ util onlyz]for async run coroutine we expect that no greenlet or event loop is running when we start out)rG   rH   r0   rI   r   rN   rO   rJ   r   r   r   "_util_async_run_coroutine_function   s   re   c                 O  sH   t  }| s|t| g|R i |S tt tsJ | |i |S )rc   )rG   rH   rI   rV   r/   r,   r5   rd   r   r   r   _util_async_run   s
   rf   asyncio.AbstractEventLoopc                   C  s*   zt  W S  ty   Y nw t   S )z}vendor asyncio.get_event_loop() for python 3.7 and above.

    Python 3.10 deprecates get_event_loop() as a standalone.

    )r1   get_running_loopRuntimeErrorget_event_loop_policyrG   r   r   r   r   rG      s   
rG   )r"   r   )r-   r.   r"   r   )r9   r:   r"   r;   )r9   r>   r"   r?   ra   )r9   rD   r"   r   )
r   rM   rN   r   rL   r   rO   r   r"   r   )r   rb   rN   r   rO   r   r"   r   )r"   rg   )'
__future__r   r1   contextvarsr   rP   typingr   r   r   r   r   r	   r
   langhelpersr    r   util.typingr   r   r   r   r,   hasattrr6   r4   r5   r7   r=   rA   rC   rF   rK   rV   rW   re   rf   rG   r   r   r   r   <module>   sN   





#2

