U
    a1                     @   sT   d dl Z d dlZd dlmZ d dlmZmZmZ G dd dZe j	dddd	Z
dS )
    N)TracebackType)AnyOptionalTypec                   @   s   e Zd ZdZddee eej ddddZd ddd	Z	e
e eeee d
ddZd dddZe
e eedd
ddZeedddZeee dddZd dddZe
e ddddZddddZdS )timeouta  timeout context manager.

    Useful in cases when you want to apply timeout logic around block
    of code or in cases when asyncio.wait_for is not suitable. For example:

    >>> with timeout(0.001):
    ...     async with aiohttp.get('https://github.com') as r:
    ...         await r.text()


    timeout - value in seconds or None to disable timeout logic
    loop - asyncio compatible event loop
    Nloop)r   r   returnc                C   s8   || _ |d krt }|| _d | _d| _d | _d | _d S )NF)_timeoutasyncioZget_event_loop_loop_task
_cancelled_cancel_handler
_cancel_at)selfr   r    r   ~/home/adriano.carvalho/ftp/files/BrinquedotecaVirtual/brinquedotecavirtual/venv/lib/python3.8/site-packages/asgiref/timeout.py__init__   s    ztimeout.__init__)r	   c                 C   s   |   S N	_do_enterr   r   r   r   	__enter__-   s    ztimeout.__enter__)exc_typeexc_valexc_tbr	   c                 C   s   |  | d S r   _do_exitr   r   r   r   r   r   r   __exit__0   s    
ztimeout.__exit__c                    s   |   S r   r   r   r   r   r   
__aenter__9   s    ztimeout.__aenter__c                    s   |  | d S r   r   r   r   r   r   	__aexit__<   s    ztimeout.__aexit__c                 C   s   | j S r   )r   r   r   r   r   expiredD   s    ztimeout.expiredc                 C   s(   | j d k	r t| j | j  dS d S d S )Ng        )r   maxr   timer   r   r   r   	remainingH   s    
ztimeout.remainingc                 C   sr   | j d kr| S t| j| _| jd kr,td| j dkrH| j| j | S | j | j  | _| j	| j| j| _
| S )Nz4Timeout context manager should be used inside a taskr   )r
   current_taskr   r   RuntimeErrorZ	call_soon_cancel_taskr%   r   Zcall_atr   r   r   r   r   r   O   s    


ztimeout._do_enter)r   r	   c                 C   sP   |t jkr"| jr"d | _d | _t j| jd k	rF| jd k	rF| j  d | _d | _d S r   )r   ZCancelledErrorr   r   r   TimeoutErrorr
   cancel)r   r   r   r   r   r   c   s    
ztimeout._do_exitc                 C   s   | j d k	r| j   d| _d S )NT)r   r+   r   r   r   r   r   r)   n   s    

ztimeout._cancel_task)__name__
__module____qualname____doc__r   floatr   AbstractEventLoopr   r   r   BaseExceptionr   boolr    r!   r"   propertyr#   r&   r   r   r)   r   r   r   r   r      s4   	r   zOptional[asyncio.Task[Any]])r   r	   c                 C   sL   t jdkrtj| d}ntjj| d}|d krHt| dd }|d k	rH| }|S )N)      r   r'   )sysversion_infor   r'   ZTaskgetattr)r   Ztaskfnr   r   r   r'   t   s    
r'   )r   r7   typesr   typingr   r   r   r   r1   r'   r   r   r   r   <module>	   s
   e