a
    %gh/                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ dZdd Zdd Z	da
dadd	d
ZG dd deZG dd deZG dd deZdS )    Nwrapsi?c                    s    fdd}|S )Nc                    s
   t |  S N)
isinstance)	exceptionretryable_types X/mounts/lovelace/software/anaconda3/envs/metaDMG/lib/python3.9/site-packages/retrying.py_retry_if_exception_these_types   s    zD_retry_if_exception_of_type.<locals>._retry_if_exception_these_typesr	   )r   r   r	   r   r
   _retry_if_exception_of_type   s    r   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 g| R i |S r   Retryingcallargskwfr	   r
   	wrapped_f*   s    z-retry.<locals>.wrap_simple.<locals>.wrapped_fr   r   r   r	   r   r
   wrap_simple)   s    zretry.<locals>.wrap_simplec                    s   t   fdd}|S )Nc                     s"   t  i jg| R i |S r   r   r   )dargsdkwr   r	   r
   r   5   s    z&retry.<locals>.wrap.<locals>.wrapped_fr   r   r   r   r   r
   wrap4   s    zretry.<locals>.wrapN)lencallable)r   r   r   r   r	   r   r
   retry    s
    r   Fc                 C   sJ   | dv rBt d u rtta | d u r>ts>dat t  dt _t S | S d S )N)TNTF)_default_loggerlogging	getLogger__name___configured_null_logger
addHandlerNullHandler	propagate)loggerr	   r	   r
   _pick_logger@   s    
r)   c                   @   sz   e Zd ZdddZdd Zdd Zed	d
 Zdd Zdd Z	dd Z
dd Zedd Zedd Zdd Zdd ZdS )r   NFc                    sP  |d u rdn|| _ |d u rdn|| _|d u r0dn|| _|d u rBdn|| _|d u rTdn|| _|d u rfdn|| _|	d u rxdn|	| _|d u rdn|| _|d u rtn|| _	|
d u rtn|
| _
|d u rdn|| _|| _|| _t|| _g  |d ur | j |d ur
 | j |d ur|| _n&|d u r6 fdd| _nt| || _dd g|d urb| j |d usv|d ur| j |d us|	d ur| j |d us|d ur| j |d ur|| _n&|d u rfd	d| _nt| || _|d u r| j| _nt|ttfr&t|}|| _|d u r@| j | _!n|| _!|| _"d S )
N   d     r   r   c                    s   t  fddD S )Nc                 3   s   | ]}| V  qd S r   r	   .0r   Zattemptsdelayr	   r
   	<genexpr>   s   6Retrying.__init__.<locals>.<lambda>.<locals>.<genexpr>)anyr/   )
stop_funcsr/   r
   <lambda>   s   z#Retrying.__init__.<locals>.<lambda>c                  _   s   dS )Nr   r	   )r   kwargsr	   r	   r
   r5          c                    s   t  fddD S )Nc                 3   s   | ]}| V  qd S r   r	   r-   r/   r	   r
   r1      s   r2   )maxr/   )
wait_funcsr/   r
   r5      s   )#_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_incrementing_max_wait_jitter_max_before_attempts_after_attemptsr)   _loggerappendstop_after_attemptstop_after_delaystopgetattrfixed_sleeprandom_sleepincrementing_sleepexponential_sleepwaitalways_reject_retry_on_exceptionr   tuple	Exceptionr   never_reject_retry_on_result_wrap_exception)selfrL   rR   Zstop_max_attempt_numberZstop_max_delayZ
wait_fixedZwait_random_minZwait_random_maxZwait_incrementing_startZwait_incrementing_incrementZwait_incrementing_maxZwait_exponential_multiplierZwait_exponential_maxZretry_on_exceptionZretry_on_resultwrap_exceptionZ	stop_funcZ	wait_funcZwait_jitter_maxZbefore_attemptsZafter_attemptsr(   r	   )r4   r9   r
   __init__S   sp    











