From fdb1b8b4833fe0fa850de6f027cdee707f5a75ba Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 16 Sep 2026 16:28:47 +0000 Subject: [PATCH 1/8] MAINT add Python 3.15 support Declare 3.14 and 3.15 in package classifiers and add dedicated pip CI jobs so 3.15 stays covered once a newer Python becomes conda-forge's latest. No library code changes were required. Co-authored-by: Olivier Grisel --- .github/workflows/test.yml | 14 ++++++++++++++ CHANGES.md | 3 +++ pyproject.toml | 2 ++ 3 files changed, 19 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a77b1c5f..52bf4383 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -71,6 +71,12 @@ jobs: PYTHON_VERSION: "3.10" PACKAGER: "pip" INSTALL_OPENCV: "true" + # Windows + Python 3.15 from conda-forge, numpy / scipy from PyPI. + - name: py315_pip + os: windows-latest + PYTHON_VERSION: "3.15" + PACKAGER: "pip" + INSTALL_OPENCV: "true" # MacOS env with OpenMP installed through homebrew - name: py39_conda_homebrew_libomp @@ -164,6 +170,14 @@ jobs: PYTHON_VERSION: "3.11" CC_OUTER_LOOP: "gcc" CC_INNER_LOOP: "clang-18" + # Linux + Python 3.15 with numpy / scipy installed with pip from PyPI. + - name: py315_pip + os: ubuntu-latest + PACKAGER: "pip" + PYTHON_VERSION: "3.15" + CC_OUTER_LOOP: "gcc" + CC_INNER_LOOP: "gcc" + INSTALL_OPENCV: "true" # Linux environment with numpy from conda-forge channel and openblas-openmp - name: pylatest_conda_forge os: ubuntu-latest diff --git a/CHANGES.md b/CHANGES.md index 2529e3bc..d7a4bb27 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,9 @@ quite a bit of overhead. https://github.com/joblib/threadpoolctl/pull/250 +- Added official support for Python 3.15, and declared support for Python 3.14 + in package metadata. + https://github.com/joblib/threadpoolctl/issues/251 3.7.0 (2026-09-15) ================== diff --git a/pyproject.toml b/pyproject.toml index e2a35c6a..f2ff8a65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,6 +17,8 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Topic :: Software Development :: Libraries :: Python Modules", ] From 13f067dde09598f0af37b068b72614508a3b51d8 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 18 Sep 2026 06:59:55 +0000 Subject: [PATCH 2/8] CI test Python 3.15 free-threaded builds Add Linux and Windows pip jobs that install conda-forge's python-freethreading interpreter with PYTHON_GIL=0. Mark the OpenMP Cython test helpers as free-threading compatible so importing them does not re-enable the GIL under pytest -W error. Co-authored-by: Olivier Grisel --- .github/workflows/test.yml | 19 +++++++++++++++++++ CHANGES.md | 3 ++- continuous_integration/install.sh | 3 ++- continuous_integration/run_tests.sh | 8 ++++++++ tests/_openmp_test_helper/build_utils.py | 18 ++++++++++++++++++ tests/_openmp_test_helper/setup_inner.py | 7 ++----- .../setup_nested_prange_blas.py | 7 ++----- tests/_openmp_test_helper/setup_outer.py | 7 ++----- 8 files changed, 55 insertions(+), 17 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 52bf4383..c2442816 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -77,6 +77,15 @@ jobs: PYTHON_VERSION: "3.15" PACKAGER: "pip" INSTALL_OPENCV: "true" + # Windows + free-threaded Python 3.15 from conda-forge, numpy / scipy + # from PyPI. OpenCV is omitted because it does not yet ship cp315t + # wheels. + - name: py315t_pip + os: windows-latest + PYTHON_VERSION: "3.15" + PACKAGER: "pip" + PYTHON_FREETHREADED: "true" + PYTHON_GIL: "0" # MacOS env with OpenMP installed through homebrew - name: py39_conda_homebrew_libomp @@ -178,6 +187,16 @@ jobs: CC_OUTER_LOOP: "gcc" CC_INNER_LOOP: "gcc" INSTALL_OPENCV: "true" + # Linux + free-threaded Python 3.15. OpenCV is omitted because it + # does not yet ship cp315t wheels. + - name: py315t_pip + os: ubuntu-latest + PACKAGER: "pip" + PYTHON_VERSION: "3.15" + PYTHON_FREETHREADED: "true" + PYTHON_GIL: "0" + CC_OUTER_LOOP: "gcc" + CC_INNER_LOOP: "gcc" # Linux environment with numpy from conda-forge channel and openblas-openmp - name: pylatest_conda_forge os: ubuntu-latest diff --git a/CHANGES.md b/CHANGES.md index d7a4bb27..89a6381d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,7 +6,8 @@ https://github.com/joblib/threadpoolctl/pull/250 - Added official support for Python 3.15, and declared support for Python 3.14 - in package metadata. + in package metadata. CI covers both the default and free-threaded 3.15 + builds. https://github.com/joblib/threadpoolctl/issues/251 3.7.0 (2026-09-15) diff --git a/continuous_integration/install.sh b/continuous_integration/install.sh index 42c551ba..8b8661c4 100755 --- a/continuous_integration/install.sh +++ b/continuous_integration/install.sh @@ -41,7 +41,7 @@ make_conda() { fi fi - if [[ "$FREETHREADING" == "1" ]]; then + if [[ "$FREETHREADING" == "1" || "$PYTHON_FREETHREADED" == "true" ]]; then TO_INSTALL="$TO_INSTALL python-freethreading" elif [[ "$PYTHON_VERSION" == "*" ]]; then # Avoid installing free-threaded python @@ -134,6 +134,7 @@ if [[ "$UNAMESTR" == "Linux" && "$NO_NUMPY" != "true" ]]; then fi python --version +python -c "import sys, sysconfig; print('Py_GIL_DISABLED', sysconfig.get_config_var('Py_GIL_DISABLED')); print('sys._is_gil_enabled', getattr(sys, '_is_gil_enabled', lambda: 'n/a')())" python -c "import numpy; print(f'numpy {numpy.__version__}')" || echo "no numpy" python -c "import scipy; print(f'scipy {scipy.__version__}')" || echo "no scipy" diff --git a/continuous_integration/run_tests.sh b/continuous_integration/run_tests.sh index 97814b8d..3bb5efa2 100755 --- a/continuous_integration/run_tests.sh +++ b/continuous_integration/run_tests.sh @@ -16,10 +16,18 @@ elif [[ "$PACKAGER" == "ubuntu" ]]; then pip list fi +if [[ "$PYTHON_FREETHREADED" == "true" ]]; then + python -c "import sys; assert hasattr(sys, '_is_gil_enabled') and not sys._is_gil_enabled(), 'expected a free-threaded interpreter with the GIL disabled'" +fi + # Use the CLI to display the effective runtime environment prior to # launching the tests: python -m threadpoolctl -i numpy scipy.linalg tests._openmp_test_helper.openmp_helpers_inner +if [[ "$PYTHON_FREETHREADED" == "true" ]]; then + python -c "import sys, numpy, scipy.linalg, tests._openmp_test_helper.openmp_helpers_inner as _; assert not sys._is_gil_enabled(), 'GIL was re-enabled after importing native extensions'" +fi + # Introspect API scope: PYTHONPATH=. python -X faulthandler tests/empirical_scope_observation.py blas PYTHONPATH=. python -X faulthandler tests/empirical_scope_observation.py openmp diff --git a/tests/_openmp_test_helper/build_utils.py b/tests/_openmp_test_helper/build_utils.py index 90356b33..71fb42f1 100644 --- a/tests/_openmp_test_helper/build_utils.py +++ b/tests/_openmp_test_helper/build_utils.py @@ -1,5 +1,6 @@ import os import sys +import sysconfig def set_cc_variables(var_name="CC"): @@ -20,3 +21,20 @@ def get_openmp_flag(): elif sys.platform == "darwin" and "openmp" in os.getenv("CPPFLAGS", ""): return [] return ["-fopenmp"] + + +def cython_compiler_directives(**extra): + """Return Cython compiler directives for the OpenMP test helpers. + + On free-threaded CPython, mark the extensions as GIL-free so importing + them does not re-enable the GIL (which would fail CI under ``-W error``). + """ + directives = { + "language_level": 3, + "boundscheck": False, + "wraparound": False, + } + directives.update(extra) + if sysconfig.get_config_var("Py_GIL_DISABLED"): + directives["freethreading_compatible"] = True + return directives diff --git a/tests/_openmp_test_helper/setup_inner.py b/tests/_openmp_test_helper/setup_inner.py index 547e257a..943e7195 100644 --- a/tests/_openmp_test_helper/setup_inner.py +++ b/tests/_openmp_test_helper/setup_inner.py @@ -4,6 +4,7 @@ from build_utils import set_cc_variables from build_utils import get_openmp_flag +from build_utils import cython_compiler_directives original_environ = os.environ.copy() try: @@ -25,11 +26,7 @@ name="_openmp_test_helper_inner", ext_modules=cythonize( ext_modules, - compiler_directives={ - "language_level": 3, - "boundscheck": False, - "wraparound": False, - }, + compiler_directives=cython_compiler_directives(), compile_time_env={"CC_INNER_LOOP": inner_loop_cc_var or "unknown"}, ), ) diff --git a/tests/_openmp_test_helper/setup_nested_prange_blas.py b/tests/_openmp_test_helper/setup_nested_prange_blas.py index dcb39ca6..3073a30c 100644 --- a/tests/_openmp_test_helper/setup_nested_prange_blas.py +++ b/tests/_openmp_test_helper/setup_nested_prange_blas.py @@ -4,6 +4,7 @@ from build_utils import set_cc_variables from build_utils import get_openmp_flag +from build_utils import cython_compiler_directives original_environ = os.environ.copy() try: @@ -29,11 +30,7 @@ name="_openmp_test_helper_nested_prange_blas", ext_modules=cythonize( ext_modules, - compiler_directives={ - "language_level": 3, - "boundscheck": False, - "wraparound": False, - }, + compiler_directives=cython_compiler_directives(), ), ) diff --git a/tests/_openmp_test_helper/setup_outer.py b/tests/_openmp_test_helper/setup_outer.py index dee39b1a..bd0d3538 100644 --- a/tests/_openmp_test_helper/setup_outer.py +++ b/tests/_openmp_test_helper/setup_outer.py @@ -4,6 +4,7 @@ from build_utils import set_cc_variables from build_utils import get_openmp_flag +from build_utils import cython_compiler_directives original_environ = os.environ.copy() try: @@ -25,11 +26,7 @@ name="_openmp_test_helper_outer", ext_modules=cythonize( ext_modules, - compiler_directives={ - "language_level": 3, - "boundscheck": False, - "wraparound": False, - }, + compiler_directives=cython_compiler_directives(), compile_time_env={"CC_OUTER_LOOP": outer_loop_cc_var or "unknown"}, ), ) From 451672db470b9b677bd75be3c19cc1d054f4dbd3 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 18 Sep 2026 09:47:42 +0000 Subject: [PATCH 3/8] CI install conda-forge Python RC via pyrc_pip jobs Rename the 3.15 pip jobs to pyrc_pip and pyrc_ft_pip. Enable conda-forge/label/python_rc so python=3.15 can resolve, select python-gil or python-freethreading, and keep numpy/scipy on pip. Co-authored-by: Olivier Grisel --- .github/workflows/test.yml | 27 ++++++++++++++------------- CHANGES.md | 4 ++-- continuous_integration/install.sh | 8 +++++++- continuous_integration/run_tests.sh | 2 ++ 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c2442816..a1ee47b1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -71,19 +71,19 @@ jobs: PYTHON_VERSION: "3.10" PACKAGER: "pip" INSTALL_OPENCV: "true" - # Windows + Python 3.15 from conda-forge, numpy / scipy from PyPI. - - name: py315_pip + # Windows + conda-forge Python RC, extra deps from PyPI. + # OpenCV is omitted: no wheels for the current RC ABI yet. + - name: pyrc_pip os: windows-latest PYTHON_VERSION: "3.15" PACKAGER: "pip" - INSTALL_OPENCV: "true" - # Windows + free-threaded Python 3.15 from conda-forge, numpy / scipy - # from PyPI. OpenCV is omitted because it does not yet ship cp315t - # wheels. - - name: py315t_pip + PYTHON_RC: "true" + # Windows + conda-forge free-threaded Python RC, extra deps from PyPI. + - name: pyrc_ft_pip os: windows-latest PYTHON_VERSION: "3.15" PACKAGER: "pip" + PYTHON_RC: "true" PYTHON_FREETHREADED: "true" PYTHON_GIL: "0" @@ -179,20 +179,21 @@ jobs: PYTHON_VERSION: "3.11" CC_OUTER_LOOP: "gcc" CC_INNER_LOOP: "clang-18" - # Linux + Python 3.15 with numpy / scipy installed with pip from PyPI. - - name: py315_pip + # Linux + conda-forge Python RC, extra deps from PyPI. + # OpenCV is omitted: no wheels for the current RC ABI yet. + - name: pyrc_pip os: ubuntu-latest PACKAGER: "pip" PYTHON_VERSION: "3.15" + PYTHON_RC: "true" CC_OUTER_LOOP: "gcc" CC_INNER_LOOP: "gcc" - INSTALL_OPENCV: "true" - # Linux + free-threaded Python 3.15. OpenCV is omitted because it - # does not yet ship cp315t wheels. - - name: py315t_pip + # Linux + conda-forge free-threaded Python RC, extra deps from PyPI. + - name: pyrc_ft_pip os: ubuntu-latest PACKAGER: "pip" PYTHON_VERSION: "3.15" + PYTHON_RC: "true" PYTHON_FREETHREADED: "true" PYTHON_GIL: "0" CC_OUTER_LOOP: "gcc" diff --git a/CHANGES.md b/CHANGES.md index 89a6381d..3582d805 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,8 +6,8 @@ https://github.com/joblib/threadpoolctl/pull/250 - Added official support for Python 3.15, and declared support for Python 3.14 - in package metadata. CI covers both the default and free-threaded 3.15 - builds. + in package metadata. CI installs the conda-forge Python RC (with and without + free-threading) and uses pip for extra dependencies. https://github.com/joblib/threadpoolctl/issues/251 3.7.0 (2026-09-15) diff --git a/continuous_integration/install.sh b/continuous_integration/install.sh index 8b8661c4..9dac5083 100755 --- a/continuous_integration/install.sh +++ b/continuous_integration/install.sh @@ -43,7 +43,7 @@ make_conda() { if [[ "$FREETHREADING" == "1" || "$PYTHON_FREETHREADED" == "true" ]]; then TO_INSTALL="$TO_INSTALL python-freethreading" - elif [[ "$PYTHON_VERSION" == "*" ]]; then + elif [[ "$PYTHON_VERSION" == "*" || "$PYTHON_RC" == "true" ]]; then # Avoid installing free-threaded python TO_INSTALL="$TO_INSTALL python-gil" fi @@ -53,6 +53,12 @@ make_conda() { # prevent mixing conda channels conda config --set channel_priority strict conda config --add channels $CHANNEL + if [[ "$PYTHON_RC" == "true" ]]; then + # Python RC builds are on conda-forge main but depend on _python_rc, + # which is only published on this label. Keep the label at lower + # priority than conda-forge so the interpreter still comes from main. + conda config --append channels conda-forge/label/python_rc + fi conda update -n base conda conda-libmamba-solver -q --yes conda config --set solver libmamba diff --git a/continuous_integration/run_tests.sh b/continuous_integration/run_tests.sh index 3bb5efa2..1640c889 100755 --- a/continuous_integration/run_tests.sh +++ b/continuous_integration/run_tests.sh @@ -18,6 +18,8 @@ fi if [[ "$PYTHON_FREETHREADED" == "true" ]]; then python -c "import sys; assert hasattr(sys, '_is_gil_enabled') and not sys._is_gil_enabled(), 'expected a free-threaded interpreter with the GIL disabled'" +elif [[ "$PYTHON_RC" == "true" ]]; then + python -c "import sys, sysconfig; assert sysconfig.get_config_var('Py_GIL_DISABLED') in (0, None) and sys._is_gil_enabled(), 'expected a GIL-enabled Python RC'" fi # Use the CLI to display the effective runtime environment prior to From 1902ff0180eb6823e5238c69a9301c07f7d241f8 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 18 Sep 2026 10:02:57 +0000 Subject: [PATCH 4/8] MNT drop Cython setup helper after pyx FT directives #250 already marks the OpenMP test helpers as free-threading compatible in the pyx files, so restore the setup scripts to the plain compiler_directives dicts. Use FREETHREADING=1 for the RC free-threaded jobs to match the existing 3.14 CI flag. Co-authored-by: Olivier Grisel --- .github/workflows/test.yml | 4 ++-- continuous_integration/install.sh | 2 +- continuous_integration/run_tests.sh | 4 ++-- tests/_openmp_test_helper/build_utils.py | 18 ------------------ tests/_openmp_test_helper/setup_inner.py | 7 +++++-- .../setup_nested_prange_blas.py | 7 +++++-- tests/_openmp_test_helper/setup_outer.py | 7 +++++-- 7 files changed, 20 insertions(+), 29 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a1ee47b1..23991e06 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -84,7 +84,7 @@ jobs: PYTHON_VERSION: "3.15" PACKAGER: "pip" PYTHON_RC: "true" - PYTHON_FREETHREADED: "true" + FREETHREADING: "1" PYTHON_GIL: "0" # MacOS env with OpenMP installed through homebrew @@ -194,7 +194,7 @@ jobs: PACKAGER: "pip" PYTHON_VERSION: "3.15" PYTHON_RC: "true" - PYTHON_FREETHREADED: "true" + FREETHREADING: "1" PYTHON_GIL: "0" CC_OUTER_LOOP: "gcc" CC_INNER_LOOP: "gcc" diff --git a/continuous_integration/install.sh b/continuous_integration/install.sh index 9dac5083..01190bdb 100755 --- a/continuous_integration/install.sh +++ b/continuous_integration/install.sh @@ -41,7 +41,7 @@ make_conda() { fi fi - if [[ "$FREETHREADING" == "1" || "$PYTHON_FREETHREADED" == "true" ]]; then + if [[ "$FREETHREADING" == "1" ]]; then TO_INSTALL="$TO_INSTALL python-freethreading" elif [[ "$PYTHON_VERSION" == "*" || "$PYTHON_RC" == "true" ]]; then # Avoid installing free-threaded python diff --git a/continuous_integration/run_tests.sh b/continuous_integration/run_tests.sh index 1640c889..6b127711 100755 --- a/continuous_integration/run_tests.sh +++ b/continuous_integration/run_tests.sh @@ -16,7 +16,7 @@ elif [[ "$PACKAGER" == "ubuntu" ]]; then pip list fi -if [[ "$PYTHON_FREETHREADED" == "true" ]]; then +if [[ "$FREETHREADING" == "1" ]]; then python -c "import sys; assert hasattr(sys, '_is_gil_enabled') and not sys._is_gil_enabled(), 'expected a free-threaded interpreter with the GIL disabled'" elif [[ "$PYTHON_RC" == "true" ]]; then python -c "import sys, sysconfig; assert sysconfig.get_config_var('Py_GIL_DISABLED') in (0, None) and sys._is_gil_enabled(), 'expected a GIL-enabled Python RC'" @@ -26,7 +26,7 @@ fi # launching the tests: python -m threadpoolctl -i numpy scipy.linalg tests._openmp_test_helper.openmp_helpers_inner -if [[ "$PYTHON_FREETHREADED" == "true" ]]; then +if [[ "$FREETHREADING" == "1" ]]; then python -c "import sys, numpy, scipy.linalg, tests._openmp_test_helper.openmp_helpers_inner as _; assert not sys._is_gil_enabled(), 'GIL was re-enabled after importing native extensions'" fi diff --git a/tests/_openmp_test_helper/build_utils.py b/tests/_openmp_test_helper/build_utils.py index 71fb42f1..90356b33 100644 --- a/tests/_openmp_test_helper/build_utils.py +++ b/tests/_openmp_test_helper/build_utils.py @@ -1,6 +1,5 @@ import os import sys -import sysconfig def set_cc_variables(var_name="CC"): @@ -21,20 +20,3 @@ def get_openmp_flag(): elif sys.platform == "darwin" and "openmp" in os.getenv("CPPFLAGS", ""): return [] return ["-fopenmp"] - - -def cython_compiler_directives(**extra): - """Return Cython compiler directives for the OpenMP test helpers. - - On free-threaded CPython, mark the extensions as GIL-free so importing - them does not re-enable the GIL (which would fail CI under ``-W error``). - """ - directives = { - "language_level": 3, - "boundscheck": False, - "wraparound": False, - } - directives.update(extra) - if sysconfig.get_config_var("Py_GIL_DISABLED"): - directives["freethreading_compatible"] = True - return directives diff --git a/tests/_openmp_test_helper/setup_inner.py b/tests/_openmp_test_helper/setup_inner.py index 943e7195..547e257a 100644 --- a/tests/_openmp_test_helper/setup_inner.py +++ b/tests/_openmp_test_helper/setup_inner.py @@ -4,7 +4,6 @@ from build_utils import set_cc_variables from build_utils import get_openmp_flag -from build_utils import cython_compiler_directives original_environ = os.environ.copy() try: @@ -26,7 +25,11 @@ name="_openmp_test_helper_inner", ext_modules=cythonize( ext_modules, - compiler_directives=cython_compiler_directives(), + compiler_directives={ + "language_level": 3, + "boundscheck": False, + "wraparound": False, + }, compile_time_env={"CC_INNER_LOOP": inner_loop_cc_var or "unknown"}, ), ) diff --git a/tests/_openmp_test_helper/setup_nested_prange_blas.py b/tests/_openmp_test_helper/setup_nested_prange_blas.py index 3073a30c..dcb39ca6 100644 --- a/tests/_openmp_test_helper/setup_nested_prange_blas.py +++ b/tests/_openmp_test_helper/setup_nested_prange_blas.py @@ -4,7 +4,6 @@ from build_utils import set_cc_variables from build_utils import get_openmp_flag -from build_utils import cython_compiler_directives original_environ = os.environ.copy() try: @@ -30,7 +29,11 @@ name="_openmp_test_helper_nested_prange_blas", ext_modules=cythonize( ext_modules, - compiler_directives=cython_compiler_directives(), + compiler_directives={ + "language_level": 3, + "boundscheck": False, + "wraparound": False, + }, ), ) diff --git a/tests/_openmp_test_helper/setup_outer.py b/tests/_openmp_test_helper/setup_outer.py index bd0d3538..dee39b1a 100644 --- a/tests/_openmp_test_helper/setup_outer.py +++ b/tests/_openmp_test_helper/setup_outer.py @@ -4,7 +4,6 @@ from build_utils import set_cc_variables from build_utils import get_openmp_flag -from build_utils import cython_compiler_directives original_environ = os.environ.copy() try: @@ -26,7 +25,11 @@ name="_openmp_test_helper_outer", ext_modules=cythonize( ext_modules, - compiler_directives=cython_compiler_directives(), + compiler_directives={ + "language_level": 3, + "boundscheck": False, + "wraparound": False, + }, compile_time_env={"CC_OUTER_LOOP": outer_loop_cc_var or "unknown"}, ), ) From 7f75890dd2ac0a70459ba526cfd01cfc9e93ef12 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 18 Sep 2026 12:10:03 +0000 Subject: [PATCH 5/8] CI run Python RC jobs on Linux only Drop the Windows pyrc_pip and pyrc_ft_pip matrix entries so the conda-forge Python RC coverage stays on ubuntu-latest. Co-authored-by: Olivier Grisel --- .github/workflows/test.yml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 23991e06..7926d79e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -71,21 +71,6 @@ jobs: PYTHON_VERSION: "3.10" PACKAGER: "pip" INSTALL_OPENCV: "true" - # Windows + conda-forge Python RC, extra deps from PyPI. - # OpenCV is omitted: no wheels for the current RC ABI yet. - - name: pyrc_pip - os: windows-latest - PYTHON_VERSION: "3.15" - PACKAGER: "pip" - PYTHON_RC: "true" - # Windows + conda-forge free-threaded Python RC, extra deps from PyPI. - - name: pyrc_ft_pip - os: windows-latest - PYTHON_VERSION: "3.15" - PACKAGER: "pip" - PYTHON_RC: "true" - FREETHREADING: "1" - PYTHON_GIL: "0" # MacOS env with OpenMP installed through homebrew - name: py39_conda_homebrew_libomp From ca0d51c7235cf0f48f00921661bab5838286fe67 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 18 Sep 2026 12:18:10 +0000 Subject: [PATCH 6/8] CI drop PYTHON_GIL from the free-threaded RC job The matrix keys become job-wide env vars, so PYTHON_GIL=0 also applied to the GIL-enabled base conda interpreter and aborted the Setup conda step. The free-threaded build already runs with the GIL disabled, and run_tests.sh asserts that. Co-authored-by: Olivier Grisel --- .github/workflows/test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7926d79e..97c0614c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -180,7 +180,6 @@ jobs: PYTHON_VERSION: "3.15" PYTHON_RC: "true" FREETHREADING: "1" - PYTHON_GIL: "0" CC_OUTER_LOOP: "gcc" CC_INNER_LOOP: "gcc" # Linux environment with numpy from conda-forge channel and openblas-openmp From fcfb14d44c6172b92138dcb92942dceb40d5be71 Mon Sep 17 00:00:00 2001 From: Olivier Grisel Date: Fri, 18 Sep 2026 15:12:59 +0200 Subject: [PATCH 7/8] Apply suggestion from @ogrisel --- CHANGES.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3582d805..d7a4bb27 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,8 +6,7 @@ https://github.com/joblib/threadpoolctl/pull/250 - Added official support for Python 3.15, and declared support for Python 3.14 - in package metadata. CI installs the conda-forge Python RC (with and without - free-threading) and uses pip for extra dependencies. + in package metadata. https://github.com/joblib/threadpoolctl/issues/251 3.7.0 (2026-09-15) From 3419ca840966a12ac6eb14008bfe34b10fc6720f Mon Sep 17 00:00:00 2001 From: Olivier Grisel Date: Fri, 18 Sep 2026 15:33:05 +0200 Subject: [PATCH 8/8] Apply batched suggestions from code review Co-authored-by: Olivier Grisel --- .github/workflows/test.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 97c0614c..b086d751 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -169,6 +169,9 @@ jobs: - name: pyrc_pip os: ubuntu-latest PACKAGER: "pip" + # Using the "*" marker does not select the latest RC release + # from the conda-forge `python_rc` channel hence the need to pin + # a specific Python version when testing against an RC release. PYTHON_VERSION: "3.15" PYTHON_RC: "true" CC_OUTER_LOOP: "gcc" @@ -177,6 +180,9 @@ jobs: - name: pyrc_ft_pip os: ubuntu-latest PACKAGER: "pip" + # Using the "*" marker does not select the latest RC release + # from the conda-forge `python_rc` channel hence the need to pin + # a specific Python version when testing against an RC release. PYTHON_VERSION: "3.15" PYTHON_RC: "true" FREETHREADING: "1"