Skip to content

Commit 30171ce

Browse files
committed
Upgrade tenacity to 7.0.0
1 parent 16d4d87 commit 30171ce

File tree

13 files changed

+177
-480
lines changed

13 files changed

+177
-480
lines changed

news/tenacity.vendor.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Switch from retrying to tenacity
1+
Upgrade tenacity to 7.0.0

src/pip/_vendor/tenacity/__init__.py

Lines changed: 92 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@
3838
from pip._vendor import six
3939

4040
from pip._vendor.tenacity import _utils
41-
from pip._vendor.tenacity import compat as _compat
4241

4342
# Import all built-in retry strategies for easier usage.
43+
from .retry import retry_base # noqa
4444
from .retry import retry_all # noqa
4545
from .retry import retry_always # noqa
4646
from .retry import retry_any # noqa
@@ -116,11 +116,23 @@ def retry(*dargs, **dkw): # noqa
116116
if len(dargs) == 1 and callable(dargs[0]):
117117
return retry()(dargs[0])
118118
else:
119+
119120
def wrap(f):
121+
if isinstance(f, retry_base):
122+
warnings.warn(
123+
(
124+
"Got retry_base instance ({cls}) as callable argument, "
125+
+ "this will probably hang indefinitely (did you mean "
126+
+ "retry={cls}(...)?)"
127+
).format(cls=f.__class__.__name__)
128+
)
120129
if iscoroutinefunction is not None and iscoroutinefunction(f):
121130
r = AsyncRetrying(*dargs, **dkw)
122-
elif tornado and hasattr(tornado.gen, 'is_coroutine_function') \
123-
and tornado.gen.is_coroutine_function(f):
131+
elif (
132+
tornado
133+
and hasattr(tornado.gen, "is_coroutine_function")
134+
and tornado.gen.is_coroutine_function(f)
135+
):
124136
r = TornadoRetrying(*dargs, **dkw)
125137
else:
126138
r = Retrying(*dargs, **dkw)
@@ -158,17 +170,18 @@ class BaseAction(object):
158170
NAME = None
159171

160172
def __repr__(self):
161-
state_str = ', '.join('%s=%r' % (field, getattr(self, field))
162-
for field in self.REPR_FIELDS)
163-
return '%s(%s)' % (type(self).__name__, state_str)
173+
state_str = ", ".join(
174+
"%s=%r" % (field, getattr(self, field)) for field in self.REPR_FIELDS
175+
)
176+
return "%s(%s)" % (type(self).__name__, state_str)
164177

165178
def __str__(self):
166179
return repr(self)
167180

168181

169182
class RetryAction(BaseAction):
170-
REPR_FIELDS = ('sleep',)
171-
NAME = 'retry'
183+
REPR_FIELDS = ("sleep",)
184+
NAME = "retry"
172185

173186
def __init__(self, sleep):
174187
self.sleep = float(sleep)
@@ -177,6 +190,10 @@ def __init__(self, sleep):
177190
_unset = object()
178191

179192

193+
def _first_set(first, second):
194+
return second if first is _unset else first
195+
196+
180197
class RetryError(Exception):
181198
"""Encapsulates the last attempt instance right before giving up."""
182199

@@ -214,86 +231,74 @@ def __exit__(self, exc_type, exc_value, traceback):
214231
class BaseRetrying(object):
215232
__metaclass__ = ABCMeta
216233

