All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Calendar Versioning.
The first number of the version is the year. The second number is incremented with each release, starting at 1 for each year. The third number is for emergencies when we need to start branches for older releases.
You can find our backwards-compatibility policy here.
- cap argument to
stamina.set_testing()
. By default, the value passed as attempts is used strictly. Whencap=True
, it is used as an upper cap; that means that if the original attempts number is lower, it's not changed. #80
24.3.0 - 2024-08-27
-
The on argument in all retry functions now can be a callable that takes an exception and returns a bool which decides whether or not a retry should be scheduled. #70
-
stamina.Attempt
now has anext_wait
attribute that contains the time the next backoff will wait, if the current attempt fails (sans jitter). #72 -
It is now possible to switch stamina into a testing mode using
stamina.set_testing()
. It disables backoffs and caps the number of retries. #73
24.2.0 - 2024-01-31
-
stamina.RetryingCaller
andstamina.AsyncRetryingCaller
that allow even easier retries of single callables:stamina.RetryingCaller(attempts=5).on(ValueError)(do_something, "foo", bar=42)
andstamina.RetryingCaller(attempts=5)(ValueError, do_something, "foo", bar=42)
will calldo_something("foo", bar=42)
and retry onValueError
up to 5 times.stamina.RetryingCaller
andstamina.AsyncRetryingCaller
take the same arguments asstamina.retry()
, except foron
that can be bound separately.
24.1.0 - 2024-01-03
- stamina doesn't retry successful blocks when it's deactivated anymore (yes, you read it right). #54
23.3.0 - 2023-12-05
23.2.0 - 2023-10-30
-
Instrumentation is now pluggable! You can define your own hooks that are run with retry details whenever a retry is scheduled. The documentation now has a whole chapter on instrumentation. #37
-
If structlog is not installed, the scheduled retry is now logged using the standard library
logging
module by default. #35
-
Tenacity's internal
AttemptManager
object is no longer exposed to the user. This was an oversight and never documented.stamina.retry_context()
now yields instances ofstamina.Attempt
. #22 -
Initialization of instrumentation is now delayed. This means that if there's no retries, there's no startup overhead from importing structlog and prometheus-client. #34
-
Some key names in structlog log messages have been renamed to better reflect their meaning (
slept
→waited_so_far
,attempt
→retry_num
, anderror
→caused_by
). You can rename them back using structlog'sstructlog.processors.EventRenamer
. #35
23.1.0 - 2023-07-04
- Official Python 3.12 support. #9
- Async support. #10
- Retries of arbitrary blocks using (async)
for
loops and context managers. #12 - Proper documentation. #16
- A backwards-compatibility policy.
- The timeout, wait_initial, wait_max, and wait_jitter arguments can now also be of type
datetime.timedelta
.
22.2.0 - 2022-10-06
- Retries are now instrumented.
If prometheus-client is installed, retries are counted using the Prometheus counter
stamina_retries_total
. If structlog is installed, they are logged using a structlog logger at warning level. These two instrumentations are independent from each other.
22.1.0 - 2022-10-02
- Initial release.