B C_.+@sdZddlZddlmZddlmZddlZddlmZddZ dd Z d d Z e Z d d ZddZd*ddZddZddZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)ZdS)+z/Utilities for providing backward compatibility.N)Fraction)warn)_utilscCs(d|t|f}t|t|dddS)NzJ"%s" function must accept single "retry_state" parameter, please update %s) stacklevel)rget_callback_namerDeprecationWarning)Zcbnamefuncrmsgr i/private/var/folders/fw/jsxvvqfs4sz4tdnfdvg5typ5vk77qg/T/pip-install-pio4sg6z/tenacity/tenacity/compat.py&warn_about_non_retry_state_deprecation sr cCs$dt|}t|t|dddS)Nz>"%s" method must be called with single "retry_state" parameterr)r)rrrr)fnrr r r r -warn_about_dunder_non_retry_state_deprecations rcCsDt|st|dSt|s0t|s0|j}t|}d|j kS)NF retry_state) sixcallable Exceptioninspect isfunctionismethod__call__r getargspecargs)r Z func_specr r r func_takes_retry_states  rcKsRg}x(t|D]\}}|tkr||qWddd|D}t|d|S)Nz, css|]}t|VqdS)N)repr).0sr r r -sz(_make_unset_exception..z func missing parameters: )r iteritems_unsetappendjoin TypeError) func_namekwargsmissingkvZ missing_strr r r _make_unset_exception(s r)cCs.t|j|_|jt||_|j|ks*tdS)N)r start_timeZoutcome_timestampseconds_since_startAssertionError)rdelayr r r _set_delay_since_start1s r.cCsj|tkp|tk}|r"td||dddlm}|dddi}||_|dk rR||_n |dt|||S)zConstruct RetryCallState for given attempt number & delay. Only used in testing and thus is extra careful about timestamp arithmetics. z wait/stop)previous_attempt_numberdelay_since_first_attemptr)RetryCallStateNr )r r)tenacityr1attempt_numberoutcomeZ set_resultr.)r/r0 last_resultZrequired_parameter_unsetr1rr r r make_retry_state9s   r6cCs<t|sdSt|s(t|s(|j}t|}d|jkS)zCheck if function has a "last_result" parameter. Needed to provide backward compatibility for wait functions that didn't take "last_result" in the beginning. Fr5) rrrrrrrrr)waiterZ waiter_specr r r func_takes_last_resultRs   r8cs"tttdffdd }|S)z.new_fn)rwrapsr )rr=r )rr "stop_dunder_call_accept_old_paramsas r?cs4tsStrStfdd}|S)z7Wrap "stop" function to accept "retry_state" parameter.cstddd|j|jS)Nstop)r)r r3r+)r) stop_funcr r wrapped_stop_funcs  z7stop_func_accept_retry_state..wrapped_stop_func)rrrrr>)rBrCr )rBr stop_func_accept_retry_statexs  rDcs$tttddffdd }|S)z.new_fn)rr>r )rr=r )rr "wait_dunder_call_accept_old_paramss rEcsTtsStrStr:tfdd}ntfdd}|S)z5Wrap wait function to accept "retry_state" parameter.cs"tddd|j|j|jdS)NwaitrA)r)r5)r r3r+r4)r) wait_funcr r wrapped_wait_funcs  z7wait_func_accept_retry_state..wrapped_wait_funccstddd|j|jS)NrFrA)r)r r3r+)r)rGr r rHs  )rrrr8rr>)rGrHr )rGr wait_func_accept_retry_states  rIcs ttdffdd }|S)z=Decorate cls.__call__ method to accept old "retry" signature.Ncsp|dkrdddlm}|tkr(td|d|tk o8t||}|rD|}n tdd|dddi}||_||dS) Nr)r1retry)attemptr9)rr )r)r2r1r r)r:rr4)r;rKrr1r<)rr r r=s    z3retry_dunder_call_accept_old_params..new_fn)rr>r )rr=r )rr #retry_dunder_call_accept_old_paramssrLcs4tsStrStfdd}|S)z8Wrap "retry" function to accept "retry_state" parameter.cstddd|jS)NrJrA)r)r r4)r) retry_funcr r wrapped_retry_funcs z9retry_func_accept_retry_state..wrapped_retry_func)rrrrr>)rMrNr )rMr retry_func_accept_retry_states  rOcs4tsStrStfdd}|S)z/Wrap "before" function to accept "retry_state".cstddd|j|jS)NbeforerA)r)r rr3)r)rr r wrapped_before_funcsz;before_func_accept_retry_state..wrapped_before_func)rrrrr>)rrQr )rr before_func_accept_retry_states  rRcs4tsStrStfdd}|S)z.Wrap "after" function to accept "retry_state".cs tddd|j|j|jS)NafterrA)r)r rr3r+)r)rr r wrapped_after_sleep_funcs z?after_func_accept_retry_state..wrapped_after_sleep_func)rrrrr>)rrTr )rr after_func_accept_retry_states  rUcs4tsStrStfdd}|S)z5Wrap "before_sleep" function to accept "retry_state".cs(tddd|jt|jd|jdS)NZ before_sleeprA)rsleep)rVr5)r Z retry_objectgetattrZ next_actionr4)r)rr r wrapped_before_sleep_funcs   zGbefore_sleep_func_accept_retry_state..wrapped_before_sleep_func)rrrrr>)rrXr )rr $before_sleep_func_accept_retry_state s   rYcs4tsStrStfdd}|S)Ncstddd|jS)NZretry_error_callbackrA)r)r r4)r)rr r wrapped_retry_error_callback(s zMretry_error_callback_accept_retry_state..wrapped_retry_error_callback)rrrrr>)rrZr )rr 'retry_error_callback_accept_retry_state!s  r[cCs8tjr|S|\}}|dkr&dSt|||fSdS)a Get an exc_info value from a Future. Given a a Future instance, retrieve an exc_info value suitable for passing in as the exc_info parameter to logging.Logger.log() and related methods. On Python 2, this will be a (type, value, traceback) triple. On Python 3, this will be an exception instance (with embedded traceback). If there was no exception, None is returned on both versions of Python. N)rPY3 exceptionZexception_infotype)futureextbr r r get_exc_info_from_future0s  rb)N)__doc__rZ fractionsrwarningsrrr2rr rrobjectr r)r.r6r8r?rDrErIrLrOrRrUrYr[rbr r r r s0