zRetrying.__init__c                 C   s
   || j kS )z;Stop after the previous attempt >= stop_max_attempt_number.)r:   rZ   previous_attempt_numberdelay_since_first_attempt_msr	   r	   r
   rJ      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]   r	   r	   r
   rK      s    zRetrying.stop_after_delayc                 C   s   dS )z#Don't sleep at all before retrying.r   r	   )r^   r_   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]   r	   r	   r
   rN      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]   r	   r	   r
   rO      s    zRetrying.random_sleepc                 C   s4   | j | j|d   }|| jkr$| j}|dk r0d}|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@   rD   )rZ   r^   r_   resultr	   r	   r
   rP      s    
zRetrying.incrementing_sleepc                 C   s2   d| }| j | }|| jkr"| j}|dk r.d}|S )N   r   )rA   rC   )rZ   r^   r_   exprc   r	   r	   r
   rQ      s    

zRetrying.exponential_sleepc                 C   s   dS )NFr	   rc   r	   r	   r
   rW      s    zRetrying.never_rejectc                 C   s   dS )NTr	   rf   r	   r	   r
   rS      s    zRetrying.always_rejectc                 C   s4   d}|j r || |jd O }n|| |jO }|S )NFr   )has_exceptionrT   valuerX   )rZ   attemptZrejectr	   r	   r
   should_reject   s
    zRetrying.should_rejectc                 O   sF  t tt d }d}| jr(| | zt||i ||d}W n& tyh   t }t||d}Y n0 | |s|	| j
S | j| | jr| | t tt d | }| ||r| j
s|jr|	 nt|nX| ||}	| jrt | j }
|	td|
 }	| jd|	d dd	 t|	d  |d7 }qd S )
Nr,   r   FTr   zRetrying in g     @@z.2fz	 seconds.)introundtimerF   AttemptrV   sysexc_inforj   getrY   rH   warningrG   rL   rg   
RetryErrorrR   rE   ra   r8   infosleep)rZ   fnr   r6   
start_timeattempt_numberri   tbr_   ru   Zjitterr	   r	   r
   r   	  s4    




zRetrying.call)NNNNNNNNNNNNNNFNNNNNN)r#   
__module____qualname__r\   rJ   rK   staticmethodr`   rN   rO   rP   rQ   rW   rS   rj   r   r	   r	   r	   r
   r   R   sH                        
y
	

	r   c                   @   s*   e Zd ZdZdd Zd
ddZdd Zd	S )rn   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 r   )rh   rx   rg   )rZ   rh   rx   rg   r	   r	   r
   r\   6  s    zAttempt.__init__Fc                 C   s6   | j r,|rt| q2| j\}}}||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.
        N)rg   rs   rh   with_traceback)rZ   r[   exc_typeexcry   r	   r	   r
   rq   ;  s    
zAttempt.getc              	   C   sB   | j r*d| j ddt| jd  S d| j d| j S d S )Nz
Attempts: z	, Error:
 rd   z	, Value: )rg   rx   join	traceback	format_tbrh   rZ   r	   r	   r
   __repr__J  s    $zAttempt.__repr__N)F)r#   rz   r{   __doc__r\   rq   r   r	   r	   r	   r
   rn   /  s   
rn   c                   @   s    e Zd ZdZdd Zdd ZdS )rs   zU
    A RetryError encapsulates the last Attempt instance right before giving up.
    c                 C   s
   || _ d S r   last_attempt)rZ   r   r	   r	   r
   r\   V  s    zRetryError.__init__c                 C   s   d| j  dS )NzRetryError[]r   r   r	   r	   r
   __str__Y  s    zRetryError.__str__N)r#   rz   r{   r   r\   r   r	   r	   r	   r
   rs   Q  s   rs   )N)r!   ra   ro   rm   r   	functoolsr   rB   r   r   r    r$   r)   objectr   rn   rV   rs   r	   r	   r	   r
   <module>   s   
 ^"