diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 7efa2196cb5..8152946c902 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -156,6 +156,9 @@ jobs: pyver: "3.14" experimental: true no-extensions: 'Y' + - os: ubuntu + pyver: "3.14t" + experimental: true fail-fast: true runs-on: ${{ matrix.os }}-latest continue-on-error: ${{ matrix.experimental }} @@ -186,8 +189,13 @@ jobs: run: | python -m pip install -U pip wheel setuptools build twine - name: Install dependencies + env: + DEPENDENCY_GROUP: test${{ endsWith(matrix.pyver, 't') && '-ft' || '' }} run: | - python -m pip install -r requirements/test.in -c requirements/test.txt + python -Im pip install -r requirements/${{ env.DEPENDENCY_GROUP }}.in -c requirements/${{ env.DEPENDENCY_GROUP }}.txt + - name: Set PYTHON_GIL=0 for free-threading builds + if: ${{ endsWith(matrix.pyver, 't') }} + run: echo "PYTHON_GIL=0" >> $GITHUB_ENV - name: Restore llhttp generated files if: ${{ matrix.no-extensions == '' }} uses: actions/download-artifact@v5 diff --git a/CHANGES/11466.contrib.rst b/CHANGES/11466.contrib.rst new file mode 100644 index 00000000000..07c5f40c82e --- /dev/null +++ b/CHANGES/11466.contrib.rst @@ -0,0 +1 @@ +Added free-threading CI job for CPython 3.14 -- by :user:`kumaraditya303`. diff --git a/requirements/base-ft.in b/requirements/base-ft.in new file mode 100644 index 00000000000..2b0cbf7d0c2 --- /dev/null +++ b/requirements/base-ft.in @@ -0,0 +1,3 @@ +-r runtime-deps.in + +gunicorn diff --git a/requirements/base-ft.txt b/requirements/base-ft.txt new file mode 100644 index 00000000000..15c562571be --- /dev/null +++ b/requirements/base-ft.txt @@ -0,0 +1,48 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --output-file=requirements/base-ft.txt --strip-extras requirements/base-ft.in +# +aiodns==3.5.0 + # via -r requirements/runtime-deps.in +aiohappyeyeballs==2.6.1 + # via -r requirements/runtime-deps.in +aiosignal==1.4.0 + # via -r requirements/runtime-deps.in +async-timeout==5.0.1 ; python_version < "3.11" + # via -r requirements/runtime-deps.in +brotli==1.1.0 ; platform_python_implementation == "CPython" + # via -r requirements/runtime-deps.in +cffi==2.0.0 + # via pycares +frozenlist==1.7.0 + # via + # -r requirements/runtime-deps.in + # aiosignal +gunicorn==23.0.0 + # via -r requirements/base-ft.in +idna==3.10 + # via yarl +multidict==6.6.4 + # via + # -r requirements/runtime-deps.in + # yarl +packaging==25.0 + # via gunicorn +propcache==0.3.2 + # via + # -r requirements/runtime-deps.in + # yarl +pycares==4.11.0 + # via aiodns +pycparser==2.23 + # via cffi +typing-extensions==4.15.0 + # via + # aiosignal + # multidict +yarl==1.20.1 + # via -r requirements/runtime-deps.in +zstandard==0.25.0 ; platform_python_implementation == "CPython" and python_version < "3.14" + # via -r requirements/runtime-deps.in diff --git a/requirements/test-common.in b/requirements/test-common.in new file mode 100644 index 00000000000..c010f61fa8a --- /dev/null +++ b/requirements/test-common.in @@ -0,0 +1,17 @@ +blockbuster +coverage +freezegun +isal; python_version < "3.14" # no wheel for 3.14 +mypy; implementation_name == "cpython" +pkgconfig +proxy.py >= 2.4.4rc5 +pytest +pytest-cov +pytest-mock +pytest-xdist +pytest_codspeed +python-on-whales +setuptools-git +trustme; platform_machine != "i686" # no 32-bit wheels +wait-for-it +zlib_ng diff --git a/requirements/test-common.txt b/requirements/test-common.txt new file mode 100644 index 00000000000..1084e634ddd --- /dev/null +++ b/requirements/test-common.txt @@ -0,0 +1,113 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --output-file=requirements/test-common.txt --strip-extras requirements/test-common.in +# +annotated-types==0.7.0 + # via pydantic +blockbuster==1.5.25 + # via -r requirements/test-common.in +cffi==2.0.0 + # via + # cryptography + # pytest-codspeed +click==8.2.1 + # via wait-for-it +coverage==7.10.6 + # via + # -r requirements/test-common.in + # pytest-cov +cryptography==46.0.1 + # via trustme +exceptiongroup==1.3.0 + # via pytest +execnet==2.1.1 + # via pytest-xdist +forbiddenfruit==0.1.4 + # via blockbuster +freezegun==1.5.5 + # via -r requirements/test-common.in +idna==3.10 + # via trustme +iniconfig==2.1.0 + # via pytest +isal==1.8.0 ; python_version < "3.14" + # via -r requirements/test-common.in +markdown-it-py==4.0.0 + # via rich +mdurl==0.1.2 + # via markdown-it-py +mypy==1.18.1 ; implementation_name == "cpython" + # via -r requirements/test-common.in +mypy-extensions==1.1.0 + # via mypy +packaging==25.0 + # via pytest +pathspec==0.12.1 + # via mypy +pkgconfig==1.5.5 + # via -r requirements/test-common.in +pluggy==1.6.0 + # via + # pytest + # pytest-cov +proxy-py==2.4.10 + # via -r requirements/test-common.in +pycparser==2.23 + # via cffi +pydantic==2.12.0a1 + # via python-on-whales +pydantic-core==2.37.2 + # via pydantic +pygments==2.19.2 + # via + # pytest + # rich +pytest==8.4.2 + # via + # -r requirements/test-common.in + # pytest-codspeed + # pytest-cov + # pytest-mock + # pytest-xdist +pytest-codspeed==4.0.0 + # via -r requirements/test-common.in +pytest-cov==7.0.0 + # via -r requirements/test-common.in +pytest-mock==3.15.1 + # via -r requirements/test-common.in +pytest-xdist==3.8.0 + # via -r requirements/test-common.in +python-dateutil==2.9.0.post0 + # via freezegun +python-on-whales==0.78.0 + # via -r requirements/test-common.in +rich==14.1.0 + # via pytest-codspeed +setuptools-git==1.2 + # via -r requirements/test-common.in +six==1.17.0 + # via python-dateutil +tomli==2.2.1 + # via + # coverage + # mypy + # pytest +trustme==1.2.1 ; platform_machine != "i686" + # via -r requirements/test-common.in +typing-extensions==4.15.0 + # via + # cryptography + # exceptiongroup + # mypy + # pydantic + # pydantic-core + # python-on-whales + # typing-inspection +typing-inspection==0.4.1 + # via pydantic +wait-for-it==2.3.0 + # via -r requirements/test-common.in +zlib-ng==1.0.0 + # via -r requirements/test-common.in diff --git a/requirements/test-ft.in b/requirements/test-ft.in new file mode 100644 index 00000000000..b85406e5d7b --- /dev/null +++ b/requirements/test-ft.in @@ -0,0 +1,2 @@ +-r base-ft.in +-r test-common.in diff --git a/requirements/test-ft.txt b/requirements/test-ft.txt new file mode 100644 index 00000000000..fd522842db9 --- /dev/null +++ b/requirements/test-ft.txt @@ -0,0 +1,150 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --output-file=requirements/test-ft.txt --strip-extras requirements/test-ft.in +# +aiodns==3.5.0 + # via -r requirements/runtime-deps.in +aiohappyeyeballs==2.6.1 + # via -r requirements/runtime-deps.in +aiosignal==1.4.0 + # via -r requirements/runtime-deps.in +annotated-types==0.7.0 + # via pydantic +async-timeout==5.0.1 ; python_version < "3.11" + # via -r requirements/runtime-deps.in +blockbuster==1.5.25 + # via -r requirements/test-common.in +brotli==1.1.0 ; platform_python_implementation == "CPython" + # via -r requirements/runtime-deps.in +cffi==2.0.0 + # via + # cryptography + # pycares + # pytest-codspeed +click==8.2.1 + # via wait-for-it +coverage==7.10.6 + # via + # -r requirements/test-common.in + # pytest-cov +cryptography==46.0.1 + # via trustme +exceptiongroup==1.3.0 + # via pytest +execnet==2.1.1 + # via pytest-xdist +forbiddenfruit==0.1.4 + # via blockbuster +freezegun==1.5.5 + # via -r requirements/test-common.in +frozenlist==1.7.0 + # via + # -r requirements/runtime-deps.in + # aiosignal +gunicorn==23.0.0 + # via -r requirements/base-ft.in +idna==3.10 + # via + # trustme + # yarl +iniconfig==2.1.0 + # via pytest +isal==1.8.0 ; python_version < "3.14" + # via -r requirements/test-common.in +markdown-it-py==4.0.0 + # via rich +mdurl==0.1.2 + # via markdown-it-py +multidict==6.6.4 + # via + # -r requirements/runtime-deps.in + # yarl +mypy==1.18.1 ; implementation_name == "cpython" + # via -r requirements/test-common.in +mypy-extensions==1.1.0 + # via mypy +packaging==25.0 + # via + # gunicorn + # pytest +pathspec==0.12.1 + # via mypy +pkgconfig==1.5.5 + # via -r requirements/test-common.in +pluggy==1.6.0 + # via + # pytest + # pytest-cov +propcache==0.3.2 + # via + # -r requirements/runtime-deps.in + # yarl +proxy-py==2.4.10 + # via -r requirements/test-common.in +pycares==4.11.0 + # via aiodns +pycparser==2.23 + # via cffi +pydantic==2.12.0a1 + # via python-on-whales +pydantic-core==2.37.2 + # via pydantic +pygments==2.19.2 + # via + # pytest + # rich +pytest==8.4.2 + # via + # -r requirements/test-common.in + # pytest-codspeed + # pytest-cov + # pytest-mock + # pytest-xdist +pytest-codspeed==4.0.0 + # via -r requirements/test-common.in +pytest-cov==7.0.0 + # via -r requirements/test-common.in +pytest-mock==3.15.1 + # via -r requirements/test-common.in +pytest-xdist==3.8.0 + # via -r requirements/test-common.in +python-dateutil==2.9.0.post0 + # via freezegun +python-on-whales==0.78.0 + # via -r requirements/test-common.in +rich==14.1.0 + # via pytest-codspeed +setuptools-git==1.2 + # via -r requirements/test-common.in +six==1.17.0 + # via python-dateutil +tomli==2.2.1 + # via + # coverage + # mypy + # pytest +trustme==1.2.1 ; platform_machine != "i686" + # via -r requirements/test-common.in +typing-extensions==4.15.0 + # via + # aiosignal + # cryptography + # exceptiongroup + # multidict + # mypy + # pydantic + # pydantic-core + # python-on-whales + # typing-inspection +typing-inspection==0.4.1 + # via pydantic +wait-for-it==2.3.0 + # via -r requirements/test-common.in +yarl==1.20.1 + # via -r requirements/runtime-deps.in +zlib-ng==1.0.0 + # via -r requirements/test-common.in +zstandard==0.25.0 ; platform_python_implementation == "CPython" and python_version < "3.14" + # via -r requirements/runtime-deps.in diff --git a/requirements/test.in b/requirements/test.in index d6274f6d80d..d37efd6b841 100644 --- a/requirements/test.in +++ b/requirements/test.in @@ -1,19 +1,2 @@ -r base.in - -blockbuster -coverage -freezegun -isal; python_version < "3.14" # no wheel for 3.14 -mypy; implementation_name == "cpython" -pkgconfig -proxy.py >= 2.4.4rc5 -pytest -pytest-cov -pytest-mock -pytest-xdist -pytest_codspeed -python-on-whales -setuptools-git -trustme; platform_machine != "i686" # no 32-bit wheels -wait-for-it -zlib_ng +-r test-common.in diff --git a/requirements/test.txt b/requirements/test.txt index ed78feb01d6..9f11c47e5cc 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -87,9 +87,9 @@ pycares==4.11.0 # via aiodns pycparser==2.23 # via cffi -pydantic==2.11.9 +pydantic==2.12.0a1 # via python-on-whales -pydantic-core==2.33.2 +pydantic-core==2.37.2 # via pydantic pygments==2.19.2 # via