Skip to content

Commit 2007067

Browse files
committed
ci: resolve the declared dependency floors on every matrix entry
1 parent de79625 commit 2007067

2 files changed

Lines changed: 47 additions & 10 deletions

File tree

‎.github/workflows/_checks.yml‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,38 @@ jobs:
5959
- run: just install
6060
- run: uv run --no-sync python -c "import sys; assert not sys._is_gil_enabled(), 'GIL is enabled'"
6161
- run: just test-ci
62+
floors:
63+
# Every other job resolves newest, so the declared floors are a claim nothing installs.
64+
# This one resolves the bottom of each range, on every matrix entry: wheel coverage is
65+
# per interpreter, so two interpreters resolving the same versions can still disagree
66+
# on whether those versions install.
67+
runs-on: ubuntu-latest
68+
strategy:
69+
fail-fast: false
70+
matrix:
71+
python-version:
72+
- "3.11"
73+
- "3.12"
74+
- "3.13"
75+
- "3.14"
76+
- "3.14t"
77+
steps:
78+
- uses: actions/checkout@v6
79+
- uses: astral-sh/setup-uv@v8.2.0
80+
with:
81+
enable-cache: true
82+
cache-dependency-glob: "**/pyproject.toml"
83+
- run: uv python install ${{ matrix.python-version }}
84+
- run: uv python pin ${{ matrix.python-version }}
85+
# --no-build so a floor with no wheel for this interpreter fails here instead of
86+
# quietly compiling its sdist; --no-install-project because that flag would refuse to
87+
# build this project too, and the tests import it from the checkout.
88+
- run: uv sync --all-extras --no-install-project --resolution lowest-direct --no-build
89+
- run: uv run --no-sync pytest
90+
env:
91+
# The isolation tests spawn a fresh interpreter, which does not inherit pytest's sys.path.
92+
PYTHONPATH: src
93+
6294
links:
6395
runs-on: ubuntu-latest
6496
steps:

‎pyproject.toml‎

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,18 @@ dependencies = [
3939

4040
[project.optional-dependencies]
4141
pydantic = [
42-
"pydantic>=2.0,<3.0; python_version < '3.14'",
43-
# pydantic-core ships no cp314 wheel before pydantic 2.12.
42+
# pydantic-core ships no cp312 wheel before pydantic 2.1, no cp313 wheel before 2.8.1 and no
43+
# cp314 wheel before 2.12.
44+
"pydantic>=2.0,<3.0; python_version < '3.12'",
45+
"pydantic>=2.1,<3.0; python_version == '3.12'",
46+
"pydantic>=2.8.1,<3.0; python_version == '3.13'",
4447
"pydantic>=2.12,<3.0; python_version >= '3.14'",
4548
]
4649
msgspec = [
4750
# 0.18.5 is the first release whose can_decode agrees with decode on Annotated types;
48-
# 0.20 is the first with a cp314 wheel.
49-
"msgspec>=0.18.5; python_version < '3.14'",
51+
# 0.19 is the first with a cp313 wheel and 0.20 the first with a cp314 one.
52+
"msgspec>=0.18.5; python_version < '3.13'",
53+
"msgspec>=0.19; python_version == '3.13'",
5054
"msgspec>=0.20; python_version >= '3.14'",
5155
]
5256
otel = ["opentelemetry-api>=1.20"]
@@ -68,13 +72,14 @@ module-name = "httpware"
6872
module-root = "src"
6973

7074
[dependency-groups]
75+
# Floored so `uv sync --resolution lowest-direct` resolves a usable harness, not each name's first release.
7176
dev = [
72-
"pytest",
73-
"pytest-cov",
74-
"pytest-asyncio",
75-
"pytest-repeat",
76-
"pytest-benchmark",
77-
"hypothesis",
77+
"pytest>=8",
78+
"pytest-cov>=5",
79+
"pytest-asyncio>=0.24",
80+
"pytest-repeat>=0.9",
81+
"pytest-benchmark>=4",
82+
"hypothesis>=6.20",
7883
]
7984
lint = [
8085
"ruff",

0 commit comments

Comments
 (0)