v10.8.0
Highlights
✨ ~2.4x faster CLI startup on Python 3.15 (PEP 810 lazy imports)
On Python 3.15+, the CLI now runs with PEP 810 lazy imports, scoped via sys.set_lazy_imports_filter() so that only pymobiledevice3's own imports are deferred — heavy dependency chains (pykdebugparser, fastapi, IPython, qh3, cryptography) load on first use instead of at startup, while third-party packages' internals stay eager (unscoped process-wide laziness is known to break import hooks such as pytest's assertion rewriter). Measured on 3.15.0b3 with a device connected: pymobiledevice3 --help drops from 0.55s to 0.23s and pymobiledevice3 usbmux list from 0.53s to 0.39s (the remainder is device I/O). On Python <= 3.14 the shim is a no-op — the 3.9 floor is unchanged, and nothing needs configuring either way:
uvx -p 3.15 pymobiledevice3 --help # lazy imports engage automatically on 3.15+As a library, pymobiledevice3 never changes a host process's import semantics: importing pymobiledevice3.* from your own code stays eager. App authors who own their process can opt in with the same three-line scoped snippet, now documented in the Python API guide. The full test suite was validated against a physical device with lazy mode active — results identical to eager.
🧪 Python 3.15 in the CI matrix + trove classifier
The 3.15 prerelease joined the test matrix on all three platforms — every PR now exercises the scoped lazy-imports mode end to end (the test suite enables it via tests/conftest.py, mirroring what the CLI ships) — and the package now declares the Programming Language :: Python :: 3.15 classifier.
What's Changed
- 79605bf build: declare Python 3.15 support in trove classifiers (#1855) (@doronz88)
- fab3263 docs: document the scoped lazy-imports mode for contributors and library users (#1855) (@doronz88)
- 161ea02 ci: add the Python 3.15 prerelease to the test matrix (#1855) (@doronz88)
- 043e30a cli: adopt PEP 810 lazy imports on Python 3.15+ (no-op on older versions) (#1855) (@doronz88)
Full Changelog: v10.7.4...v10.8.0