217-
def __init__(self,
218-
sleep=sleep,
219-
stop=stop_never, wait=wait_none(),
220-
retry=retry_if_exception_type(),
221-
before=before_nothing,
222-
after=after_nothing,
223-
before_sleep=None,
224-
reraise=False,
225-
retry_error_cls=RetryError,
226-
retry_error_callback=None):
234+
def __init__(
235+
self,
236+
sleep=sleep,
237+
stop=stop_never,
238+
wait=wait_none(),
239+
retry=retry_if_exception_type(),
240+
before=before_nothing,
241+
after=after_nothing,
242+
before_sleep=None,
243+
reraise=False,
244+
retry_error_cls=RetryError,
245+
retry_error_callback=None,
246+
):
227247
self.sleep = sleep
228-
self._stop = stop
229-
self._wait = wait
230-
self._retry = retry
231-
self._before = before
232-
self._after = after
233-
self._before_sleep = before_sleep
248+
self.stop = stop
249+
self.wait = wait
250+
self.retry = retry
251+
self.before = before
252+
self.after = after
253+
self.before_sleep = before_sleep
234254
self.reraise = reraise
235255
self._local = threading.local()
236256
self.retry_error_cls = retry_error_cls
237-
self._retry_error_callback = retry_error_callback
257+
self.retry_error_callback = retry_error_callback
238258

239259
# This attribute was moved to RetryCallState and is deprecated on
240260
# Retrying objects but kept for backward compatibility.
241261
self.fn = None
242262

243-
@_utils.cached_property
244-
def stop(self):
245-
return _compat.stop_func_accept_retry_state(self._stop)
246-
247-
@_utils.cached_property
248-
def wait(self):
249-
return _compat.wait_func_accept_retry_state(self._wait)
250-
251-
@_utils.cached_property
252-
def retry(self):
253-
return _compat.retry_func_accept_retry_state(self._retry)
254-
255-
@_utils.cached_property
256-
def before(self):
257-
return _compat.before_func_accept_retry_state(self._before)
258-
259-
@_utils.cached_property
260-
def after(self):
261-
return _compat.after_func_accept_retry_state(self._after)
262-
263-
@_utils.cached_property
264-
def before_sleep(self):
265-
return _compat.before_sleep_func_accept_retry_state(self._before_sleep)
266-
267-
@_utils.cached_property
268-
def retry_error_callback(self):
269-
return _compat.retry_error_callback_accept_retry_state(
270-
self._retry_error_callback)
271-
272-
def copy(self, sleep=_unset, stop=_unset, wait=_unset,
273-
retry=_unset, before=_unset, after=_unset, before_sleep=_unset,
274-
reraise=_unset):
263+
def copy(
264+
self,
265+
sleep=_unset,
266+
stop=_unset,
267+
wait=_unset,
268+
retry=_unset,
269+
before=_unset,
270+
after=_unset,
271+
before_sleep=_unset,
272+
reraise=_unset,
273+
retry_error_cls=_unset,
274+
retry_error_callback=_unset,
275+
):
275276
"""Copy this object with some parameters changed if needed."""
276-
if before_sleep is _unset:
277-
before_sleep = self.before_sleep
278277
return self.__class__(
279-
sleep=self.sleep if sleep is _unset else sleep,
280-
stop=self.stop if stop is _unset else stop,
281-
wait=self.wait if wait is _unset else wait,
282-
retry=self.retry if retry is _unset else retry,
283-
before=self.before if before is _unset else before,
284-
after=self.after if after is _unset else after,
285-
before_sleep=before_sleep,
286-
reraise=self.reraise if after is _unset else reraise,
278+
sleep=_first_set(sleep, self.sleep),
279+
stop=_first_set(stop, self.stop),
280+
wait=_first_set(wait, self.wait),
281+
retry=_first_set(retry, self.retry),
282+
before=_first_set(before, self.before),
283+
after=_first_set(after, self.after),
284+
before_sleep=_first_set(before_sleep, self.before_sleep),
285+
reraise=_first_set(reraise, self.reraise),
286+
retry_error_cls=_first_set(retry_error_cls, self.retry_error_cls),
287+
retry_error_callback=_first_set(
288+
retry_error_callback, self.retry_error_callback
289+
),
287290
)
288291

