B
    Kkd&                 @   sl   d dl Z d dlmZ d dlZd dlZd dlZdZdd ZG dd deZ	G dd	 d	eZ
G d
d deZdS )    N)sixi?c                 sB   t  dkr,t d r,dd }| d S  fdd}|S dS )z
    Decorator function that instantiates the Retrying object
    @param *dargs: positional arguments passed to Retrying object
    @param **dkw: keyword arguments passed to the Retrying object
       r   c                s   t   fdd}|S )Nc                 s   t  j f| |S )N)Retryingcall)argskw)f 5/tmp/pip-install-gxxfd9b7/pip/pip/_vendor/retrying.py	wrapped_f$   s    z-retry.<locals>.wrap_simple.<locals>.wrapped_f)r   wraps)r   r   r	   )r   r
   wrap_simple"   s    zretry.<locals>.wrap_simplec                s   t   fdd}|S )Nc                 s   t  jf| |S )N)r   r   )r   r   )dargsdkwr   r	   r
   r   /   s    z&retry.<locals>.wrap.<locals>.wrapped_f)r   r   )r   r   )r   r   )r   r
   wrap-   s    zretry.<locals>.wrapN)lencallable)r   r   r   r   r	   )r   r   r
   retry   s
    r   c               @   sn   e Zd ZdddZdd Zdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )r   NFc                s  |d krdn|| _ |d krdn|| _|d kr0dn|| _|d krBdn|| _|d krTdn|| _|d krfdn|| _|	d krxdn|	| _|
d krdn|
| _|d krtn|| _	|d krdn|| _
g  |d k	r̈ | j |d k	r | j |d k	r|| _n&|d kr
 fdd| _nt| || _dd g|d k	r6| j |d k	sJ|d k	rV| j |d k	sj|	d k	rv| j |
d k	s|d k	r| j |d k	r|| _n&|d krfd	d| _nt| || _|d kr| j| _n|| _|d kr| j| _n|| _|| _d S )
N   d   i  r   r   c                s   t  fddD S )Nc             3   s   | ]}| V  qd S )Nr	   ).0r   )attemptsdelayr	   r
   	<genexpr>a   s    z6Retrying.__init__.<locals>.<lambda>.<locals>.<genexpr>)any)r   r   )
stop_funcs)r   r   r
   <lambda>a       z#Retrying.__init__.<locals>.<lambda>c              _   s   dS )Nr   r	   )r   kwargsr	   r	   r
   r   h   r   c                s   t  fddD S )Nc             3   s   | ]}| V  qd S )Nr	   )r   r   )r   r   r	   r
   r   y   s    z6Retrying.__init__.<locals>.<lambda>.<locals>.<genexpr>)max)r   r   )
wait_funcs)r   r   r
   r   y   r   )_stop_max_attempt_number_stop_max_delay_wait_fixed_wait_random_min_wait_random_max_wait_incrementing_start_wait_incrementing_increment_wait_exponential_multiplierMAX_WAIT_wait_exponential_max_wait_jitter_maxappendstop_after_attemptstop_after_delaystopgetattrfixed_sleeprandom_sleepincrementing_sleepexponential_sleepwaitalways_reject_retry_on_exceptionnever_reject_retry_on_result_wrap_exception)selfr/   r5   stop_max_attempt_numberstop_max_delay
wait_fixedwait_random_minwait_random_maxwait_incrementing_startwait_incrementing_incrementwait_exponential_multiplierwait_exponential_maxretry_on_exceptionretry_on_resultwrap_exception	stop_func	wait_funcwait_jitter_maxr	   )r   r    r
   __init__:   sR    








