o V‡EV ã@svddlZddlZddlmZdZe e¡Zdd„ZGdd„de ƒZ Gdd „d e ƒZ Gd d „d e ƒZ Gd d „d e ƒZdS)éN)Ú monotonicécGs|D] }|dur |SqdS)zEReturns first of values that is *not* None (or None if all are/were).N©)ÚvaluesÚvalrrú2/usr/lib/python3/dist-packages/fasteners/_utils.pyÚpick_first_not_nones ÿrc@s2eZdZdZd dd„Zdd„Zdd„Zd d „ZdS) Ú 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. NcCsg|_t|tƒ|_dS©N)Ú_stackrÚLOGÚ_logger)ÚselfÚloggerrrrÚ__init__.szLockStack.__init__cCs| ¡}|r |j |¡|Sr )Úacquirer Úappend)rÚlockÚgottenrrrÚ acquire_lock2s zLockStack.acquire_lockcCs|Sr r©rrrrÚ __enter__8szLockStack.__enter__cCsdt|jƒ}|}|jr0|j ¡}z| ¡Wnty&|j d||¡Ynw|d8}|js dSdS)Nz6Failed releasing lock %s from lock stack with %s locksé)Úlenr ÚpopÚreleaseÚ Exceptionr Ú exception)rÚexc_typeÚ exc_valueÚexc_tbÚam_leftÚtot_amrrrrÚ__exit__;s    ÿÿùzLockStack.__exit__r )Ú__name__Ú __module__Ú __qualname__Ú__doc__rrrr#rrrrr &s   r c@seZdZdZdS)Ú RetryAgainz1Exception to signal to retry helper to try again.N)r$r%r&r'rrrrr(Hsr(c@s(eZdZdZejdfdd„Zdd„ZdS)ÚRetryzA little retry helper object.NcCs"||_d|_||_||_||_dS)Nr)ÚdelayÚattemptsÚ max_delayÚ sleep_funcÚwatch)rr*r,r-r.rrrrOs  zRetry.__init__cOs” |jd7_z||i|¤ŽWStyH|j|j}||jkr%|}n|j}td|ƒ}|jdurA|j ¡}|durA||krA|}| |¡Ynwq)NTrç)r+r(r*r,Úmaxr.Úleftoverr-)rÚfnÚargsÚkwargsÚ maybe_delayÚ actual_delayr1rrrÚ__call__Ws"      õüzRetry.__call__)r$r%r&r'ÚtimeÚsleeprr7rrrrr)Ls  ÿ r)c@sJeZdZdZddd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dS)Ú StopWatchzA really basic stop watch.NcCs||_d|_d|_dSr )ÚdurationÚ started_atÚ stopped_at)rr;rrrrms zStopWatch.__init__cCs"|jdurdStd|j| ¡ƒS©Nr/)r;r0Úelapsedrrrrr1rs zStopWatch.leftovercCs(|jdur |j}ntƒ}td||jƒSr>)r=Únowr0r<)rÚend_timerrrr?ws zStopWatch.elapsedcCs | ¡|Sr )Ústartrrrrr~szStopWatch.__enter__cCs tƒ|_dSr )r@r=)rrrr rrrr#‚s zStopWatch.__exit__cCstƒ|_d|_dSr )r@r<r=rrrrrB…s zStopWatch.startcCs|jdurdS| ¡|jkS)NF)r;r?rrrrÚexpired‰s zStopWatch.expiredr ) r$r%r&r'rr1r?rr#rBrCrrrrr:js  r:)Úloggingr8rr@ÚBLATHERÚ getLoggerr$r rÚobjectr rr(r)r:rrrrÚs  "