Repository navigation
Conversation
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## develop #2059 +/- ##
===========================================
- Coverage 65.74% 65.47% -0.28%
===========================================
Files 53 53
Lines 5047 5022 -25
Branches 611 610 -1
===========================================
- Hits 3318 3288 -30
- Misses 1507 1509 +2
- Partials 222 225 +3
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. |
Python 3.10 reached end-of-life in October 2026. Raise the minimum supported version to 3.11 and stop testing on 3.10 in CI. This also drops the async-timeout dependency, which was only needed on Python 3.10, the Python version markers on the docs and Android test dependencies, which no longer exclude any supported version, and the pytest warning filter for the coverage C tracer issue that only affected Python 3.10.
Now that the minimum supported Python version is 3.11: * Import Self, Never, Unpack, TypeVarTuple and assert_never from typing instead of going through bleak._compat. Only override (Python 3.12) is left there. * Use asyncio.timeout() directly instead of the async_timeout alias. test_disconnect_timeout_tears_down now patches asyncio.timeout for the duration of the disconnect() call instead of the alias in the BlueZ client module. * Catch the builtin TimeoutError instead of asyncio.TimeoutError, which is just an alias for it since Python 3.11. * Use the PEP 646 *Ts syntax instead of Unpack[Ts]. * Make BleakBackend an enum.StrEnum instead of mixing in str. This makes str() and format() return the plain value on all Python versions. * Drop the Python version checks for tomllib in docs/conf.py and for Self in the type stubs.
dlech
force-pushed
the
drop-python-3.10
branch
from
November 10, 2026 23:53
6674367 to
9fb6c63
Compare
bumble depends on grpcio for its Android emulator transports, but the only host-side use was importing find_grpc_port() from bumble.transport.android_netsim in the Android emulator test runner. That module imports grpc at the top, even though find_grpc_port() just reads the port from NetSim's .ini file. The tests that actually talk to NetSim over gRPC run inside the Android testbed app, which gets its own copy of bumble and grpcio from briefcase. Do the .ini file lookup in the runner instead and drop grpcio from the test dependencies everywhere, like it already was on Windows. grpcio often has no wheels for new Python versions or for musl, which the BlueZ integration test VM uses, and building it from source needs a C++ compiler.
dlech
force-pushed
the
drop-python-3.10
branch
from
November 11, 2026 00:00
9fb6c63 to
6a1f115
Compare
Add Python 3.15 to the desktop, BlueZ integration and winvhci integration test matrices and add a test-py315 poe task. aiohttp 3.14.1, cffi 2.0.0 and pyobjc 12.1 have no wheels for Python 3.15 and pyobjc 12.1 fails to build from source with current Xcode, so upgrade them (and yarl along with aiohttp) to versions that do. The uv package in the Alpine VM for the BlueZ integration tests (0.11.19 in Alpine 3.24) only knows about Python 3.15.0b2, which segfaulted in the tests. Install the latest uv from PyPI in the VM and use that instead.
dlech
force-pushed
the
drop-python-3.10
branch
from
November 11, 2026 00:07
6a1f115 to
2016ec9
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Python 3.10 reached end-of-life in October 2026.
bleak: drop support for Python 3.10
requires-python = ">=3.11", isort/mypy targets bumped, 3.10 removed from the CI matrices and poe tasks.async-timeoutdependency and the now-redundantpython_versionmarkers on the docs and Android test dependencies.bleak: use Python 3.11 features
Self,Never,Unpack,TypeVarTupleandassert_nevernow come straight fromtyping, and the async-timeout alias is replaced withasyncio.timeout(). Onlyoverride(3.12) is left inbleak._compat.TimeoutErrorinstead of its aliasasyncio.TimeoutError.*Tssyntax instead ofUnpack[Ts].BleakBackendis now anenum.StrEnum. This is the one user-visible change:str()/format()now return the value (e.g."bluez_dbus") instead of"BleakBackend.BLUEZ_DBUS". The CHANGELOG notes it.test_disconnect_timeout_tears_downnow patchesasyncio.timeout, scoped to thedisconnect()call withmonkeypatch.context(), instead of the module-level alias.tests: drop the grpcio dependency
find_grpc_port()frombumble.transport.android_netsim, which imports grpc at the top. The runner now reads NetSim's.inifile itself.CI: test on Python 3.15
test-py315poe task.Tested locally on Linux: lint, mypy and pyright (desktop and Android), the docs build, and the test suite on 3.11, 3.14 and 3.15.2.