Require Python 3.10 and test through 3.14 - #141
Merged
Conversation
Python 3.8 reached end of life in October 2024 and 3.9 on 2025-10-31, so neither is a supported target. Because requires-python still admitted 3.8, uv had to resolve the whole dependency tree down to versions compatible with it, which is why uv.lock pinned packages old enough to carry security advisories. Raising the floor to 3.10 removes the abandoned pycrypto package (#139). uv selected it only for Python 3.9 and below, where cryptography 50.0.0 cannot be installed and secretstorage fell back to 2.2.1, a 2016 release that depends on pycrypto rather than cryptography. It also drops the unpatched wheel pin. Collapsing the duplicate old-Python resolution branches removes about 900 lines from the lockfile. Adds 3.14 to the test matrix. The suite passes on 3.10 and 3.14. Ruff's target-version moves to py310 to match. That surfaces about 530 new pyupgrade findings for annotations that no longer need to be 3.8 compatible; those are tracked separately rather than mixed into this change. Closes #139 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GypKU5KdLfs2Cf8kS2TzJa
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.
Raises the minimum supported Python to 3.10 and adds 3.14 to the test matrix.
Closes #139.
Why
Python 3.8 reached end of life in October 2024 and 3.9 on 2025-10-31, so neither is a supported target. Because
requires-pythonstill admitted 3.8, uv had to resolve the entire dependency tree down to versions that support it. That is the root cause of the stale pins inuv.lock, and of most of the repository's open Dependabot alerts.The clearest symptom was #139. On Python 3.9 and below,
cryptography50.0.0 cannot be installed, so uv resolvedsecretstorageback to 2.2.1 — a 2016 release whose dependency ispycryptorather thancryptographyandjeepney.pycryptohas been abandoned since 2014 and carries a critical and a high advisory with no patched version available. Raising the floor removes that path entirely.What changes
requires-pythonbecomes>=3.10; the 3.8 and 3.9 classifiers are dropped and a 3.14 classifier added.["3.10", "3.11", "3.12", "3.13", "3.14"].uv.lockis regenerated. Collapsing the duplicate old-Python resolution branches removes about 900 lines, and bothpycryptoand an unpatchedwheelpin disappear because their paths are no longer reachable.CLAUDE.md's two references to 3.8 compatibility are updated.target-versionmoves topy310to matchrequires-python.Other pins are deliberately left alone. This is
uv lock, notuv lock --upgrade, so the only packages that moved are those the floor change forced. The remaining advisories stay for Dependabot to raise individually, which is what it is doing — #116 is the current one.On the ruff change
Setting
target-version = "py310"surfaces about 530 new pyupgrade findings, taking the total from 207 to 736. They are all annotation modernizations that were previously blocked by 3.8 compatibility:typing.Listtolist,Optional[X]toX | None, and similar. Every one is a suggestion rather than a defect, and ruff does not gate CI —pythonpackage.ymlrunsflake8 --select=E9,F63,F7,F82, which is clean.Applying them is a mechanical change across most of the package, so it is tracked in #140 rather than folded in here, which would have buried a small configuration diff in several hundred edits. #140 also notes that
typing_extensionsbecomes removable and that thesys.version_info < 3.7guards are unreachable.Verification
pycryptono longer appears inuv.lock; every runtime dependency still resolves.flake8 graphtage test --select=E9,F63,F7,F82clean.cd docs && make htmlsucceeds.One note on 3.14. Earlier work in this repository hit a
ficklingfailure on a Python 3.14 free-threaded build, which was a concern for adding it to CI. It does not reproduce here:actions/setup-pythonprovides the GIL build rather than3.14t, and CI installs the currentfickling(0.1.12) rather than the 0.1.3 thatuv.lockused to pin. The full suite passes.uv.lockwas regenerated in an environment that setsuv'sexclude-newerto 2026-09-01, so a small number of pins may lag the newest releases by about a week. The injected[options]block was removed from the committed file. Re-runninguv lockelsewhere is harmless if you want the difference closed.🤖 Generated with Claude Code
https://claude.ai/code/session_01GypKU5KdLfs2Cf8kS2TzJa