fix(deps): make the declared dependency floors installable on every supported interpreter - #185
Merged
Merged
Conversation
asyncpg declares requires-python >=3.9 throughout but ships no cp313 wheel before 0.30 and no cp314/cp314t before 0.31, so `asyncpg>=0.29` resolved to an sdist that cannot build on 3.13 and 3.14 rather than reporting a conflict. The floor was unsatisfiable on half the supported range. Marked rather than raised outright: 0.29 installs fine on 3.11 and 3.12.
Benchmark gate✅ gate passed
Gated (fails the build): |
typing-extensions 4.12.0 is below pydantic's own requirement on 3.13+, so the lowest declared combination dragged pydantic back to a build whose pydantic-core has no cp313 wheel. pydantic itself reaches this package only through faststream, but its floor has to be declared anyway: pydantic-core ships no cp314 wheel before pydantic 2.12. With these the lowest declared combination installs on every supported interpreter. A stale sqlalchemy floor still breaks it at import on 3.13+.
This was referenced Sep 20, 2026
The typing-extensions floor does not install on Python 3.14
modern-python/faststream-redis-timers#88
Closed
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.
Found while validating the proposal in modern-python/.github#107 by hand. Three floors, all of which claimed support this package could not deliver.
Nothing reports any of this today: every gate — PR checks and the daily scheduled check alike — resolves highest, so a floor is never exercised.
1. asyncpg
asyncpg>=0.29was declared once for every interpreter, but this package claims Python 3.11 through 3.14 plus free-threaded 3.14t, and asyncpg's wheel coverage does not stretch that far:Every release declares
requires-python >=3.9, so a resolver asked for the lowest satisfying version does not report a conflict on 3.13 — it picks 0.29.0, falls through to the sdist, and the build fails.Marked rather than raised outright to 0.31, because 0.29 is genuinely fine on 3.11 and 3.12 and there is no reason to cut those users off. This follows how
lite-bootstrapalready handles the same class of problem.2. typing-extensions
>=4.12.0is below what pydantic itself requires on 3.13+ (>=4.12.2), so pinning 4.12.0 dragged pydantic back to a build whosepydantic-core==2.18.4has no cp313 wheel. Raised to>=4.12.2.3. pydantic
pydantic reaches this package only transitively, through
faststream→fast-depends[pydantic], and is not imported here. Its floor still has to be declared, becausepydantic-coreships no cp314 wheel before pydantic 2.12, so the lowest declared combination had no installable pydantic on 3.14 even after fix 2. Marked for the same reason as asyncpg — 2.11 is fine everywhere else."pydantic>=2.12; python_version >= '3.14'",Result
uv pip install --resolution lowest-direct ".[all]", before and after:import faststream_outboxOKimport faststream_outboxOKasyncpg 0.29.0)asyncpg 0.29.0)asyncpg 0.29.0)Every build failure is gone, on every supported interpreter.
At the normal (highest) resolution nothing changes —
uv.lockstill picks asyncpg 0.31.0, pydantic 2.13.5, typing-extensions 4.16.0 — so this is inert for anyone not installing at the lower bound.A fourth floor, not fixed here
The lower-bound install still fails on 3.13+, now at import rather than build:
sqlalchemy[asyncio]>=2.0resolves to 2.0.0, which predates SQLAlchemy's handling of the__static_attributes__and__firstlineno__attributes Python 3.13 added. Bisected on 3.13:2.0.31 also imports cleanly on 3.14, so
sqlalchemy[asyncio]>=2.0.31; python_version >= '3.13'would close it. Left out because this PR was scoped to the three floors above; it is a one-line follow-up.No test
There is nothing to assert in the suite: the defect is that a declared range does not resolve, which only a resolver on a given interpreter can show. A unit test reading a floor back out of
pyproject.tomlwould restate the string, not check it. The tables above are the verification, and modern-python/.github#107 is the job that would make this a standing gate rather than a one-off audit.Verification
just lint-ciclean (eof-fixer,ruff format,ruff check,ty). Full suite against Postgres 17: 624 passed, 100% coverage.