Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

- Apply the Ruff `B` rules [#100](https://github.com/python-backoff/backoff/pull/100) (from [@edgarrmondragon](https://github.com/edgarrmondragon))

- Apply the Ruff `FA` rules [#104](https://github.com/python-backoff/backoff/pull/104) (from [@edgarrmondragon](https://github.com/edgarrmondragon))

## [v2.3.1] - 2025-12-18

### Fixed
Expand Down
52 changes: 28 additions & 24 deletions backoff/_decorator.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from __future__ import annotations

import inspect
import logging
import operator
from typing import Any, Callable, Iterable, Optional, Type, Union
from typing import TYPE_CHECKING, Any, Callable, Iterable

from backoff import _async, _sync
from backoff._common import (
Expand All @@ -11,28 +13,30 @@
_prepare_logger,
)
from backoff._jitter import full_jitter
from backoff._typing import (
_CallableT,
_Handler,
_Jitterer,
_MaybeCallable,
_MaybeLogger,
_MaybeSequence,
_Predicate,
_WaitGenerator,
)

if TYPE_CHECKING:
from backoff._typing import (
_CallableT,
_Handler,
_Jitterer,
_MaybeCallable,
_MaybeLogger,
_MaybeSequence,
_Predicate,
_WaitGenerator,
)


def on_predicate(
wait_gen: _WaitGenerator,
predicate: _Predicate[Any] = operator.not_,
*,
max_tries: Optional[_MaybeCallable[int]] = None,
max_time: Optional[_MaybeCallable[float]] = None,
jitter: Union[_Jitterer, None] = full_jitter,
on_success: Union[_Handler, Iterable[_Handler], None] = None,
on_backoff: Union[_Handler, Iterable[_Handler], None] = None,
on_giveup: Union[_Handler, Iterable[_Handler], None] = None,
max_tries: _MaybeCallable[int] | None = None,
max_time: _MaybeCallable[float] | None = None,
jitter: _Jitterer | None = full_jitter,
on_success: _Handler | Iterable[_Handler] | None = None,
on_backoff: _Handler | Iterable[_Handler] | None = None,
on_giveup: _Handler | Iterable[_Handler] | None = None,
logger: _MaybeLogger = "backoff",
backoff_log_level: int = logging.INFO,
giveup_log_level: int = logging.ERROR,
Expand Down Expand Up @@ -124,15 +128,15 @@ def decorate(target):

def on_exception(
wait_gen: _WaitGenerator,
exception: _MaybeSequence[Type[Exception]],
exception: _MaybeSequence[type[Exception]],
*,
max_tries: Optional[_MaybeCallable[int]] = None,
max_time: Optional[_MaybeCallable[float]] = None,
jitter: Union[_Jitterer, None] = full_jitter,
max_tries: _MaybeCallable[int] | None = None,
max_time: _MaybeCallable[float] | None = None,
jitter: _Jitterer | None = full_jitter,
giveup: _Predicate[Exception] = lambda e: False,
on_success: Union[_Handler, Iterable[_Handler], None] = None,
on_backoff: Union[_Handler, Iterable[_Handler], None] = None,
on_giveup: Union[_Handler, Iterable[_Handler], None] = None,
on_success: _Handler | Iterable[_Handler] | None = None,
on_backoff: _Handler | Iterable[_Handler] | None = None,
on_giveup: _Handler | Iterable[_Handler] | None = None,
raise_on_giveup: bool = True,
logger: _MaybeLogger = "backoff",
backoff_log_level: int = logging.INFO,
Expand Down
13 changes: 8 additions & 5 deletions backoff/_typing.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,26 @@
from __future__ import annotations

import logging
from types import FunctionType
from typing import (
TYPE_CHECKING,
Any,
Callable,
Coroutine,
Dict,
Generator,
Sequence,
Tuple,
TypedDict,
TypeVar,
Union,
)

if TYPE_CHECKING:
from types import FunctionType


class _Details(TypedDict):
target: FunctionType
args: Tuple[Any, ...]
kwargs: Dict[str, Any]
args: tuple[Any, ...]
kwargs: dict[str, Any]
tries: int
elapsed: float

Expand Down
12 changes: 7 additions & 5 deletions backoff/_wait_gen.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
from __future__ import annotations

import itertools
import math
from typing import Any, Callable, Generator, Iterable, Optional, Union
from typing import Any, Callable, Generator, Iterable


def expo(
base: float = 2,
factor: float = 1,
max_value: Optional[float] = None,
max_value: float | None = None,
) -> Generator[float, Any, None]:
"""Generator for exponential decay.

Expand All @@ -32,7 +34,7 @@ def expo(
def decay(
initial_value: float = 1,
decay_factor: float = 1,
min_value: Optional[float] = None,
min_value: float | None = None,
) -> Generator[float, Any, None]:
"""Generator for exponential decay[1]:

Expand All @@ -57,7 +59,7 @@ def decay(
yield min_value


def fibo(max_value: Optional[int] = None) -> Generator[int, None, None]:
def fibo(max_value: int | None = None) -> Generator[int, None, None]:
"""Generator for fibonaccial decay.

Args:
Expand All @@ -79,7 +81,7 @@ def fibo(max_value: Optional[int] = None) -> Generator[int, None, None]:


def constant(
interval: Union[int, Iterable[float]] = 1,
interval: int | Iterable[float] = 1,
) -> Generator[float, None, None]:
"""Generator for constant intervals.

Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ extend-select = [
"B", # flake8-bugbear
"C4", # flake8-comprehensions
"DTZ", # flake8-datetimez
"FA", # flake8-future-annotations
"ISC", # flake8-implicit-str-concat
"ICN", # flake8-import-conventions
"LOG", # flake8-logging
Expand Down
Loading