U
    Œàôgž  ã                   @   sr   d dl Z d dlmZ d dlmZmZmZmZmZm	Z	m
Z
 d dlmZmZ e
dƒZer`d dlmZ G dd„ dƒZdS )	é    N)Úsleep)ÚTYPE_CHECKINGÚAnyÚCallableÚIterableÚTupleÚTypeÚTypeVar)ÚConnectionErrorÚTimeoutErrorÚT)ÚAbstractBackoffc                   @   sv   e Zd ZdZeeejffdee	e
e df dœdd„Zee
e  ddœd	d
„Zeg ef eegef edœdd„ZdS )ÚRetryz0Retry a specific number of times after a failurer   .)ÚbackoffÚretriesÚsupported_errorsc                 C   s   || _ || _|| _dS )a'  
        Initialize a `Retry` object with a `Backoff` object
        that retries a maximum of `retries` times.
        `retries` can be negative to retry forever.
        You can specify the types of supported errors which trigger
        a retry with the `supported_errors` parameter.
        N)Ú_backoffÚ_retriesÚ_supported_errors)Úselfr   r   r   © r   ú//tmp/pip-unpacked-wheel-f3sx1i9r/redis/retry.pyÚ__init__   s    zRetry.__init__N)Úspecified_errorsÚreturnc                 C   s   t t| jt |ƒ ƒƒ| _dS )zM
        Updates the supported errors with the specified error types
        N)ÚtupleÚsetr   )r   r   r   r   r   Úupdate_supported_errors%   s    ÿzRetry.update_supported_errors)ÚdoÚfailr   c              
   C   s†   | j  ¡  d}z|ƒ W S  | jk
r~ } zH|d7 }||ƒ | jdkrR|| jkrR|‚| j  |¡}|dkrnt|ƒ W 5 d}~X Y qX qdS )a&  
        Execute an operation that might fail and returns its result, or
        raise the exception that was thrown depending on the `Backoff` object.
        `do`: the operation to call. Expects no argument.
        `fail`: the failure handler, expects the last error that was thrown
        r   é   N)r   Úresetr   r   Zcomputer   )r   r   r   ZfailuresÚerrorr   r   r   r   Úcall_with_retry/   s    
zRetry.call_with_retry)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   ÚsocketÚtimeoutÚintr   r   Ú	Exceptionr   r   r   r   r   r   r#   r   r   r   r   r      s"   ýüü
þ
ür   )r(   Útimer   Útypingr   r   r   r   r   r   r	   Zredis.exceptionsr
   r   r   Zredis.backoffr   r   r   r   r   r   Ú<module>   s   $