B
    HVvg+  ã               @   sJ   d dl Z d dlZd dlmZ d dlmZ d dlmZmZ G 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   sF   || _ |d krt ¡ }nt dt¡ || _d | _d| _d | _	d | _
d S )Nz-The loop argument to timeout() is deprecated.F)Ú_timeoutÚasyncioZget_running_loopÚwarningsÚwarnÚDeprecationWarningÚ_loopÚ_taskÚ
_cancelledÚ_cancel_handlerÚ
_cancel_at)Úselfr   r   © r   ú4/tmp/pip-install-o3oxmrkh/asgiref/asgiref/timeout.pyÚ__init__   s    
ztimeout.__init__)r   c             C   s   |   ¡ S )N)Ú	_do_enter)r   r   r   r   Ú	__enter__2   s    ztimeout.__enter__)Úexc_typeÚexc_valÚexc_tbr   c             C   s   |   |¡ d S )N)Ú_do_exit)r   r   r   r   r   r   r   Ú__exit__5   s    
ztimeout.__exit__c             Ã   s   |   ¡ S )N)r   )r   r   r   r   Ú
__aenter__>   s    ztimeout.__aenter__c             Ã   s   |   |¡ d S )N)r   )r   r   r   r   r   r   r   Ú	__aexit__A   s    ztimeout.__aexit__c             C   s   | j S )N)r   )r   r   r   r   ÚexpiredI   s    ztimeout.expiredc             C   s(   | j d k	r t| j | j ¡  dƒS d S d S )Ng        )r   Úmaxr   Útime)r   r   r   r   Ú	remainingM   s    
ztimeout.remainingc             C   st   | j d kr| S t | j¡| _| jd kr.tdƒ‚| j dkrJ| j | j¡ | S | j ¡ | j  | _	| j 
| j	| j¡| _| S )Nz4Timeout context manager should be used inside a taskr   )r	   r
   Zcurrent_taskr   r   ÚRuntimeErrorZ	call_soonÚ_cancel_taskr"   r   Zcall_atr   )r   r   r   r   r   T   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 )N)r
   ZCancelledErrorr   r   r   ÚTimeoutErrorr	   Úcancel)r   r   r   r   r   r   h   s    
ztimeout._do_exitc             C   s   | j d k	r| j  ¡  d| _d S )NT)r   r'   r   )r   r   r   r   r%   s   s    

ztimeout._cancel_task)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úfloatr
   ZAbstractEventLoopr   r   r   ÚBaseExceptionr   Úboolr   r   r   Úpropertyr    r#   r   r   r%   r   r   r   r   r      s(   r   )	r
   r   Útypesr   Útypingr   r   r   r   r   r   r   r   Ú<module>	   s
   