289292
def __repr__(self):
290293
attrs = dict(
291-
_utils.visible_attrs(self, attrs={'me': id(self)}),
294+
_utils.visible_attrs(self, attrs={"me": id(self)}),
292295
__class__=self.__class__.__name__,
293296
)
294-
return ("<%(__class__)s object at 0x%(me)x (stop=%(stop)s, "
295-
"wait=%(wait)s, sleep=%(sleep)s, retry=%(retry)s, "
296-
"before=%(before)s, after=%(after)s)>") % (attrs)
297+
return (
298+
"<%(__class__)s object at 0x%(me)x (stop=%(stop)s, "
299+
"wait=%(wait)s, sleep=%(sleep)s, retry=%(retry)s, "
300+
"before=%(before)s, after=%(after)s)>"
301+
) % (attrs)
297302

298303
@property
299304
def statistics(self):
@@ -328,6 +333,7 @@ def wraps(self, f):
328333
329334
:param f: A function to wraps for retrying.
330335
"""
336+
331337
@_utils.wraps(f)
332338
def wrapped_f(*args, **kw):
333339
return self(f, *args, **kw)
@@ -342,9 +348,9 @@ def retry_with(*args, **kwargs):
342348

343349
def begin(self, fn):
344350
self.statistics.clear()
345-
self.statistics['start_time'] = _utils.now()
346-
self.statistics['attempt_number'] = 1
347-
self.statistics['idle_for'] = 0
351+
self.statistics["start_time"] = _utils.now()
352+
self.statistics["attempt_number"] = 1
353+
self.statistics["idle_for"] = 0
348354
self.fn = fn
349355

350356
def iter(self, retry_state): # noqa
@@ -354,16 +360,16 @@ def iter(self, retry_state): # noqa
354360
self.before(retry_state)
355361
return DoAttempt()
356362

357-
is_explicit_retry = retry_state.outcome.failed \
358-
and isinstance(retry_state.outcome.exception(), TryAgain)
363+
is_explicit_retry = retry_state.outcome.failed and isinstance(
364+
retry_state.outcome.exception(), TryAgain
365+
)
359366
if not (is_explicit_retry or self.retry(retry_state=retry_state)):
360367
return fut.result()
361368

362369
if self.after is not None:
363370
self.after(retry_state=retry_state)
364371

365-
self.statistics['delay_since_first_attempt'] = \
366-
retry_state.seconds_since_start
372+
self.statistics["delay_since_first_attempt"] = retry_state.seconds_since_start
367373
if self.stop(retry_state=retry_state):
368374
if self.retry_error_callback:
369375
return self.retry_error_callback(retry_state=retry_state)
@@ -378,8 +384,8 @@ def iter(self, retry_state): # noqa
378384
sleep = 0.0
379385
retry_state.next_action = RetryAction(sleep)
380386
retry_state.idle_for += sleep
381-
self.statistics['idle_for'] += sleep
382-
self.statistics['attempt_number'] += 1
387+
self.statistics["idle_for"] += sleep
388+
self.statistics["attempt_number"] += 1
383389

384390
if self.before_sleep is not None:
385391
self.before_sleep(retry_state=retry_state)
@@ -406,8 +412,10 @@ def __call__(self, *args, **kwargs):
406412

407413
def call(self, *args, **kwargs):
408414
"""Use ``__call__`` instead because this method is deprecated."""
409-
warnings.warn("'call()' method is deprecated. " +
410-
"Use '__call__()' instead", DeprecationWarning)
415+
warnings.warn(
416+
"'call()' method is deprecated. " + "Use '__call__()' instead",
417+
DeprecationWarning,
418+
)
411419
return self.__call__(*args, **kwargs)
412420

413421

@@ -417,14 +425,13 @@ class Retrying(BaseRetrying):
417425
def __call__(self, fn, *args, **kwargs):
418426
self.begin(fn)
419427

420-
retry_state = RetryCallState(
421-
retry_object=self, fn=fn, args=args, kwargs=kwargs)
428+
retry_state = RetryCallState(retry_object=self, fn=fn, args=args, kwargs=kwargs)
422429
while True:
423430
do = self.iter(retry_state=retry_state)
424431
if isinstance(do, DoAttempt):
425432
try:
426433
result = fn(*args, **kwargs)
427-
except BaseException:
434+
except BaseException: # noqa: B902
428435
retry_state.set_exception(sys.exc_info())
429436
else:
430437
retry_state.set_result(result)

src/pip/_vendor/tenacity/_asyncio.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,24 +26,20 @@
2626

2727

2828
class AsyncRetrying(BaseRetrying):
29-
30-
def __init__(self,
31-
sleep=sleep,
32-
**kwargs):
29+
def __init__(self, sleep=sleep, **kwargs):
3330
super(AsyncRetrying, self).__init__(**kwargs)
3431
self.sleep = sleep
3532

3633
async def __call__(self, fn, *args, **kwargs):
3734
self.begin(fn)
3835

39-
retry_state = RetryCallState(
40-
retry_object=self, fn=fn, args=args, kwargs=kwargs)
36+
retry_state = RetryCallState(retry_object=self, fn=fn, args=args, kwargs=kwargs)
4137
while True:
4238
do = self.iter(retry_state=retry_state)
4339
if isinstance(do, DoAttempt):
4440
try:
4541
result = await fn(*args, **kwargs)
46-
except BaseException:
42+
except BaseException: # noqa: B902
4743
retry_state.set_exception(sys.exc_info())
4844
else:
4945
retry_state.set_result(result)

src/pip/_vendor/tenacity/_utils.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,15 @@ def wraps(fn):
4040
4141
Also, see https://github.com/benjaminp/six/issues/250.
4242
"""
43+
4344
def filter_hasattr(obj, attrs):
4445
return tuple(a for a in attrs if hasattr(obj, a))
46+
4547
return six.wraps(
4648
fn,
4749
assigned=filter_hasattr(fn, WRAPPER_ASSIGNMENTS),
48-
updated=filter_hasattr(fn, WRAPPER_UPDATES))
50+
updated=filter_hasattr(fn, WRAPPER_UPDATES),
51+
)
4952

