From 05898f9e54d759be9e2c00aef4abf35e374a530e Mon Sep 17 00:00:00 2001 From: Ben Dichter Date: Wed, 4 Mar 2026 18:07:49 -0500 Subject: [PATCH 1/6] Add Python 3.14 support Co-Authored-By: Claude Opus 4.6 --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 + .github/workflows/deploy_release.yml | 6 ++--- .github/workflows/run_all_tests.yml | 32 +++++++++++++++------------ .github/workflows/run_coverage.yml | 2 +- .github/workflows/run_tests.yml | 14 ++++++------ CHANGELOG.md | 2 ++ docs/source/install_developers.rst | 2 +- docs/source/install_users.rst | 2 +- pyproject.toml | 1 + tox.ini | 20 ++++++++--------- 10 files changed, 45 insertions(+), 37 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 6ba4a6998..8923bb555 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -66,6 +66,7 @@ body: - "3.11" - "3.12" - "3.13" + - "3.14" - "higher version (not yet supported)" validations: required: true diff --git a/.github/workflows/deploy_release.yml b/.github/workflows/deploy_release.yml index fff052fbf..21050bb59 100644 --- a/.github/workflows/deploy_release.yml +++ b/.github/workflows/deploy_release.yml @@ -18,7 +18,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.13' + python-version: '3.14' - name: Install build dependencies run: | @@ -28,11 +28,11 @@ jobs: - name: Run tox tests run: | - tox -e py312-upgraded + tox -e py314-upgraded - name: Build wheel and source distribution run: | - tox -e build-py312-upgraded + tox -e build-py314-upgraded ls -1 dist - name: Test installation from a wheel diff --git a/.github/workflows/run_all_tests.yml b/.github/workflows/run_all_tests.yml index f952f3290..bdc637838 100644 --- a/.github/workflows/run_all_tests.yml +++ b/.github/workflows/run_all_tests.yml @@ -28,24 +28,27 @@ jobs: - { name: linux-python3.11-opt , test-tox-env: test-py311-optional-pinned, build-tox-env: build-py311-pinned , python-ver: "3.11", os: ubuntu-latest } - { name: linux-python3.12 , test-tox-env: test-py312-pinned , build-tox-env: build-py312-pinned , python-ver: "3.12", os: ubuntu-latest } - { name: linux-python3.13 , test-tox-env: test-py313-pinned , build-tox-env: build-py313-pinned , python-ver: "3.13", os: ubuntu-latest } - - { name: linux-python3.13-upgraded , test-tox-env: test-py313-upgraded , build-tox-env: build-py313-upgraded , python-ver: "3.13", os: ubuntu-latest } - - { name: linux-python3.13-prerelease , test-tox-env: test-py313-prerelease , build-tox-env: build-py313-prerelease, python-ver: "3.13", os: ubuntu-latest } + - { name: linux-python3.14 , test-tox-env: test-py314-pinned , build-tox-env: build-py314-pinned , python-ver: "3.14", os: ubuntu-latest } + - { name: linux-python3.14-upgraded , test-tox-env: test-py314-upgraded , build-tox-env: build-py314-upgraded , python-ver: "3.14", os: ubuntu-latest } + - { name: linux-python3.14-prerelease , test-tox-env: test-py314-prerelease , build-tox-env: build-py314-prerelease, python-ver: "3.14", os: ubuntu-latest } - { name: windows-python3.9-minimum , test-tox-env: test-py39-minimum , build-tox-env: build-py39-minimum , python-ver: "3.9" , os: windows-latest } - { name: windows-python3.10 , test-tox-env: test-py310-pinned , build-tox-env: build-py310-pinned , python-ver: "3.10", os: windows-latest } - { name: windows-python3.11 , test-tox-env: test-py311-pinned , build-tox-env: build-py311-pinned , python-ver: "3.11", os: windows-latest } - { name: windows-python3.11-opt , test-tox-env: test-py311-optional-pinned, build-tox-env: build-py311-pinned , python-ver: "3.11", os: windows-latest } - { name: windows-python3.12 , test-tox-env: test-py312-pinned , build-tox-env: build-py312-pinned , python-ver: "3.12", os: windows-latest } - { name: windows-python3.13 , test-tox-env: test-py313-pinned , build-tox-env: build-py313-pinned , python-ver: "3.13", os: windows-latest } - - { name: windows-python3.13-upgraded , test-tox-env: test-py313-upgraded , build-tox-env: build-py313-upgraded , python-ver: "3.13", os: windows-latest } - - { name: windows-python3.13-prerelease, test-tox-env: test-py313-prerelease , build-tox-env: build-py313-prerelease, python-ver: "3.13", os: windows-latest } + - { name: windows-python3.14 , test-tox-env: test-py314-pinned , build-tox-env: build-py314-pinned , python-ver: "3.14", os: windows-latest } + - { name: windows-python3.14-upgraded , test-tox-env: test-py314-upgraded , build-tox-env: build-py314-upgraded , python-ver: "3.14", os: windows-latest } + - { name: windows-python3.14-prerelease, test-tox-env: test-py314-prerelease , build-tox-env: build-py314-prerelease, python-ver: "3.14", os: windows-latest } - { name: macos-python3.9-minimum , test-tox-env: test-py39-minimum , build-tox-env: build-py39-minimum , python-ver: "3.9" , os: macos-15-intel } - { name: macos-python3.10 , test-tox-env: test-py310-pinned , build-tox-env: build-py310-pinned , python-ver: "3.10", os: macos-latest } - { name: macos-python3.11 , test-tox-env: test-py311-pinned , build-tox-env: build-py311-pinned , python-ver: "3.11", os: macos-latest } - { name: macos-python3.11-opt , test-tox-env: test-py311-optional-pinned, build-tox-env: build-py311-pinned , python-ver: "3.11", os: macos-latest } - { name: macos-python3.12 , test-tox-env: test-py312-pinned , build-tox-env: build-py312-pinned , python-ver: "3.12", os: macos-latest } - { name: macos-python3.13 , test-tox-env: test-py313-pinned , build-tox-env: build-py313-pinned , python-ver: "3.13", os: macos-latest } - - { name: macos-python3.13-upgraded , test-tox-env: test-py313-upgraded , build-tox-env: build-py313-upgraded , python-ver: "3.13", os: macos-latest } - - { name: macos-python3.13-prerelease , test-tox-env: test-py313-prerelease , build-tox-env: build-py313-prerelease, python-ver: "3.13", os: macos-latest } + - { name: macos-python3.14 , test-tox-env: test-py314-pinned , build-tox-env: build-py314-pinned , python-ver: "3.14", os: macos-latest } + - { name: macos-python3.14-upgraded , test-tox-env: test-py314-upgraded , build-tox-env: build-py314-upgraded , python-ver: "3.14", os: macos-latest } + - { name: macos-python3.14-prerelease , test-tox-env: test-py314-prerelease , build-tox-env: build-py314-prerelease, python-ver: "3.14", os: macos-latest } steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 @@ -93,14 +96,14 @@ jobs: matrix: include: - { name: linux-gallery-python3.9-minimum , test-tox-env: gallery-py39-minimum , python-ver: "3.9" , os: ubuntu-latest } - - { name: linux-gallery-python3.13-upgraded , test-tox-env: gallery-py313-upgraded , python-ver: "3.13", os: ubuntu-latest } - - { name: linux-gallery-python3.13-prerelease , test-tox-env: gallery-py313-prerelease, python-ver: "3.13", os: ubuntu-latest } + - { name: linux-gallery-python3.14-upgraded , test-tox-env: gallery-py314-upgraded , python-ver: "3.14", os: ubuntu-latest } + - { name: linux-gallery-python3.14-prerelease , test-tox-env: gallery-py314-prerelease, python-ver: "3.14", os: ubuntu-latest } - { name: windows-gallery-python3.9-minimum , test-tox-env: gallery-py39-minimum , python-ver: "3.9" , os: windows-latest } - - { name: windows-gallery-python3.13-upgraded , test-tox-env: gallery-py313-upgraded , python-ver: "3.13", os: windows-latest } - - { name: windows-gallery-python3.13-prerelease, test-tox-env: gallery-py313-prerelease, python-ver: "3.13", os: windows-latest } + - { name: windows-gallery-python3.14-upgraded , test-tox-env: gallery-py314-upgraded , python-ver: "3.14", os: windows-latest } + - { name: windows-gallery-python3.14-prerelease, test-tox-env: gallery-py314-prerelease, python-ver: "3.14", os: windows-latest } - { name: macos-gallery-python3.9-minimum , test-tox-env: gallery-py39-minimum , python-ver: "3.9" , os: macos-15-intel} - - { name: macos-gallery-python3.13-upgraded , test-tox-env: gallery-py313-upgraded , python-ver: "3.13", os: macos-latest } - - { name: macos-gallery-python3.13-prerelease , test-tox-env: gallery-py313-prerelease, python-ver: "3.13", os: macos-latest } + - { name: macos-gallery-python3.14-upgraded , test-tox-env: gallery-py314-upgraded , python-ver: "3.14", os: macos-latest } + - { name: macos-gallery-python3.14-prerelease , test-tox-env: gallery-py314-prerelease, python-ver: "3.14", os: macos-latest } steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 @@ -143,8 +146,9 @@ jobs: - { name: conda-linux-python3.11 , test-tox-env: test-py311-pinned , build-tox-env: build-py311-pinned , python-ver: "3.11", os: ubuntu-latest } - { name: conda-linux-python3.12 , test-tox-env: test-py312-pinned , build-tox-env: build-py312-pinned , python-ver: "3.12", os: ubuntu-latest } - { name: conda-linux-python3.13 , test-tox-env: test-py313-pinned , build-tox-env: build-py313-pinned , python-ver: "3.13", os: ubuntu-latest } - - { name: conda-linux-python3.13-upgraded , test-tox-env: test-py313-upgraded , build-tox-env: build-py313-upgraded , python-ver: "3.13", os: ubuntu-latest } - - { name: conda-linux-python3.13-prerelease, test-tox-env: test-py313-prerelease, build-tox-env: build-py313-prerelease, python-ver: "3.13", os: ubuntu-latest } + - { name: conda-linux-python3.14 , test-tox-env: test-py314-pinned , build-tox-env: build-py314-pinned , python-ver: "3.14", os: ubuntu-latest } + - { name: conda-linux-python3.14-upgraded , test-tox-env: test-py314-upgraded , build-tox-env: build-py314-upgraded , python-ver: "3.14", os: ubuntu-latest } + - { name: conda-linux-python3.14-prerelease, test-tox-env: test-py314-prerelease, build-tox-env: build-py314-prerelease, python-ver: "3.14", os: ubuntu-latest } steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 diff --git a/.github/workflows/run_coverage.yml b/.github/workflows/run_coverage.yml index da74ef08c..538df1862 100644 --- a/.github/workflows/run_coverage.yml +++ b/.github/workflows/run_coverage.yml @@ -28,7 +28,7 @@ jobs: - { os: macos-latest , opt_req: false } env: OS: ${{ matrix.os }} - PYTHON: '3.13' + PYTHON: '3.14' steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 974c5c7d0..d8b8290cb 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -21,11 +21,11 @@ jobs: include: - { name: linux-python3.9-minimum , test-tox-env: test-py39-minimum , build-tox-env: build-py39-minimum , python-ver: "3.9" , os: ubuntu-latest } # NOTE config below with "upload-wheels: true" specifies that wheels should be uploaded as an artifact - - { name: linux-python3.13-upgraded , test-tox-env: test-py313-upgraded , build-tox-env: build-py313-upgraded , python-ver: "3.13", os: ubuntu-latest , upload-wheels: true } + - { name: linux-python3.14-upgraded , test-tox-env: test-py314-upgraded , build-tox-env: build-py314-upgraded , python-ver: "3.14", os: ubuntu-latest , upload-wheels: true } - { name: windows-python3.9-minimum , test-tox-env: test-py39-minimum , build-tox-env: build-py39-minimum , python-ver: "3.9" , os: windows-latest } - - { name: windows-python3.13-upgraded , test-tox-env: test-py313-upgraded , build-tox-env: build-py313-upgraded , python-ver: "3.13", os: windows-latest } + - { name: windows-python3.14-upgraded , test-tox-env: test-py314-upgraded , build-tox-env: build-py314-upgraded , python-ver: "3.14", os: windows-latest } - { name: macos-python3.9-minimum , test-tox-env: test-py39-minimum , build-tox-env: build-py39-minimum , python-ver: "3.9" , os: macos-15-intel } - - { name: macos-python3.13-upgraded , test-tox-env: test-py313-upgraded , build-tox-env: build-py313-upgraded , python-ver: "3.13" , os: macos-latest } + - { name: macos-python3.14-upgraded , test-tox-env: test-py314-upgraded , build-tox-env: build-py314-upgraded , python-ver: "3.14" , os: macos-latest } steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 @@ -80,9 +80,9 @@ jobs: matrix: include: - { name: linux-gallery-python3.9-minimum , test-tox-env: gallery-py39-minimum , python-ver: "3.9" , os: ubuntu-latest } - - { name: linux-gallery-python3.13-upgraded , test-tox-env: gallery-py313-upgraded, python-ver: "3.13", os: ubuntu-latest } + - { name: linux-gallery-python3.14-upgraded , test-tox-env: gallery-py314-upgraded, python-ver: "3.14", os: ubuntu-latest } - { name: windows-gallery-python3.9-minimum , test-tox-env: gallery-py39-minimum , python-ver: "3.9" , os: windows-latest } - - { name: windows-gallery-python3.13-upgraded, test-tox-env: gallery-py313-upgraded, python-ver: "3.13", os: windows-latest } + - { name: windows-gallery-python3.14-upgraded, test-tox-env: gallery-py314-upgraded, python-ver: "3.14", os: windows-latest } steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 @@ -121,7 +121,7 @@ jobs: matrix: include: - { name: conda-linux-python3.9-minimum , test-tox-env: test-py39-minimum , build-tox-env: build-py39-minimum , python-ver: "3.9" , os: ubuntu-latest } - - { name: conda-linux-python3.13-upgraded , test-tox-env: test-py313-upgraded , build-tox-env: build-py313-upgraded , python-ver: "3.13", os: ubuntu-latest } + - { name: conda-linux-python3.14-upgraded , test-tox-env: test-py314-upgraded , build-tox-env: build-py314-upgraded , python-ver: "3.14", os: ubuntu-latest } steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 @@ -280,7 +280,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.13' + python-version: '3.14' - name: Download wheel and source distributions from artifact uses: actions/download-artifact@v4 diff --git a/CHANGELOG.md b/CHANGELOG.md index dc282d945..a337fe42e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ ### Fixed - Fixed invalid CSS properties in documentation assistant toggle that prevented proper positioning on displays ≥1400px wide. @rly [#2151](https://github.com/NeurodataWithoutBorders/pynwb/pull/2151) +### Changed +- Added Python 3.14 support. @bendichter ## PyNWB 3.1.3 (December 9, 2025) diff --git a/docs/source/install_developers.rst b/docs/source/install_developers.rst index cfc2c34e7..37999d068 100644 --- a/docs/source/install_developers.rst +++ b/docs/source/install_developers.rst @@ -6,7 +6,7 @@ Installing PyNWB for Developers PyNWB has the following minimum requirements, which must be installed before you can get started using PyNWB. -#. Python 3.9, 3.10, 3.11, 3.12, or 3.13 +#. Python 3.9, 3.10, 3.11, 3.12, 3.13, or 3.14 #. pip diff --git a/docs/source/install_users.rst b/docs/source/install_users.rst index 1bae5c754..28e3db4e6 100644 --- a/docs/source/install_users.rst +++ b/docs/source/install_users.rst @@ -6,7 +6,7 @@ Installing PyNWB PyNWB has the following minimum requirements, which must be installed before you can get started using PyNWB. -#. Python 3.9, 3.10, 3.11, 3.12, or 3.13 +#. Python 3.9, 3.10, 3.11, 3.12, 3.13, or 3.14 #. pip .. note:: If you are a developer then please see the :ref:`install_developers` installation instructions instead. diff --git a/pyproject.toml b/pyproject.toml index 24a6cb405..a7db2e90d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "License :: OSI Approved :: BSD License", "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", diff --git a/tox.ini b/tox.ini index 10f96eafe..2718f5033 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ # and then run "tox" from this directory. [tox] -envlist = test-py{39,310,311,312,313}-pinned +envlist = test-py{39,310,311,312,313,314}-pinned requires = pip >= 22.0 [testenv] @@ -34,21 +34,21 @@ commands = wheelinstall: python -c "import pynwb" # list of pre-defined environments. -[testenv:test-py313-upgraded] -[testenv:test-py313-prerelease] +[testenv:test-py314-upgraded] +[testenv:test-py314-prerelease] [testenv:test-py311-optional-pinned] # some optional reqs not compatible with py312 yet -[testenv:test-py{39,310,311,312,313}-pinned] +[testenv:test-py{39,310,311,312,313,314}-pinned] [testenv:test-py39-minimum] -[testenv:gallery-py313-upgraded] -[testenv:gallery-py313-prerelease] +[testenv:gallery-py314-upgraded] +[testenv:gallery-py314-prerelease] [testenv:gallery-py311-optional-pinned] -[testenv:gallery-py{39,310,311,312,313}-pinned] +[testenv:gallery-py{39,310,311,312,313,314}-pinned] [testenv:gallery-py39-minimum] -[testenv:build-py313-upgraded] -[testenv:build-py313-prerelease] -[testenv:build-py{39,310,311,312,313}-pinned] # using tox for this so that we can have a clean build environment +[testenv:build-py314-upgraded] +[testenv:build-py314-prerelease] +[testenv:build-py{39,310,311,312,313,314}-pinned] # using tox for this so that we can have a clean build environment [testenv:build-py39-minimum] [testenv:wheelinstall] # use with `--installpkg dist/*-none-any.whl` From 826f25b0b1028e9e928e1f7211b69a6e63e5ee3e Mon Sep 17 00:00:00 2001 From: Ben Dichter Date: Wed, 4 Mar 2026 18:36:10 -0500 Subject: [PATCH 2/6] Revert coverage, deploy, and deploy-dev Python to 3.13 Python 3.14 doesn't have pre-built wheels for numpy and other deps yet. Keep these utility steps on 3.13 (latest stable). The 3.14 prerelease and upgraded tox envs handle 3.14 testing. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/deploy_release.yml | 2 +- .github/workflows/run_coverage.yml | 2 +- .github/workflows/run_tests.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy_release.yml b/.github/workflows/deploy_release.yml index 21050bb59..418fe811f 100644 --- a/.github/workflows/deploy_release.yml +++ b/.github/workflows/deploy_release.yml @@ -18,7 +18,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.14' + python-version: '3.13' - name: Install build dependencies run: | diff --git a/.github/workflows/run_coverage.yml b/.github/workflows/run_coverage.yml index 538df1862..da74ef08c 100644 --- a/.github/workflows/run_coverage.yml +++ b/.github/workflows/run_coverage.yml @@ -28,7 +28,7 @@ jobs: - { os: macos-latest , opt_req: false } env: OS: ${{ matrix.os }} - PYTHON: '3.14' + PYTHON: '3.13' steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index d8b8290cb..99a9935a3 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -280,7 +280,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.14' + python-version: '3.13' - name: Download wheel and source distributions from artifact uses: actions/download-artifact@v4 From fa9bd167dc8dc7f573424e637d5074a59ef7e1b9 Mon Sep 17 00:00:00 2001 From: rly <310197+rly@users.noreply.github.com> Date: Mon, 9 Mar 2026 17:25:00 -0700 Subject: [PATCH 3/6] Update optional pinned tests to py313 and reorder opt rows Co-Authored-By: Claude Opus 4.6 --- .github/workflows/run_all_tests.yml | 6 +++--- CHANGELOG.md | 2 +- tox.ini | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/run_all_tests.yml b/.github/workflows/run_all_tests.yml index bf29c0cc8..badaf859a 100644 --- a/.github/workflows/run_all_tests.yml +++ b/.github/workflows/run_all_tests.yml @@ -24,25 +24,25 @@ jobs: include: - { name: linux-python3.10-minimum , test-tox-env: test-py310-minimum , build-tox-env: build-py310-minimum , python-ver: "3.10", os: ubuntu-latest } - { name: linux-python3.11 , test-tox-env: test-py311-pinned , build-tox-env: build-py311-pinned , python-ver: "3.11", os: ubuntu-latest } - - { name: linux-python3.11-opt , test-tox-env: test-py311-optional-pinned, build-tox-env: build-py311-pinned , python-ver: "3.11", os: ubuntu-latest } - { name: linux-python3.12 , test-tox-env: test-py312-pinned , build-tox-env: build-py312-pinned , python-ver: "3.12", os: ubuntu-latest } - { name: linux-python3.13 , test-tox-env: test-py313-pinned , build-tox-env: build-py313-pinned , python-ver: "3.13", os: ubuntu-latest } + - { name: linux-python3.13-opt , test-tox-env: test-py313-optional-pinned, build-tox-env: build-py313-pinned , python-ver: "3.13", os: ubuntu-latest } - { name: linux-python3.14 , test-tox-env: test-py314-pinned , build-tox-env: build-py314-pinned , python-ver: "3.14", os: ubuntu-latest } - { name: linux-python3.14-upgraded , test-tox-env: test-py314-upgraded , build-tox-env: build-py314-upgraded , python-ver: "3.14", os: ubuntu-latest } - { name: linux-python3.14-prerelease , test-tox-env: test-py314-prerelease , build-tox-env: build-py314-prerelease, python-ver: "3.14", os: ubuntu-latest } - { name: windows-python3.10-minimum , test-tox-env: test-py310-minimum , build-tox-env: build-py310-minimum , python-ver: "3.10", os: windows-latest } - { name: windows-python3.11 , test-tox-env: test-py311-pinned , build-tox-env: build-py311-pinned , python-ver: "3.11", os: windows-latest } - - { name: windows-python3.11-opt , test-tox-env: test-py311-optional-pinned, build-tox-env: build-py311-pinned , python-ver: "3.11", os: windows-latest } - { name: windows-python3.12 , test-tox-env: test-py312-pinned , build-tox-env: build-py312-pinned , python-ver: "3.12", os: windows-latest } - { name: windows-python3.13 , test-tox-env: test-py313-pinned , build-tox-env: build-py313-pinned , python-ver: "3.13", os: windows-latest } + - { name: windows-python3.13-opt , test-tox-env: test-py313-optional-pinned, build-tox-env: build-py313-pinned , python-ver: "3.13", os: windows-latest } - { name: windows-python3.14 , test-tox-env: test-py314-pinned , build-tox-env: build-py314-pinned , python-ver: "3.14", os: windows-latest } - { name: windows-python3.14-upgraded , test-tox-env: test-py314-upgraded , build-tox-env: build-py314-upgraded , python-ver: "3.14", os: windows-latest } - { name: windows-python3.14-prerelease, test-tox-env: test-py314-prerelease , build-tox-env: build-py314-prerelease, python-ver: "3.14", os: windows-latest } - { name: macos-python3.10-minimum , test-tox-env: test-py310-minimum , build-tox-env: build-py310-minimum , python-ver: "3.10", os: macos-15-intel } - { name: macos-python3.11 , test-tox-env: test-py311-pinned , build-tox-env: build-py311-pinned , python-ver: "3.11", os: macos-latest } - - { name: macos-python3.11-opt , test-tox-env: test-py311-optional-pinned, build-tox-env: build-py311-pinned , python-ver: "3.11", os: macos-latest } - { name: macos-python3.12 , test-tox-env: test-py312-pinned , build-tox-env: build-py312-pinned , python-ver: "3.12", os: macos-latest } - { name: macos-python3.13 , test-tox-env: test-py313-pinned , build-tox-env: build-py313-pinned , python-ver: "3.13", os: macos-latest } + - { name: macos-python3.13-opt , test-tox-env: test-py313-optional-pinned, build-tox-env: build-py313-pinned , python-ver: "3.13", os: macos-latest } - { name: macos-python3.14 , test-tox-env: test-py314-pinned , build-tox-env: build-py314-pinned , python-ver: "3.14", os: macos-latest } - { name: macos-python3.14-upgraded , test-tox-env: test-py314-upgraded , build-tox-env: build-py314-upgraded , python-ver: "3.14", os: macos-latest } - { name: macos-python3.14-prerelease , test-tox-env: test-py314-prerelease , build-tox-env: build-py314-prerelease, python-ver: "3.14", os: macos-latest } diff --git a/CHANGELOG.md b/CHANGELOG.md index fd7e9b16d..486396470 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ - Fixed invalid CSS properties in documentation assistant toggle that prevented proper positioning on displays ≥1400px wide. @rly [#2151](https://github.com/NeurodataWithoutBorders/pynwb/pull/2151) ### Changed -- Added Python 3.14 support. @bendichter +- Added Python 3.14 support. @bendichter, @rly [#2168](https://github.com/NeurodataWithoutBorders/pynwb/pull/2168) - Updated HDMF dependency to >=5.0.0, <6. @rly [#2171](https://github.com/NeurodataWithoutBorders/pynwb/issues/2171) - Deprecated Python 3.9 support. (EOL was Oct 31, 2025) @bendichter [#2141](https://github.com/NeurodataWithoutBorders/pynwb/pull/2141) diff --git a/tox.ini b/tox.ini index 2371da2a1..110f1959e 100644 --- a/tox.ini +++ b/tox.ini @@ -36,13 +36,13 @@ commands = # list of pre-defined environments. [testenv:test-py314-upgraded] [testenv:test-py314-prerelease] -[testenv:test-py311-optional-pinned] # some optional reqs not compatible with py312 yet +[testenv:test-py313-optional-pinned] [testenv:test-py{310,311,312,313,314}-pinned] [testenv:test-py310-minimum] [testenv:gallery-py314-upgraded] [testenv:gallery-py314-prerelease] -[testenv:gallery-py311-optional-pinned] +[testenv:gallery-py313-optional-pinned] [testenv:gallery-py{310,311,312,313,314}-pinned] [testenv:gallery-py310-minimum] From 7de2cab055e86ad1de3b142397c20913ab3f08ef Mon Sep 17 00:00:00 2001 From: Ryan Ly <310197+rly@users.noreply.github.com> Date: Mon, 9 Mar 2026 17:52:14 -0700 Subject: [PATCH 4/6] Use Python 3.14 in more places in CI --- .github/workflows/deploy_release.yml | 2 +- .github/workflows/run_coverage.yml | 2 +- .github/workflows/run_dandi_read_tests.yml | 2 +- .github/workflows/run_tests.yml | 2 +- environment-ros3.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy_release.yml b/.github/workflows/deploy_release.yml index 418fe811f..21050bb59 100644 --- a/.github/workflows/deploy_release.yml +++ b/.github/workflows/deploy_release.yml @@ -18,7 +18,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.13' + python-version: '3.14' - name: Install build dependencies run: | diff --git a/.github/workflows/run_coverage.yml b/.github/workflows/run_coverage.yml index da74ef08c..538df1862 100644 --- a/.github/workflows/run_coverage.yml +++ b/.github/workflows/run_coverage.yml @@ -28,7 +28,7 @@ jobs: - { os: macos-latest , opt_req: false } env: OS: ${{ matrix.os }} - PYTHON: '3.13' + PYTHON: '3.14' steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 diff --git a/.github/workflows/run_dandi_read_tests.yml b/.github/workflows/run_dandi_read_tests.yml index f4b27cbd8..376882a7b 100644 --- a/.github/workflows/run_dandi_read_tests.yml +++ b/.github/workflows/run_dandi_read_tests.yml @@ -25,7 +25,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.13' + python-version: '3.14' - name: Install run dependencies run: | diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 4e2f69cb0..ceb56e8ad 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -280,7 +280,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.13' + python-version: '3.14' - name: Download wheel and source distributions from artifact uses: actions/download-artifact@v4 diff --git a/environment-ros3.yml b/environment-ros3.yml index 54b30ba56..812854d7b 100644 --- a/environment-ros3.yml +++ b/environment-ros3.yml @@ -4,7 +4,7 @@ channels: - conda-forge - defaults dependencies: - - python==3.13 + - python==3.14 - h5py==3.12.1 - matplotlib==3.9.2 - numpy==2.1.3 From 8f40612b2d109455c2fedb2478cdb19999cb0257 Mon Sep 17 00:00:00 2001 From: rly <310197+rly@users.noreply.github.com> Date: Tue, 10 Mar 2026 01:11:43 +0000 Subject: [PATCH 5/6] Update pinned deps and fix ros3 CI for Python 3.14 - Update pinned dependencies in requirements.txt: h5py 3.12.1->3.16.0, numpy 2.1.1->2.4.3, pandas 2.2.3->2.3.3, platformdirs 4.3.6->4.9.4 - Update pinned dependencies in environment-ros3.yml: h5py 3.12.1->3.16.0, numpy 2.1.3->2.4.3, pandas 2.2.3->2.3.3, pytest 7.4.3->9.0.2 - Update pinned dependencies in requirements-dev.txt: black 24.4.2->26.3.0, codespell 2.3.0->2.4.2, coverage 7.5.3->7.13.4, pytest 8.2.1->9.0.2, isort 5.13.2->8.0.1, pytest-cov 5.0.0->7.0.0, tox 4.15.0->4.49.1, ruff 0.4.6->0.15.5 - Update ros3 conda CI jobs from Python 3.13 to 3.14 to match environment-ros3.yml which already pins python==3.14 Co-Authored-By: Claude Opus 4.6 --- .github/workflows/run_all_tests.yml | 12 ++++++------ .github/workflows/run_tests.yml | 4 ++-- environment-ros3.yml | 8 ++++---- requirements-dev.txt | 16 ++++++++-------- requirements.txt | 8 ++++---- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/run_all_tests.yml b/.github/workflows/run_all_tests.yml index badaf859a..712d96137 100644 --- a/.github/workflows/run_all_tests.yml +++ b/.github/workflows/run_all_tests.yml @@ -199,9 +199,9 @@ jobs: fail-fast: false matrix: include: - - { name: conda-linux-python3.13-ros3 , python-ver: "3.13", os: ubuntu-latest } - - { name: conda-windows-python3.13-ros3, python-ver: "3.13", os: windows-latest } - - { name: conda-macos-python3.13-ros3 , python-ver: "3.13", os: macos-latest } + - { name: conda-linux-python3.14-ros3 , python-ver: "3.14", os: ubuntu-latest } + - { name: conda-windows-python3.14-ros3, python-ver: "3.14", os: windows-latest } + - { name: conda-macos-python3.14-ros3 , python-ver: "3.14", os: macos-latest } steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 @@ -246,9 +246,9 @@ jobs: fail-fast: false matrix: include: - - { name: conda-linux-gallery-python3.13-ros3 , python-ver: "3.13", os: ubuntu-latest } - - { name: conda-windows-gallery-python3.13-ros3, python-ver: "3.13", os: windows-latest } - - { name: conda-macos-gallery-python3.13-ros3 , python-ver: "3.13", os: macos-latest } + - { name: conda-linux-gallery-python3.14-ros3 , python-ver: "3.14", os: ubuntu-latest } + - { name: conda-windows-gallery-python3.14-ros3, python-ver: "3.14", os: windows-latest } + - { name: conda-macos-gallery-python3.14-ros3 , python-ver: "3.14", os: macos-latest } steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index ceb56e8ad..038d46152 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -175,7 +175,7 @@ jobs: fail-fast: false matrix: include: - - { name: conda-linux-python3.13-ros3 , python-ver: "3.13", os: ubuntu-latest } + - { name: conda-linux-python3.14-ros3 , python-ver: "3.14", os: ubuntu-latest } steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 @@ -220,7 +220,7 @@ jobs: fail-fast: false matrix: include: - - { name: conda-linux-gallery-python3.13-ros3 , python-ver: "3.13", os: ubuntu-latest } + - { name: conda-linux-gallery-python3.14-ros3 , python-ver: "3.14", os: ubuntu-latest } steps: - name: Cancel non-latest runs uses: styfle/cancel-workflow-action@0.11.0 diff --git a/environment-ros3.yml b/environment-ros3.yml index 812854d7b..e8abda7d3 100644 --- a/environment-ros3.yml +++ b/environment-ros3.yml @@ -5,13 +5,13 @@ channels: - defaults dependencies: - python==3.14 - - h5py==3.12.1 + - h5py==3.16.0 - matplotlib==3.9.2 - - numpy==2.1.3 - - pandas==2.2.3 + - numpy==2.4.3 + - pandas==2.3.3 - python-dateutil==2.9.0 - setuptools - - pytest==7.4.3 # pin to pytest < 8 because of incompatibilities to be addressed + - pytest==9.0.2 - fsspec==2025.5.1 - requests==2.32.3 - aiohttp==3.12.13 diff --git a/requirements-dev.txt b/requirements-dev.txt index 37853354d..0d3ab634a 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,11 +2,11 @@ # compute coverage, and create test environments. note that depending on the version of python installed, different # versions of requirements may be installed due to package incompatibilities. # -black==24.4.2 -codespell==2.3.0 -coverage==7.5.3 -pytest==8.2.1 -isort==5.13.2 -pytest-cov==5.0.0 -tox==4.15.0 -ruff==0.4.6 +black==26.3.0 +codespell==2.4.2 +coverage==7.13.4 +pytest==9.0.2 +isort==8.0.1 +pytest-cov==7.0.0 +tox==4.49.1 +ruff==0.15.5 diff --git a/requirements.txt b/requirements.txt index 0b646186b..3456f61c4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ # pinned dependencies to reproduce an entire development environment to use PyNWB -h5py==3.12.1 +h5py==3.16.0 hdmf==5.0.0 -numpy==2.1.1 -pandas==2.2.3 +numpy==2.4.3 +pandas==2.3.3 python-dateutil==2.9.0.post0 -platformdirs==4.3.6 +platformdirs==4.9.4 From 75bd971299aefbb1511b427324e451abbdbafb3b Mon Sep 17 00:00:00 2001 From: rly <310197+rly@users.noreply.github.com> Date: Tue, 10 Mar 2026 01:20:11 +0000 Subject: [PATCH 6/6] Fix dep conflicts: bump platformdirs min, update conda ros3 pins - Bump platformdirs minimum from 4.1.0 to 4.2.2 in pyproject.toml and requirements-min.txt to be compatible with tox 4.20.0 - Pin tox to 4.20.0 (compatible with platformdirs>=4.2.2) - Update environment-ros3.yml pins to versions available on conda-forge for Python 3.14: h5py 3.15.1, matplotlib 3.10.8, numpy 2.4.2, pandas 3.0.1, fsspec 2026.1.0, requests 2.32.5, aiohttp 3.13.3 Co-Authored-By: Claude Opus 4.6 --- environment-ros3.yml | 14 +++++++------- pyproject.toml | 2 +- requirements-dev.txt | 2 +- requirements-min.txt | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/environment-ros3.yml b/environment-ros3.yml index e8abda7d3..e4bcbdcd9 100644 --- a/environment-ros3.yml +++ b/environment-ros3.yml @@ -5,16 +5,16 @@ channels: - defaults dependencies: - python==3.14 - - h5py==3.16.0 - - matplotlib==3.9.2 - - numpy==2.4.3 - - pandas==2.3.3 + - h5py==3.15.1 + - matplotlib==3.10.8 + - numpy==2.4.2 + - pandas==3.0.1 - python-dateutil==2.9.0 - setuptools - pytest==9.0.2 - - fsspec==2025.5.1 - - requests==2.32.3 - - aiohttp==3.12.13 + - fsspec==2026.1.0 + - requests==2.32.5 + - aiohttp==3.13.3 - pip - pip: - hdmf==5.0.0 # not yet available on conda-forge diff --git a/pyproject.toml b/pyproject.toml index 918505a97..2eaf7dc76 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ dependencies = [ "numpy>=1.24.0", "pandas>=1.4.0", "python-dateutil>=2.8.2", - "platformdirs>=4.1.0" + "platformdirs>=4.2.2" ] dynamic = ["version"] # the build backend will compute the version dynamically from git tag (or a __version__) diff --git a/requirements-dev.txt b/requirements-dev.txt index 0d3ab634a..a404b4468 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -8,5 +8,5 @@ coverage==7.13.4 pytest==9.0.2 isort==8.0.1 pytest-cov==7.0.0 -tox==4.49.1 +tox==4.20.0 ruff==0.15.5 diff --git a/requirements-min.txt b/requirements-min.txt index f7efe169f..39e8d9e62 100644 --- a/requirements-min.txt +++ b/requirements-min.txt @@ -4,4 +4,4 @@ hdmf==5.0.0 numpy==1.24.0 pandas==1.4.0 python-dateutil==2.8.2 -platformdirs==4.1.0 +platformdirs==4.2.2