a
    &ñ»j=  ã                   @   sz   d dl Z d dlZd dlZdZe  e¡Zdd„ Zdd„ ZG dd„ de	ƒZ
G d	d
„ d
eƒZG dd„ de	ƒZG dd„ de	ƒZdS )é    Né   c                 C   s2   t | tƒr| S t | tƒr"t | ¡S tt| ƒƒS dS )zcCanonicalizes a potential path.

    Returns a binary string encoded into filesystem encoding.
    N)Ú
isinstanceÚbytesÚstrÚosÚfsencodeÚcanonicalize_path)Úpath© r
   ú6E:\soccer\ml_env\Lib\site-packages\fasteners/_utils.pyr      s
    


r   c                  G   s   | D ]}|dur|  S qdS )zEReturns first of values that is *not* None (or None if all are/were).Nr
   )ÚvaluesÚvalr
   r
   r   Úpick_first_not_none*   s    
r   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )Ú	LockStackzãSimple lock stack to get and release many locks.

    An instance of this should **not** be used by many threads at the
    same time, as the stack that is maintained will be corrupted and
    invalid if that is attempted.
    Nc                 C   s   g | _ t|tƒ| _d S ©N)Ú_stackr   ÚLOGÚ_logger)ÚselfÚloggerr
   r
   r   Ú__init__:   s    zLockStack.__init__c                 C   s   |  ¡ }|r| j |¡ |S r   )Úacquirer   Úappend)r   ÚlockZgottenr
   r
   r   Úacquire_lock>   s    zLockStack.acquire_lockc                 C   s   | S r   r
   ©r   r
   r
   r   Ú	__enter__D   s    zLockStack.__enter__c                 C   s\   t | jƒ}|}| jrX| j ¡ }z| ¡  W n" tyL   | j d||¡ Y n0 |d8 }qd S )Nz6Failed releasing lock %s from lock stack with %s locksé   )Úlenr   ÚpopÚreleaseÚ	Exceptionr   Ú	exception)r   Úexc_typeÚ	exc_valueÚexc_tbZam_leftZtot_amr   r
   r
   r   Ú__exit__G   s    

ÿ
zLockStack.__exit__)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r&   r
   r
   r
   r   r   2   s
   
r   c                   @   s   e Zd ZdZdS )Ú
RetryAgainz1Exception to signal to retry helper to try again.N)r'   r(   r)   r*   r
   r
   r
   r   r+   T   s   r+   c                   @   s(   e Zd ZdZejdfdd„Zdd„ ZdS )ÚRetryzA little retry helper object.Nc                 C   s"   || _ d| _|| _|| _|| _d S )Nr   )ÚdelayÚattemptsÚ	max_delayÚ
sleep_funcÚwatch)r   r-   r/   r0   r1   r
   r
   r   r   [   s
    zRetry.__init__c                 O   s–   |  j d7  _ z||i |¤ŽW S  tyŽ   | j | j }|| jk rH|}n| j}td|ƒ}| jd ur€| j ¡ }|d ur€||k r€|}|  |¡ Y q 0 q d S )Nr   ç        )r.   r+   r-   r/   Úmaxr1   Úleftoverr0   )r   ÚfnÚargsÚkwargsZmaybe_delayZactual_delayr4   r
   r
   r   Ú__call__c   s    



zRetry.__call__)r'   r(   r)   r*   ÚtimeÚsleepr   r8   r
   r
   r
   r   r,   X   s   ÿ
r,   c                   @   sJ   e Zd 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S )Ú	StopWatchzA really basic stop watch.Nc                 C   s   || _ d | _d | _d S r   )ÚdurationÚ
started_atÚ
stopped_at)r   r<   r
   r
   r   r   y   s    zStopWatch.__init__c                 C   s"   | j d u rd S td| j |  ¡  ƒS ©Nr2   )r<   r3   Úelapsedr   r
   r
   r   r4   ~   s    
zStopWatch.leftoverc                 C   s*   | j d ur| j }nt ¡ }td|| j ƒS r?   )r>   r9   Ú	monotonicr3   r=   )r   Zend_timer
   r
   r   r@   ƒ   s    
zStopWatch.elapsedc                 C   s   |   ¡  | S r   )Ústartr   r
   r
   r   r   Š   s    zStopWatch.__enter__c                 C   s   t  ¡ | _d S r   )r9   rA   r>   )r   r#   r$   r%   r
   r
   r   r&   Ž   s    zStopWatch.__exit__c                 C   s   t  ¡ | _d | _d S r   )r9   rA   r=   r>   r   r
   r
   r   rB   ‘   s    
zStopWatch.startc                 C   s    | j d u rdS |  ¡ | j kS d S )NF)r<   r@   r   r
   r
   r   Úexpired•   s    
zStopWatch.expired)N)r'   r(   r)   r*   r   r4   r@   r   r&   rB   rC   r
   r
   r
   r   r;   v   s   
r;   )Úloggingr   r9   ZBLATHERÚ	getLoggerr'   r   r   r   Úobjectr   r!   r+   r,   r;   r
   r
   r
   r   Ú<module>   s   
"