5053
def capture(fut, tb):
5154
# TODO(harlowja): delete this in future, since its
@@ -55,6 +58,8 @@ def capture(fut, tb):
5558
def getargspec(func):
5659
# This was deprecated in Python 3.
5760
return inspect.getargspec(func)
61+
62+
5863
else:
5964
from functools import wraps # noqa
6065

@@ -80,13 +85,13 @@ def find_ordinal(pos_num):
8085
if pos_num == 0:
8186
return "th"
8287
elif pos_num == 1:
83-
return 'st'
88+
return "st"
8489
elif pos_num == 2:
85-
return 'nd'
90+
return "nd"
8691
elif pos_num == 3:
87-
return 'rd'
92+
return "rd"
8893
elif pos_num >= 4 and pos_num <= 20:
89-
return 'th'
94+
return "th"
9095
else:
9196
return find_ordinal(pos_num % 10)
9297

src/pip/_vendor/tenacity/after.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,18 @@ def after_nothing(retry_state):
2323

2424
def after_log(logger, log_level, sec_format="%0.3f"):
2525
"""After call strategy that logs to some logger the finished attempt."""
26-
log_tpl = ("Finished call to '%s' after " + str(sec_format) + "(s), "
27-
"this was the %s time calling it.")
26+
log_tpl = (
27+
"Finished call to '%s' after " + str(sec_format) + "(s), "
28+
"this was the %s time calling it."
29+
)
2830

2931
def log_it(retry_state):
30-
logger.log(log_level, log_tpl,
31-
_utils.get_callback_name(retry_state.fn),
32-
retry_state.seconds_since_start,
33-
_utils.to_ordinal(retry_state.attempt_number))
32+
logger.log(
33+
log_level,
34+
log_tpl,
35+
_utils.get_callback_name(retry_state.fn),
36+
retry_state.seconds_since_start,
37+
_utils.to_ordinal(retry_state.attempt_number),
38+
)
3439

3540
return log_it

0 commit comments

Comments
 (0)