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/.pre-commit-config.yaml b/.pre-commit-config.yaml index aac59671aa3..c0a59104b35 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -48,7 +48,7 @@ repos: entry: ./tools/check_changes.py pass_filenames: false - repo: https://github.com/pre-commit/pre-commit-hooks - rev: 'v5.0.0' + rev: 'v6.0.0' hooks: - id: check-merge-conflict - repo: https://github.com/asottile/yesqa @@ -69,7 +69,7 @@ repos: - id: black language_version: python3 # Should be a command that runs python - repo: https://github.com/pre-commit/pre-commit-hooks - rev: 'v5.0.0' + rev: 'v6.0.0' hooks: - id: end-of-file-fixer exclude: >- @@ -94,8 +94,6 @@ repos: - id: check-added-large-files - id: check-symlinks - id: fix-byte-order-marker - - id: fix-encoding-pragma - args: ['--remove'] - id: detect-aws-credentials args: ['--allow-missing-credentials'] - id: detect-private-key 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/constraints.txt b/requirements/constraints.txt index 083f171a576..593b9246fd2 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -56,7 +56,7 @@ coverage==7.10.6 # via # -r requirements/test.in # pytest-cov -cryptography==45.0.7 +cryptography==46.0.1 # via # pyjwt # trustme @@ -190,7 +190,7 @@ pytest-codspeed==4.0.0 # -r requirements/test.in pytest-cov==7.0.0 # via -r requirements/test.in -pytest-mock==3.15.0 +pytest-mock==3.15.1 # via # -r requirements/lint.in # -r requirements/test.in @@ -266,6 +266,7 @@ trustme==1.2.1 ; platform_machine != "i686" typing-extensions==4.15.0 # via # aiosignal + # cryptography # exceptiongroup # multidict # mypy diff --git a/requirements/dev.txt b/requirements/dev.txt index 060d2ca4d60..1c347fc1fb6 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -56,7 +56,7 @@ coverage==7.10.6 # via # -r requirements/test.in # pytest-cov -cryptography==45.0.7 +cryptography==46.0.1 # via # pyjwt # trustme @@ -185,7 +185,7 @@ pytest-codspeed==4.0.0 # -r requirements/test.in pytest-cov==7.0.0 # via -r requirements/test.in -pytest-mock==3.15.0 +pytest-mock==3.15.1 # via # -r requirements/lint.in # -r requirements/test.in @@ -257,6 +257,7 @@ trustme==1.2.1 ; platform_machine != "i686" typing-extensions==4.15.0 # via # aiosignal + # cryptography # exceptiongroup # multidict # mypy diff --git a/requirements/lint.txt b/requirements/lint.txt index 0b8fc4b2ec0..1e616119569 100644 --- a/requirements/lint.txt +++ b/requirements/lint.txt @@ -21,7 +21,7 @@ cfgv==3.4.0 # via pre-commit click==8.1.8 # via slotscheck -cryptography==45.0.7 +cryptography==46.0.1 # via trustme distlib==0.4.0 # via virtualenv @@ -82,7 +82,7 @@ pytest==8.4.2 # pytest-mock pytest-codspeed==4.0.0 # via -r requirements/lint.in -pytest-mock==3.15.0 +pytest-mock==3.15.1 # via -r requirements/lint.in python-dateutil==2.9.0.post0 # via freezegun @@ -105,6 +105,7 @@ trustme==1.2.1 # via -r requirements/lint.in typing-extensions==4.15.0 # via + # cryptography # exceptiongroup # mypy # pydantic 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 e35299832e2..9f11c47e5cc 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -29,7 +29,7 @@ coverage==7.10.6 # via # -r requirements/test.in # pytest-cov -cryptography==45.0.7 +cryptography==46.0.1 # via trustme exceptiongroup==1.3.0 # via pytest @@ -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 @@ -106,7 +106,7 @@ pytest-codspeed==4.0.0 # via -r requirements/test.in pytest-cov==7.0.0 # via -r requirements/test.in -pytest-mock==3.15.0 +pytest-mock==3.15.1 # via -r requirements/test.in pytest-xdist==3.8.0 # via -r requirements/test.in @@ -130,6 +130,7 @@ trustme==1.2.1 ; platform_machine != "i686" typing-extensions==4.15.0 # via # aiosignal + # cryptography # exceptiongroup # multidict # mypy