Skip to content

Commit 6dd38ae

Browse files
[PR #11466/d9a4714 backport][3.13] add free-threading CI for Python 3.14 (#11518)
Co-authored-by: Kumar Aditya <[email protected]>
1 parent 3f63083 commit 6dd38ae

File tree

10 files changed

+388
-53
lines changed

10 files changed

+388
-53
lines changed

.github/workflows/ci-cd.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ jobs:
140140
pyver: "3.14"
141141
experimental: true
142142
no-extensions: 'Y'
143+
- os: ubuntu
144+
pyver: "3.14t"
145+
experimental: true
143146
fail-fast: true
144147
runs-on: ${{ matrix.os }}-latest
145148
continue-on-error: ${{ matrix.experimental }}
@@ -170,8 +173,13 @@ jobs:
170173
run: |
171174
python -m pip install -U pip wheel setuptools build twine
172175
- name: Install dependencies
176+
env:
177+
DEPENDENCY_GROUP: test${{ endsWith(matrix.pyver, 't') && '-ft' || '' }}
173178
run: |
174-
python -m pip install -r requirements/test.in -c requirements/test.txt
179+
python -Im pip install -r requirements/${{ env.DEPENDENCY_GROUP }}.in -c requirements/${{ env.DEPENDENCY_GROUP }}.txt
180+
- name: Set PYTHON_GIL=0 for free-threading builds
181+
if: ${{ endsWith(matrix.pyver, 't') }}
182+
run: echo "PYTHON_GIL=0" >> $GITHUB_ENV
175183
- name: Restore llhttp generated files
176184
if: ${{ matrix.no-extensions == '' }}
177185
uses: actions/download-artifact@v5

CHANGES/11466.contrib.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Added free-threading CI job for CPython 3.14 -- by :user:`kumaraditya303`.

requirements/base-ft.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-r runtime-deps.in
2+
3+
gunicorn

requirements/base-ft.txt

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#
2+
# This file is autogenerated by pip-compile with Python 3.10
3+
# by the following command:
4+
#
5+
# pip-compile --allow-unsafe --output-file=requirements/base-ft.txt --strip-extras requirements/base-ft.in
6+
#
7+
aiodns==3.5.0
8+
# via -r requirements/runtime-deps.in
9+
aiohappyeyeballs==2.6.1
10+
# via -r requirements/runtime-deps.in
11+
aiosignal==1.4.0
12+
# via -r requirements/runtime-deps.in
13+
async-timeout==5.0.1 ; python_version < "3.11"
14+
# via -r requirements/runtime-deps.in
15+
brotli==1.1.0 ; platform_python_implementation == "CPython"
16+
# via -r requirements/runtime-deps.in
17+
cffi==2.0.0
18+
# via pycares
19+
frozenlist==1.7.0
20+
# via
21+
# -r requirements/runtime-deps.in
22+
# aiosignal
23+
gunicorn==23.0.0
24+
# via -r requirements/base-ft.in
25+
idna==3.10
26+
# via yarl
27+
multidict==6.6.4
28+
# via
29+
# -r requirements/runtime-deps.in
30+
# yarl
31+
packaging==25.0
32+
# via gunicorn
33+
propcache==0.3.2
34+
# via
35+
# -r requirements/runtime-deps.in
36+
# yarl
37+
pycares==4.11.0
38+
# via aiodns
39+
pycparser==2.23
40+
# via cffi
41+
typing-extensions==4.15.0
42+
# via
43+
# aiosignal
44+
# multidict
45+
yarl==1.20.1
46+
# via -r requirements/runtime-deps.in
47+
zstandard==0.25.0 ; platform_python_implementation == "CPython" and python_version < "3.14"
48+
# via -r requirements/runtime-deps.in

requirements/test-common.in

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
blockbuster
2+
coverage
3+
freezegun
4+
isal; python_version < "3.14" # no wheel for 3.14
5+
mypy; implementation_name == "cpython"
6+
pkgconfig
7+
proxy.py >= 2.4.4rc5
8+
pytest
9+
pytest-cov
10+
pytest-mock
11+
pytest-xdist
12+
pytest_codspeed
13+
python-on-whales
14+
re-assert
15+
setuptools-git
16+
trustme; platform_machine != "i686" # no 32-bit wheels
17+
wait-for-it
18+
zlib_ng

requirements/test-common.txt

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
#
2+
# This file is autogenerated by pip-compile with Python 3.10
3+
# by the following command:
4+
#
5+
# pip-compile --allow-unsafe --output-file=requirements/test-common.txt --strip-extras requirements/test-common.in
6+
#
7+
annotated-types==0.7.0
8+
# via pydantic
9+
blockbuster==1.5.25
10+
# via -r requirements/test-common.in
11+
cffi==2.0.0
12+
# via
13+
# cryptography
14+
# pytest-codspeed
15+
click==8.2.1
16+
# via wait-for-it
17+
coverage==7.10.6
18+
# via
19+
# -r requirements/test-common.in
20+
# pytest-cov
21+
cryptography==46.0.1
22+
# via trustme
23+
exceptiongroup==1.3.0
24+
# via pytest
25+
execnet==2.1.1
26+
# via pytest-xdist
27+
forbiddenfruit==0.1.4
28+
# via blockbuster
29+
freezegun==1.5.5
30+
# via -r requirements/test-common.in
31+
idna==3.10
32+
# via trustme
33+
iniconfig==2.1.0
34+
# via pytest
35+
isal==1.8.0 ; python_version < "3.14"
36+
# via -r requirements/test-common.in
37+
markdown-it-py==4.0.0
38+
# via rich
39+
mdurl==0.1.2
40+
# via markdown-it-py
41+
mypy==1.18.1 ; implementation_name == "cpython"
42+
# via -r requirements/test-common.in
43+
mypy-extensions==1.1.0
44+
# via mypy
45+
packaging==25.0
46+
# via pytest
47+
pathspec==0.12.1
48+
# via mypy
49+
pkgconfig==1.5.5
50+
# via -r requirements/test-common.in
51+
pluggy==1.6.0
52+
# via
53+
# pytest
54+
# pytest-cov
55+
proxy-py==2.4.10
56+
# via -r requirements/test-common.in
57+
pycparser==2.23
58+
# via cffi
59+
pydantic==2.12.0a1
60+
# via python-on-whales
61+
pydantic-core==2.37.2
62+
# via pydantic
63+
pygments==2.19.2
64+
# via
65+
# pytest
66+
# rich
67+
pytest==8.4.2
68+
# via
69+
# -r requirements/test-common.in
70+
# pytest-codspeed
71+
# pytest-cov
72+
# pytest-mock
73+
# pytest-xdist
74+
pytest-codspeed==4.0.0
75+
# via -r requirements/test-common.in
76+
pytest-cov==7.0.0
77+
# via -r requirements/test-common.in
78+
pytest-mock==3.15.1
79+
# via -r requirements/test-common.in
80+
pytest-xdist==3.8.0
81+
# via -r requirements/test-common.in
82+
python-dateutil==2.9.0.post0
83+
# via freezegun
84+
python-on-whales==0.78.0
85+
# via -r requirements/test-common.in
86+
re-assert==1.1.0
87+
# via -r requirements/test-common.in
88+
regex==2025.9.1
89+
# via re-assert
90+
rich==14.1.0
91+
# via pytest-codspeed
92+
setuptools-git==1.2
93+
# via -r requirements/test-common.in
94+
six==1.17.0
95+
# via python-dateutil
96+
tomli==2.2.1
97+
# via
98+
# coverage
99+
# mypy
100+
# pytest
101+
trustme==1.2.1 ; platform_machine != "i686"
102+
# via -r requirements/test-common.in
103+
typing-extensions==4.15.0
104+
# via
105+
# cryptography
106+
# exceptiongroup
107+
# mypy
108+
# pydantic
109+
# pydantic-core
110+
# python-on-whales
111+
# typing-inspection
112+
typing-inspection==0.4.1
113+
# via pydantic
114+
wait-for-it==2.3.0
115+
# via -r requirements/test-common.in
116+
zlib-ng==1.0.0
117+
# via -r requirements/test-common.in

requirements/test-ft.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-r base-ft.in
2+
-r test-common.in

requirements/test-ft.txt

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
#
2+
# This file is autogenerated by pip-compile with Python 3.10
3+
# by the following command:
4+
#
5+
# pip-compile --allow-unsafe --output-file=requirements/test-ft.txt --strip-extras requirements/test-ft.in
6+
#
7+
aiodns==3.5.0
8+
# via -r /Users/bdraco/aiohttp/requirements/runtime-deps.in
9+
aiohappyeyeballs==2.6.1
10+
# via -r /Users/bdraco/aiohttp/requirements/runtime-deps.in
11+
aiosignal==1.4.0
12+
# via -r /Users/bdraco/aiohttp/requirements/runtime-deps.in
13+
annotated-types==0.7.0
14+
# via pydantic
15+
async-timeout==5.0.1 ; python_version < "3.11"
16+
# via -r /Users/bdraco/aiohttp/requirements/runtime-deps.in
17+
attrs==25.3.0
18+
# via -r /Users/bdraco/aiohttp/requirements/runtime-deps.in
19+
blockbuster==1.5.25
20+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
21+
brotli==1.1.0 ; platform_python_implementation == "CPython"
22+
# via -r /Users/bdraco/aiohttp/requirements/runtime-deps.in
23+
cffi==2.0.0
24+
# via
25+
# cryptography
26+
# pycares
27+
# pytest-codspeed
28+
click==8.2.1
29+
# via wait-for-it
30+
coverage==7.10.6
31+
# via
32+
# -r /Users/bdraco/aiohttp/requirements/test-common.in
33+
# pytest-cov
34+
cryptography==46.0.1
35+
# via trustme
36+
exceptiongroup==1.3.0
37+
# via pytest
38+
execnet==2.1.1
39+
# via pytest-xdist
40+
forbiddenfruit==0.1.4
41+
# via blockbuster
42+
freezegun==1.5.5
43+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
44+
frozenlist==1.7.0
45+
# via
46+
# -r /Users/bdraco/aiohttp/requirements/runtime-deps.in
47+
# aiosignal
48+
gunicorn==23.0.0
49+
# via -r /Users/bdraco/aiohttp/requirements/base-ft.in
50+
idna==3.10
51+
# via
52+
# trustme
53+
# yarl
54+
iniconfig==2.1.0
55+
# via pytest
56+
isal==1.8.0 ; python_version < "3.14"
57+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
58+
markdown-it-py==4.0.0
59+
# via rich
60+
mdurl==0.1.2
61+
# via markdown-it-py
62+
multidict==6.6.4
63+
# via
64+
# -r /Users/bdraco/aiohttp/requirements/runtime-deps.in
65+
# yarl
66+
mypy==1.18.1 ; implementation_name == "cpython"
67+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
68+
mypy-extensions==1.1.0
69+
# via mypy
70+
packaging==25.0
71+
# via
72+
# gunicorn
73+
# pytest
74+
pathspec==0.12.1
75+
# via mypy
76+
pkgconfig==1.5.5
77+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
78+
pluggy==1.6.0
79+
# via
80+
# pytest
81+
# pytest-cov
82+
propcache==0.3.2
83+
# via
84+
# -r /Users/bdraco/aiohttp/requirements/runtime-deps.in
85+
# yarl
86+
proxy-py==2.4.10
87+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
88+
pycares==4.11.0
89+
# via aiodns
90+
pycparser==2.23
91+
# via cffi
92+
pydantic==2.12.0a1
93+
# via python-on-whales
94+
pydantic-core==2.37.2
95+
# via pydantic
96+
pygments==2.19.2
97+
# via
98+
# pytest
99+
# rich
100+
pytest==8.4.2
101+
# via
102+
# -r /Users/bdraco/aiohttp/requirements/test-common.in
103+
# pytest-codspeed
104+
# pytest-cov
105+
# pytest-mock
106+
# pytest-xdist
107+
pytest-codspeed==4.0.0
108+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
109+
pytest-cov==7.0.0
110+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
111+
pytest-mock==3.15.1
112+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
113+
pytest-xdist==3.8.0
114+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
115+
python-dateutil==2.9.0.post0
116+
# via freezegun
117+
python-on-whales==0.78.0
118+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
119+
re-assert==1.1.0
120+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
121+
regex==2025.9.1
122+
# via re-assert
123+
rich==14.1.0
124+
# via pytest-codspeed
125+
setuptools-git==1.2
126+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
127+
six==1.17.0
128+
# via python-dateutil
129+
tomli==2.2.1
130+
# via
131+
# coverage
132+
# mypy
133+
# pytest
134+
trustme==1.2.1 ; platform_machine != "i686"
135+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
136+
typing-extensions==4.15.0
137+
# via
138+
# aiosignal
139+
# cryptography
140+
# exceptiongroup
141+
# multidict
142+
# mypy
143+
# pydantic
144+
# pydantic-core
145+
# python-on-whales
146+
# typing-inspection
147+
typing-inspection==0.4.1
148+
# via pydantic
149+
wait-for-it==2.3.0
150+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
151+
yarl==1.20.1
152+
# via -r /Users/bdraco/aiohttp/requirements/runtime-deps.in
153+
zlib-ng==1.0.0
154+
# via -r /Users/bdraco/aiohttp/requirements/test-common.in
155+
zstandard==0.25.0 ; platform_python_implementation == "CPython" and python_version < "3.14"
156+
# via -r /Users/bdraco/aiohttp/requirements/runtime-deps.in

requirements/test.in

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,2 @@
11
-r base.in
2-
3-
blockbuster
4-
coverage
5-
freezegun
6-
isal; python_version < "3.14" # no wheel for 3.14
7-
mypy; implementation_name == "cpython"
8-
pkgconfig
9-
proxy.py >= 2.4.4rc5
10-
pytest
11-
pytest-cov
12-
pytest-mock
13-
pytest-xdist
14-
pytest_codspeed
15-
python-on-whales
16-
re-assert
17-
setuptools-git
18-
trustme; platform_machine != "i686" # no 32-bit wheels
19-
wait-for-it
20-
zlib_ng
2+
-r test-common.in

0 commit comments

Comments
 (0)