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..418fe811f 100644 --- a/.github/workflows/deploy_release.yml +++ b/.github/workflows/deploy_release.yml @@ -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_tests.yml b/.github/workflows/run_tests.yml index 974c5c7d0..99a9935a3 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 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`