refactor: mark overridden methods with @override - #682
Conversation
|
This pull request is part of a Mergify stack:
|
cdd9c7b to
dbf3491
Compare
0ef3a14 to
73f02ad
Compare
Revision history
|
Merge Queue Status
This pull request spent 2 minutes 3 seconds in the queue, including 9 seconds running CI. Waiting for
All conditions
ReasonPull request #682 has been dequeued queue conditions no longer match. Blocked by:
HintYou should look at the reason for the failure and decide if the pull request needs to be fixed or if you want to requeue it. Requeued — the merge queue status continues in this comment ↓. |
dbf3491 to
dc1546e
Compare
73f02ad to
8c5a928
Compare
Merge Queue Status
This pull request spent 1 minute 7 seconds in the queue, including 4 seconds running CI. Waiting for
All conditions
ReasonPull request #682 has been dequeued queue conditions no longer match. Blocked by:
HintYou should look at the reason for the failure and decide if the pull request needs to be fixed or if you want to requeue it. Requeued — the merge queue status continues in this comment ↓. |
Two more error codes mypy leaves off under `strict`, both with real hits in the test suite. `possibly-undefined`: `test_retry_state` bound `retry_state` only inside an `except ExtractCallState` block, then used it unconditionally. Had the retry stopped raising, the test would have failed with `NameError` instead of a useful assertion. Use `assertRaises` as a context manager, which both asserts the exception is raised and binds the state unconditionally. `deprecated`: `asyncio.iscoroutinefunction` is deprecated since 3.14 and removed in 3.16, and was emitting a `DeprecationWarning` on every test run. The line right below it already asserts the same property via `inspect.iscoroutinefunction`, which is the documented replacement, so drop the deprecated call rather than pin the suite to an API that is going away. Change-Id: I135cf5364f3e471d954c878f2599be7441104971
`explicit-override` is off under `strict`, and 63 methods across the library and tests were overriding a base method without saying so. That makes a whole class of change silently lossy: rename or drop a method on `retry_base`/`wait_base`/`stop_base`/`BaseRetrying` and every subclass keeps its now-orphaned implementation, still importable, never called again. `typing.override` only exists from Python 3.12, and tenacity has no runtime dependencies, so `_utils` imports it from `typing_extensions` under TYPE_CHECKING (as the module already does for `Self`) and falls back to a small PEP 698 shim at runtime on 3.10/3.11. Type checkers only ever see the `typing_extensions` name, so the check works regardless of the interpreter mypy runs under. That last point exposed a second problem worth fixing here: mypy's `python_version` defaults to whatever interpreter runs it, so CI on 3.14 was never verifying that the code is valid on the 3.10 we claim to support. Pin `python_version = "3.10"` to match `requires-python`. It caught one real case immediately -- `RetryCallState.__getstate__` is only an override from 3.11 on, where `object.__getstate__` was introduced, so it must not carry the decorator. Verified `mypy` reports the same result under both a 3.10 and a 3.14 interpreter, and the runtime shim sets `__override__` correctly on 3.10. Change-Id: Ide71dd204215e82012f6a9b1afc725dd7c5db8ee
8c5a928 to
c5fa908
Compare
dc1546e to
d245e46
Compare
Merge Queue Status
This pull request spent 30 seconds in the queue, including 2 seconds running CI. Required conditions to merge
|
explicit-overrideis off understrict, and 63 methods across thelibrary and tests were overriding a base method without saying so. That
makes a whole class of change silently lossy: rename or drop a method on
retry_base/wait_base/stop_base/BaseRetryingand every subclass keepsits now-orphaned implementation, still importable, never called again.
typing.overrideonly exists from Python 3.12, and tenacity has no runtimedependencies, so
_utilsimports it fromtyping_extensionsunderTYPE_CHECKING (as the module already does for
Self) and falls back to asmall PEP 698 shim at runtime on 3.10/3.11. Type checkers only ever see the
typing_extensionsname, so the check works regardless of the interpretermypy runs under.
That last point exposed a second problem worth fixing here: mypy's
python_versiondefaults to whatever interpreter runs it, so CI on 3.14 wasnever verifying that the code is valid on the 3.10 we claim to support. Pin
python_version = "3.10"to matchrequires-python. It caught one realcase immediately --
RetryCallState.__getstate__is only an override from3.11 on, where
object.__getstate__was introduced, so it must not carrythe decorator.
Verified
mypyreports the same result under both a 3.10 and a 3.14interpreter, and the runtime shim sets
__override__correctly on 3.10.Depends-On: #681