zRetrying.__init__c             C   s
   || j kS )z;Stop after the previous attempt >= stop_max_attempt_number.)r!   )r;   previous_attempt_numberdelay_since_first_attempt_msr	   r	   r
   r-      s    zRetrying.stop_after_attemptc             C   s
   || j kS )z=Stop after the time from the first attempt >= stop_max_delay.)r"   )r;   rL   rM   r	   r	   r
   r.      s    zRetrying.stop_after_delayc             C   s   dS )z#Don't sleep at all before retrying.r   r	   )r;   rL   rM   r	   r	   r
   no_sleep   s    zRetrying.no_sleepc             C   s   | j S )z0Sleep a fixed amount of time between each retry.)r#   )r;   rL   rM   r	   r	   r
   r1      s    zRetrying.fixed_sleepc             C   s   t | j| jS )zISleep a random amount of time between wait_random_min and wait_random_max)randomrandintr$   r%   )r;   rL   rM   r	   r	   r
   r2      s    zRetrying.random_sleepc             C   s$   | j | j|d   }|dk r d}|S )z
        Sleep an incremental amount of time after each attempt, starting at
        wait_incrementing_start and incrementing by wait_incrementing_increment
        r   r   )r&   r'   )r;   rL   rM   resultr	   r	   r
   r3      s    zRetrying.incrementing_sleepc             C   s2   d| }| j | }|| jkr"| j}|dk r.d}|S )N   r   )r(   r*   )r;   rL   rM   exprQ   r	   r	   r
   r4      s    

zRetrying.exponential_sleepc             C   s   dS )NFr	   )r;   rQ   r	   r	   r
   r8      s    zRetrying.never_rejectc             C   s   dS )NTr	   )r;   rQ   r	   r	   r
   r6      s    zRetrying.always_rejectc             C   s4   d}|j r || |jd O }n|| |jO }|S )NFr   )has_exceptionr7   valuer9   )r;   attemptrejectr	   r	   r
   should_reject   s
    zRetrying.should_rejectc             O   s   t tt d }d}xyt||||d}W n    t }t||d}Y nX | |sh|| jS t tt d | }| 	||r| js|j
r| qt|n<| ||}	| jrt | j }
|	td|
 }	t|	d  |d7 }qW d S )Ni  r   FTr   g     @@)introundtimeAttemptsysexc_inforX   getr:   r/   rT   
RetryErrorr5   r+   rO   r   sleep)r;   fnr   r   
start_timeattempt_numberrV   tbrM   ra   jitterr	   r	   r
   r      s*    


zRetrying.call)NNNNNNNNNNNNNFNNN)__name__
__module____qualname__rK   r-   r.   rN   r1   r2   r3   r4   r8   r6   rX   r   r	   r	   r	   r
   r   8   s0               
F
		r   c               @   s*   e Zd ZdZdd Zd
ddZdd Zd	S )r\   z
    An Attempt encapsulates a call to a target function that may end as a
    normal return value from the function or an Exception depending on what
    occurred during the execution.
    c             C   s   || _ || _|| _d S )N)rU   rd   rT   )r;   rU   rd   rT   r	   r	   r
   rK      s    zAttempt.__init__Fc             C   s@   | j r6|rt| q<t| jd | jd | jd  n| jS dS )z
        Return the return value of this Attempt instance or raise an Exception.
        If wrap_exception is true, this Attempt is wrapped inside of a
        RetryError before being raised.
        r   r   rR   N)rT   r`   r   reraiserU   )r;   rG   r	   r	   r
   r_      s
    
"zAttempt.getc          	   C   s:   | j r&d| jdt| jd S d| j| jS d S )NzAttempts: {0}, Error:
{1} rR   zAttempts: {0}, Value: {1})rT   formatrd   join	traceback	format_tbrU   )r;   r	   r	   r
   __repr__   s     zAttempt.__repr__N)F)rg   rh   ri   __doc__rK   r_   rp   r	   r	   r	   r
   r\      s   
r\   c               @   s    e Zd ZdZdd Zdd ZdS )r`   zU
    A RetryError encapsulates the last Attempt instance right before giving up.
    c             C   s
   || _ d S )N)last_attempt)r;   rr   r	   r	   r
   rK     s    zRetryError.__init__c             C   s   d | jS )NzRetryError[{0}])rl   rr   )r;   r	   r	   r
   __str__
  s    zRetryError.__str__N)rg   rh   ri   rq   rK   rs   r	   r	   r	   r
   r`     s   r`   )rO   pip._vendorr   r]   r[   rn   r)   r   objectr   r\   	Exceptionr`   r	   r	   r	   r
   <module>   s    *!