diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ad9ec7..cb3076c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/backoff/_decorator.py b/backoff/_decorator.py index 708152e..3be55f6 100644 --- a/backoff/_decorator.py +++ b/backoff/_decorator.py @@ -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 ( @@ -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, @@ -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, diff --git a/backoff/_typing.py b/backoff/_typing.py index c2c553b..44df623 100644 --- a/backoff/_typing.py +++ b/backoff/_typing.py @@ -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 diff --git a/backoff/_wait_gen.py b/backoff/_wait_gen.py index 3d028c1..f015989 100644 --- a/backoff/_wait_gen.py +++ b/backoff/_wait_gen.py @@ -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. @@ -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]: @@ -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: @@ -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. diff --git a/pyproject.toml b/pyproject.toml index 424c9dc..f776562 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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