Repository navigation
Built from 3c99640c161839243df166ac22883269f72791fc by run 34810448566, never from a working tree.
Provenance is attested; verify with:
gh attestation verify <file> --repo ferinazumaDEV/politeclient
SHA-256
ef8da49eee3a557eb972355a89a7b48d6105be71303b4c9cb2e34144fafa3c8b politeclient-0.1.2-py3-none-any.whl
ea14dcf4283918e7499a5ab04e69c10e0639a3e84f0dad0e11f81edd751365d9 politeclient-0.1.2.tar.gz
sbom.cyclonedx.json describes the package and its runtime dependencies as installed from this wheel.
How this release was assembled. The tag and this release were created by hand before the workflow ran, so the run's own "GitHub Release" step failed with "a release with the same tag name already exists" after PyPI had already accepted the upload. Per RELEASING.md the run was not repeated; the assets above are the run's
distartefact — the same bytes PyPI holds — and were attached on 2026-09-14 after checking SHA256SUMS, the attestations, the PyPI digests and the Integrity API provenance by hand.
Changelog
Deprecated
- Python below 3.11 is compatibility, not support. The floor becomes 3.11 in 0.2.0 (3.10 reaches
end of life in October 2026). Nothing changes within 0.1.x; CI keeps running on every version the
package still declares.
Fixed
RetryPolicy.backoff_forno longer raisesOverflowErrorpast attempt ~1024.2 ** attempt
is an exact int in Python and stops fitting a float there, so a client configured with a large
max_retriescrashed on the attempt it should simply have sleptmax_backofffor. It now does.parse_retry_afterfollows thedelay-secondsgrammar of RFC 9110 (ASCII digits only).
int()also accepted+5,-5and digits from other scripts (٣,12); those now return
None, so the computed backoff applies instead. A value with more digits than a float can hold
raisedOverflowError; it now means "never", whichcompute_delayclamps tomax_backoff.TokenBucket.acquirerejects zero, negative and NaN token counts withValueError. A negative
amount refilled the bucket past its capacity (acquire(-10)on a bucket of 2 left 12 tokens: a
limiter you could bypass), zero was a silent no-op, and NaN never returned because it compares
false with everything.TokenBucket.acquireno longer spins when the refill lands a few ULPs short of the request.
With a deterministic clock (what theclock/sleepparameters exist for) the sub-ULP sleep was
absorbed and the loop never advanced; with the real clock it busy-waited until the monotonic clock
ticked. A deficit within floating-point noise now counts as satisfied.RateLimit,TokenBucketandRetryPolicyreject non-finite configuration at construction.
rate=infoverflowed incapacity,rate=nanslipped pastrate <= 0and blew up inmath.ceil,
burst=infbuilt a bucket that never limits, andmax_backoff=nanwould have slept NaN. Rate-limit
cases raiseRateLimitConfigError; retry-policy cases raiseValueError.
All five were found by tests/test_adversarial.py, a new suite that states the invariants a caller
relies on (a bounded, finite backoff; a bucket whose tokens only go down when acquired; the RFC
grammar) and feeds the code the inputs a real client meets at the edges. Every test in it failed
against the previous code before the fix was written.
Archived at Software Heritage
Resolved on 2026-09-14 against the archive, after a Save Code Now visit that followed this tag.
- Directory (the tree this release is):
swh:1:dir:80cf731c5327beb320c0131487fafd89dedb7dc2 - Revision (the commit
3c99640c1618):swh:1:rev:3c99640c161839243df166ac22883269f72791fc - Snapshot of the visit:
swh:1:snp:85751834094dc7920eab8a206c5af8e78749969e - Resolve: https://archive.softwareheritage.org/swh:1:dir:80cf731c5327beb320c0131487fafd89dedb7dc2;origin=https://github.com/ferinazumaDEV/politeclient;visit=swh:1:snp:85751834094dc7920eab8a206c5af8e78749969e;anchor=swh:1:rev:3c99640c161839243df166ac22883269f72791fc