Skip to content

Commit eb70b4a

Browse files
WIP: format python in docs
1 parent 1cb2556 commit eb70b4a

29 files changed

Lines changed: 1091 additions & 923 deletions

‎.pre-commit-config.yaml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ repos:
1616
rev: v0.14.6
1717
hooks:
1818
- id: ruff-check
19-
# - id: ruff-format
19+
- id: ruff-format
2020
- repo: https://github.com/astral-sh/uv-pre-commit
2121
rev: 0.9.13
2222
hooks:

‎backoff/__init__.py‎

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,21 @@
1212
For examples and full documentation see the README at
1313
https://github.com/python-backoff/backoff
1414
"""
15+
1516
from backoff._decorator import on_exception, on_predicate
1617
from backoff._jitter import full_jitter, random_jitter
1718
from backoff._wait_gen import constant, expo, fibo, runtime, decay
1819

1920
__all__ = [
20-
'on_predicate',
21-
'on_exception',
22-
'constant',
23-
'expo',
24-
'decay',
25-
'fibo',
26-
'runtime',
27-
'full_jitter',
28-
'random_jitter',
21+
"on_predicate",
22+
"on_exception",
23+
"constant",
24+
"expo",
25+
"decay",
26+
"fibo",
27+
"runtime",
28+
"full_jitter",
29+
"random_jitter",
2930
]
3031

3132
__version__ = "2.2.1"

‎backoff/_async.py‎

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,37 +11,44 @@ def _ensure_coroutine(coro_or_func):
1111
if inspect.iscoroutinefunction(coro_or_func):
1212
return coro_or_func
1313
else:
14+
1415
@functools.wraps(coro_or_func)
1516
async def f(*args, **kwargs):
1617
return coro_or_func(*args, **kwargs)
18+
1719
return f
1820

1921

2022
def _ensure_coroutines(coros_or_funcs):
2123
return [_ensure_coroutine(f) for f in coros_or_funcs]
2224

2325

24-
async def _call_handlers(handlers,
25-
*,
26-
target, args, kwargs, tries, elapsed,
27-
**extra):
26+
async def _call_handlers(handlers, *, target, args, kwargs, tries, elapsed, **extra):
2827
details = {
29-
'target': target,
30-
'args': args,
31-
'kwargs': kwargs,
32-
'tries': tries,
33-
'elapsed': elapsed,
28+
"target": target,
29+
"args": args,
30+
"kwargs": kwargs,
31+
"tries": tries,
32+
"elapsed": elapsed,
3433
}
3534
details.update(extra)
3635
for handler in handlers:
3736
await handler(details)
3837

3938

40-
def retry_predicate(target, wait_gen, predicate,
41-
*,
42-
max_tries, max_time, jitter,
43-
on_success, on_backoff, on_giveup,
44-
wait_gen_kwargs):
39+
def retry_predicate(
40+
target,
41+
wait_gen,
42+
predicate,
43+
*,
44+
max_tries,
45+
max_time,
46+
jitter,
47+
on_success,
48+
on_backoff,
49+
on_giveup,
50+
wait_gen_kwargs,
51+
):
4552
on_success = _ensure_coroutines(on_success)
4653
on_backoff = _ensure_coroutines(on_backoff)
4754
on_giveup = _ensure_coroutines(on_giveup)
@@ -54,7 +61,6 @@ def retry_predicate(target, wait_gen, predicate,
5461

5562
@functools.wraps(target)
5663
async def retry(*args, **kwargs):
57-
5864
# update variables from outer function args
5965
max_tries_value = _maybe_call(max_tries)
6066
max_time_value = _maybe_call(max_time)
@@ -75,23 +81,22 @@ async def retry(*args, **kwargs):
7581

7682
ret = await target(*args, **kwargs)
7783
if predicate(ret):
78-
max_tries_exceeded = (tries == max_tries_value)
79-
max_time_exceeded = (max_time_value is not None and
80-
elapsed >= max_time_value)
84+
max_tries_exceeded = tries == max_tries_value
85+
max_time_exceeded = (
86+
max_time_value is not None and elapsed >= max_time_value
87+
)
8188

8289
if max_tries_exceeded or max_time_exceeded:
8390
await _call_handlers(on_giveup, **details, value=ret)
8491
break
8592

8693
try:
87-
seconds = _next_wait(wait, ret, jitter, elapsed,
88-
max_time_value)
94+
seconds = _next_wait(wait, ret, jitter, elapsed, max_time_value)
8995
except StopIteration:
9096
await _call_handlers(on_giveup, **details, value=ret)
9197
break
9298

93-
await _call_handlers(on_backoff, **details, value=ret,
94-
wait=seconds)
99+
await _call_handlers(on_backoff, **details, value=ret, wait=seconds)
95100

96101
# Note: there is no convenient way to pass explicit event
97102
# loop to decorator, so here we assume that either default
@@ -113,11 +118,21 @@ async def retry(*args, **kwargs):
113118
return retry
114119

115120

116-
def retry_exception(target, wait_gen, exception,
117-
*,
118-
max_tries, max_time, jitter, giveup,
119-
on_success, on_backoff, on_giveup, raise_on_giveup,
120-
wait_gen_kwargs):
121+
def retry_exception(
122+
target,
123+
wait_gen,
124+
exception,
125+
*,
126+
max_tries,
127+
max_time,
128+
jitter,
129+
giveup,
130+
on_success,
131+
on_backoff,
132+
on_giveup,
133+
raise_on_giveup,
134+
wait_gen_kwargs,
135+
):
121136
on_success = _ensure_coroutines(on_success)
122137
on_backoff = _ensure_coroutines(on_backoff)
123138
on_giveup = _ensure_coroutines(on_giveup)
@@ -129,7 +144,6 @@ def retry_exception(target, wait_gen, exception,
129144

130145
@functools.wraps(target)
131146
async def retry(*args, **kwargs):
132-
133147
max_tries_value = _maybe_call(max_tries)
134148
max_time_value = _maybe_call(max_time)
135149

@@ -151,9 +165,10 @@ async def retry(*args, **kwargs):
151165
ret = await target(*args, **kwargs)
152166
except exception as e:
153167
giveup_result = await giveup(e)
154-
max_tries_exceeded = (tries == max_tries_value)
155-
max_time_exceeded = (max_time_value is not None and
156-
elapsed >= max_time_value)
168+
max_tries_exceeded = tries == max_tries_value
169+
max_time_exceeded = (
170+
max_time_value is not None and elapsed >= max_time_value
171+
)
157172

158173
if giveup_result or max_tries_exceeded or max_time_exceeded:
159174
await _call_handlers(on_giveup, **details, exception=e)
@@ -162,14 +177,12 @@ async def retry(*args, **kwargs):
162177
return None
163178

164179
try:
165-
seconds = _next_wait(wait, e, jitter, elapsed,
166-
max_time_value)
180+
seconds = _next_wait(wait, e, jitter, elapsed, max_time_value)
167181
except StopIteration:
168182
await _call_handlers(on_giveup, **details, exception=e)
169183
raise e
170184

171-
await _call_handlers(on_backoff, **details, wait=seconds,
172-
exception=e)
185+
await _call_handlers(on_backoff, **details, wait=seconds, exception=e)
173186

174187
# Note: there is no convenient way to pass explicit event
175188
# loop to decorator, so here we assume that either default
@@ -185,4 +198,5 @@ async def retry(*args, **kwargs):
185198
await _call_handlers(on_success, **details)
186199

187200
return ret
201+
188202
return retry

‎backoff/_common.py‎

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99

1010
# Use module-specific logger with a default null handler.
11-
_logger = logging.getLogger('backoff')
11+
_logger = logging.getLogger("backoff")
1212
_logger.addHandler(logging.NullHandler()) # pragma: no cover
1313
_logger.setLevel(logging.INFO)
1414

@@ -65,14 +65,20 @@ def _prepare_logger(logger):
6565
# Configure handler list with user specified handler and optionally
6666
# with a default handler bound to the specified logger.
6767
def _config_handlers(
68-
user_handlers, *, default_handler=None, logger=None, log_level=None,
68+
user_handlers,
69+
*,
70+
default_handler=None,
71+
logger=None,
72+
log_level=None,
6973
):
7074
handlers = []
7175
if logger is not None:
7276
assert log_level is not None, "Log level is not specified"
7377
# bind the specified logger to the default log handler
7478
log_handler = functools.partial(
75-
default_handler, logger=logger, log_level=log_level,
79+
default_handler,
80+
logger=logger,
81+
log_level=log_level,
7682
)
7783
handlers.append(log_handler)
7884

@@ -81,7 +87,7 @@ def _config_handlers(
8187

8288
# user specified handlers can either be an iterable of handlers
8389
# or a single handler. either way append them to the list.
84-
if hasattr(user_handlers, '__iter__'):
90+
if hasattr(user_handlers, "__iter__"):
8591
# add all handlers in the iterable
8692
handlers += list(user_handlers)
8793
else:
@@ -94,27 +100,27 @@ def _config_handlers(
94100
# Default backoff handler
95101
def _log_backoff(details, logger, log_level):
96102
msg = "Backing off %s(...) for %.1fs (%s)"
97-
log_args = [details['target'].__name__, details['wait']]
103+
log_args = [details["target"].__name__, details["wait"]]
98104

99105
exc_typ, exc, _ = sys.exc_info()
100106
if exc is not None:
101107
exc_fmt = traceback.format_exception_only(exc_typ, exc)[-1]
102108
log_args.append(exc_fmt.rstrip("\n"))
103109
else:
104-
log_args.append(details['value'])
110+
log_args.append(details["value"])
105111
logger.log(log_level, msg, *log_args)
106112

107113

108114
# Default giveup handler
109115
def _log_giveup(details, logger, log_level):
110116
msg = "Giving up %s(...) after %d tries (%s)"
111-
log_args = [details['target'].__name__, details['tries']]
117+
log_args = [details["target"].__name__, details["tries"]]
112118

113119
exc_typ, exc, _ = sys.exc_info()
114120
if exc is not None:
115121
exc_fmt = traceback.format_exception_only(exc_typ, exc)[-1]
116122
log_args.append(exc_fmt.rstrip("\n"))
117123
else:
118-
log_args.append(details['value'])
124+
log_args.append(details["value"])
119125

120126
logger.log(log_level, msg, *log_args)

‎backoff/_decorator.py‎

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,21 @@
2424
)
2525

2626

27-
def on_predicate(wait_gen: _WaitGenerator,
28-
predicate: _Predicate[Any] = operator.not_,
29-
*,
30-
max_tries: Optional[_MaybeCallable[int]] = None,
31-
max_time: Optional[_MaybeCallable[float]] = None,
32-
jitter: Union[_Jitterer, None] = full_jitter,
33-
on_success: Union[_Handler, Iterable[_Handler], None] = None,
34-
on_backoff: Union[_Handler, Iterable[_Handler], None] = None,
35-
on_giveup: Union[_Handler, Iterable[_Handler], None] = None,
36-
logger: _MaybeLogger = 'backoff',
37-
backoff_log_level: int = logging.INFO,
38-
giveup_log_level: int = logging.ERROR,
39-
**wait_gen_kwargs: Any) -> Callable[[_CallableT], _CallableT]:
27+
def on_predicate(
28+
wait_gen: _WaitGenerator,
29+
predicate: _Predicate[Any] = operator.not_,
30+
*,
31+
max_tries: Optional[_MaybeCallable[int]] = None,
32+
max_time: Optional[_MaybeCallable[float]] = None,
33+
jitter: Union[_Jitterer, None] = full_jitter,
34+
on_success: Union[_Handler, Iterable[_Handler], None] = None,
35+
on_backoff: Union[_Handler, Iterable[_Handler], None] = None,
36+
on_giveup: Union[_Handler, Iterable[_Handler], None] = None,
37+
logger: _MaybeLogger = "backoff",
38+
backoff_log_level: int = logging.INFO,
39+
giveup_log_level: int = logging.ERROR,
40+
**wait_gen_kwargs: Any,
41+
) -> Callable[[_CallableT], _CallableT]:
4042
"""Returns decorator for backoff and retry triggered by predicate.
4143
4244
Args:
@@ -80,6 +82,7 @@ def on_predicate(wait_gen: _WaitGenerator,
8082
args will first be evaluated and their return values passed.
8183
This is useful for runtime configuration.
8284
"""
85+
8386
def decorate(target):
8487
nonlocal logger, on_success, on_backoff, on_giveup
8588

@@ -120,21 +123,23 @@ def decorate(target):
120123
return decorate
121124

122125

123-
def on_exception(wait_gen: _WaitGenerator,
124-
exception: _MaybeSequence[Type[Exception]],
125-
*,
126-
max_tries: Optional[_MaybeCallable[int]] = None,
127-
max_time: Optional[_MaybeCallable[float]] = None,
128-
jitter: Union[_Jitterer, None] = full_jitter,
129-
giveup: _Predicate[Exception] = lambda e: False,
130-
on_success: Union[_Handler, Iterable[_Handler], None] = None,
131-
on_backoff: Union[_Handler, Iterable[_Handler], None] = None,
132-
on_giveup: Union[_Handler, Iterable[_Handler], None] = None,
133-
raise_on_giveup: bool = True,
134-
logger: _MaybeLogger = 'backoff',
135-
backoff_log_level: int = logging.INFO,
136-
giveup_log_level: int = logging.ERROR,
137-
**wait_gen_kwargs: Any) -> Callable[[_CallableT], _CallableT]:
126+
def on_exception(
127+
wait_gen: _WaitGenerator,
128+
exception: _MaybeSequence[Type[Exception]],
129+
*,
130+
max_tries: Optional[_MaybeCallable[int]] = None,
131+
max_time: Optional[_MaybeCallable[float]] = None,
132+
jitter: Union[_Jitterer, None] = full_jitter,
133+
giveup: _Predicate[Exception] = lambda e: False,
134+
on_success: Union[_Handler, Iterable[_Handler], None] = None,
135+
on_backoff: Union[_Handler, Iterable[_Handler], None] = None,
136+
on_giveup: Union[_Handler, Iterable[_Handler], None] = None,
137+
raise_on_giveup: bool = True,
138+
logger: _MaybeLogger = "backoff",
139+
backoff_log_level: int = logging.INFO,
140+
giveup_log_level: int = logging.ERROR,
141+
**wait_gen_kwargs: Any,
142+
) -> Callable[[_CallableT], _CallableT]:
138143
"""Returns decorator for backoff and retry triggered by exception.
139144
140145
Args:
@@ -180,6 +185,7 @@ def on_exception(wait_gen: _WaitGenerator,
180185
args will first be evaluated and their return values passed.
181186
This is useful for runtime configuration.
182187
"""
188+
183189
def decorate(target):
184190
nonlocal logger, on_success, on_backoff, on_giveup
185191

0 commit comments

Comments
 (0)