ci: resolve the declared dependency floors on every matrix entry - #56
Merged
Merged
Conversation
This was referenced Sep 20, 2026
Open
Open
ci: resolve the declared dependency floors on every matrix entry
modern-python/modern-di-litestar#57
Open
Open
Open
Open
Open
Open
Open
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.
Adds the
floorsjob the standard now requires(.github#109). This is the pilot for the
sweep: the other 11
modern-di-*repos share this_checks.ymlalmost line for line, so whatevershape survives review here gets copied.
What it does
Resolves
fastapi>=0.100andmodern-di>=3at their floors, wheel-only, on all six matrixentries, then runs the suite. Nothing else in CI installs those versions:
just installrunsuv lock --upgrade, sopytestandscheduled.ymlboth resolve newest on every run.Result
The floors are honest. All 17 tests pass at the bottom of both ranges on 3.10 through 3.14 and
3.14t, against
fastapi==0.100.0,modern-di==3.0.0,starlette==0.27.0. No floor neededraising, and
3.14tstays in the matrix rather than being dropped the waycompose2poddrops it.I measured all six locally before writing the job.
Two things the job needs, and why
The dev group is floored. It was four unbounded names, which
--resolution lowest-directresolves to each package's first-ever release:
pytest==2.7.1,pytest-asyncio==0.1,pytest-cov==2.0.0. That is not a harness. The floors are the real minimums:pytest-asyncio>=0.24is where
asyncio_default_fixture_loop_scopearrives, which this repo sets.The job installs
httpx<0.28.fastapi>=0.100pullsstarlette==0.27.0, whoseTestClientimports
httpx; current starlette importshttpx2, which is what the dev group declares, so atthe floors nothing provides the module starlette wants. Pinning below 0.28 as well because httpx
0.28 removed the
app=shortcut that starlette 0.27 passes it. Deliberately a job step rather thana dev-group entry: it is an artifact of resolving low, not something the project depends on.
Choices worth a second opinion, since 11 repos inherit them
uv, notjust. Section 2 says CI calls only the fixed recipe names. I read that asgoverning which recipes exist, not as banning a job that uses none, which is what
faststream-outboxalready does. The alternative is atest-floorsrecipe in every justfile,which is a bigger commitment than the standard asks for.
--no-install-projectis not optional. Without it--no-buildrefuses to build this projectitself and the sync fails outright. The tests import the package from the checkout instead.
addoptsis empty here, so a barepytestmeasures nothing; the 100% gaterides
test-cion the resolved-newest leg.Verification
Six interpreters at the floors: 17 passed each. At newest, unchanged:
just lint-ciclean,just test-ci17 passed at 100% coverage.