diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 6ba4a6998..aea445c48 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -61,7 +61,6 @@ body: label: Python Version options: - "lower version (unsupported)" - - "3.9" - "3.10" - "3.11" - "3.12" diff --git a/.github/workflows/run_all_tests.yml b/.github/workflows/run_all_tests.yml index 0f2cbe5ed..2fa3842d8 100644 --- a/.github/workflows/run_all_tests.yml +++ b/.github/workflows/run_all_tests.yml @@ -22,24 +22,21 @@ jobs: fail-fast: false matrix: 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 } - - { name: linux-python3.10 , test-tox-env: test-py310-pinned , build-tox-env: build-py310-pinned , python-ver: "3.10", os: ubuntu-latest } + - { 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-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: 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.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-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: macos-python3.9-minimum , test-tox-env: test-py39-minimum , build-tox-env: build-py39-minimum , python-ver: "3.9" , os: macos-13 } - - { 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.10-minimum , test-tox-env: test-py310-minimum , build-tox-env: build-py310-minimum , 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 } @@ -92,13 +89,13 @@ jobs: fail-fast: false 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.10-minimum , test-tox-env: gallery-py310-minimum , python-ver: "3.10", 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: windows-gallery-python3.9-minimum , test-tox-env: gallery-py39-minimum , python-ver: "3.9" , os: windows-latest } + - { name: windows-gallery-python3.10-minimum , test-tox-env: gallery-py310-minimum , python-ver: "3.10", 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: macos-gallery-python3.9-minimum , test-tox-env: gallery-py39-minimum , python-ver: "3.9" , os: macos-13 } + - { name: macos-gallery-python3.10-minimum , test-tox-env: gallery-py310-minimum , python-ver: "3.10", os: macos-latest } - { 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 } steps: @@ -138,8 +135,7 @@ jobs: fail-fast: false 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.10 , test-tox-env: test-py310-pinned , build-tox-env: build-py310-pinned , python-ver: "3.10", os: ubuntu-latest } + - { name: conda-linux-python3.10-minimum , test-tox-env: test-py310-minimum , build-tox-env: build-py310-minimum , python-ver: "3.10", os: ubuntu-latest } - { 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 } diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 3395bc07d..eae0adcc6 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -19,12 +19,12 @@ jobs: fail-fast: false matrix: 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 } + - { name: linux-python3.10-minimum , test-tox-env: test-py310-minimum , build-tox-env: build-py310-minimum , python-ver: "3.10" , 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: 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-minimum , test-tox-env: test-py310-minimum , build-tox-env: build-py310-minimum , python-ver: "3.10" , 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: macos-python3.9-minimum , test-tox-env: test-py39-minimum , build-tox-env: build-py39-minimum , python-ver: "3.9" , os: macos-13 } + - { name: macos-python3.10-minimum , test-tox-env: test-py310-minimum , build-tox-env: build-py310-minimum , python-ver: "3.10" , os: macos-13 } - { name: macos-python3.13-upgraded , test-tox-env: test-py313-upgraded , build-tox-env: build-py313-upgraded , python-ver: "3.13" , os: macos-latest } steps: - name: Cancel non-latest runs @@ -79,9 +79,9 @@ jobs: fail-fast: false 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.10-minimum , test-tox-env: gallery-py310-minimum , python-ver: "3.10" , os: ubuntu-latest } - { name: linux-gallery-python3.13-upgraded , test-tox-env: gallery-py313-upgraded, python-ver: "3.13", 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.10-minimum , test-tox-env: gallery-py310-minimum , python-ver: "3.10" , os: windows-latest } - { name: windows-gallery-python3.13-upgraded, test-tox-env: gallery-py313-upgraded, python-ver: "3.13", os: windows-latest } steps: - name: Cancel non-latest runs @@ -120,7 +120,7 @@ jobs: fail-fast: false 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.10-minimum , test-tox-env: test-py310-minimum , build-tox-env: build-py310-minimum , python-ver: "3.10" , 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 } steps: - name: Cancel non-latest runs diff --git a/CHANGELOG.md b/CHANGELOG.md index c997abef5..a6822b6fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,8 @@ - Fixed import structure test. @rly [#2136](https://github.com/NeurodataWithoutBorders/pynwb/pull/2136) ### Changed -- Change UI of documentation assistant to be an accordion that is always visible. @bendichter [#2124](https://github.com/NeurodataWithoutBorders/pynwb/pull/2124) -- Updated minimum HDMF version to 4.1.2 and updated tests accordingly. @rly [#2144](https://github.com/NeurodataWithoutBorders/pynwb/pull/2144) +- Changed UI of documentation assistant to be an accordion that is always visible. @bendichter [#2124](https://github.com/NeurodataWithoutBorders/pynwb/pull/2124) +- Deprecated Python 3.9 support. (EOL was Oct 31, 2025) @bendichter [#2141](https://github.com/NeurodataWithoutBorders/pynwb/pull/2141) ## PyNWB 3.1.2 (August 13, 2025) diff --git a/docs/source/install_developers.rst b/docs/source/install_developers.rst index cfc2c34e7..385960575 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.10, 3.11, 3.12, or 3.13 #. pip @@ -54,11 +54,11 @@ Option 2: Using conda ^^^^^^^^^^^^^^^^^^^^^ First, install Anaconda_ to install the ``conda`` tool. Then create and -activate a new virtual environment called "venv" with Python 3.9 installed. +activate a new virtual environment called "venv" with Python 3.10 installed. .. code:: bash - conda create --name venv python=3.9 + conda create --name venv python=3.10 conda activate venv Similar to a virtual environment created with ``virtualenv``, a conda environment diff --git a/docs/source/install_users.rst b/docs/source/install_users.rst index 1bae5c754..fea91dfb5 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.10, 3.11, 3.12, or 3.13 #. pip .. note:: If you are a developer then please see the :ref:`install_developers` installation instructions instead. @@ -53,5 +53,3 @@ own project against the latest version of PyNWB. .. code:: $ pip install -U pynwb --find-links https://github.com/NeurodataWithoutBorders/pynwb/releases/tag/latest --no-index - - diff --git a/pyproject.toml b/pyproject.toml index 24a6cb405..9fd061c67 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,11 +14,10 @@ authors = [ ] description= "Package for working with Neurodata stored in the NWB format." readme = "README.rst" -requires-python = ">=3.9" +requires-python = ">=3.10" license = {text = "BSD-3-Clause"} classifiers = [ "Programming Language :: Python", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", @@ -33,10 +32,10 @@ classifiers = [ "Topic :: Scientific/Engineering :: Medical Science Apps." ] dependencies = [ - "h5py>=3.2.0", + "h5py>=3.6.0", "hdmf>=4.1.2,<5", "numpy>=1.24.0", - "pandas>=1.2.0", + "pandas>=1.3.5", "python-dateutil>=2.8.2", "platformdirs>=4.1.0" ] @@ -122,4 +121,3 @@ line-length = 120 [tool.ruff.lint.mccabe] max-complexity = 17 - diff --git a/requirements-min.txt b/requirements-min.txt index 61241e7c6..064806d3a 100644 --- a/requirements-min.txt +++ b/requirements-min.txt @@ -1,7 +1,7 @@ # minimum versions of package dependencies for installing PyNWB -h5py==3.2.0 +h5py==3.6.0 hdmf==4.1.2 numpy==1.24.0 -pandas==1.2.0 +pandas==1.3.5 python-dateutil==2.8.2 -platformdirs==4.1.0 \ No newline at end of file +platformdirs==4.1.0 diff --git a/requirements.txt b/requirements.txt index 79b6db693..e0578d5b3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,7 @@ # pinned dependencies to reproduce an entire development environment to use PyNWB h5py==3.12.1 hdmf==4.1.2 -numpy==2.1.1; python_version > "3.9" # numpy 2.1+ is not compatible with py3.9 -numpy==2.0.2; python_version == "3.9" +numpy==2.1.1 pandas==2.2.3 python-dateutil==2.9.0.post0 platformdirs==4.3.6 diff --git a/test_pynwb_io_nwbhdf5.h5 b/test_pynwb_io_nwbhdf5.h5 new file mode 100644 index 000000000..0173c648b Binary files /dev/null and b/test_pynwb_io_nwbhdf5.h5 differ diff --git a/tox.ini b/tox.ini index 10f96eafe..e30dbd3d3 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{310,311,312,313}-pinned requires = pip >= 22.0 [testenv] @@ -37,18 +37,18 @@ commands = [testenv:test-py313-upgraded] [testenv:test-py313-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-py39-minimum] +[testenv:test-py{310,311,312,313}-pinned] +[testenv:test-py310-minimum] [testenv:gallery-py313-upgraded] [testenv:gallery-py313-prerelease] [testenv:gallery-py311-optional-pinned] -[testenv:gallery-py{39,310,311,312,313}-pinned] -[testenv:gallery-py39-minimum] +[testenv:gallery-py{310,311,312,313}-pinned] +[testenv:gallery-py310-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-py39-minimum] +[testenv:build-py{310,311,312,313}-pinned] # using tox for this so that we can have a clean build environment +[testenv:build-py310-minimum] [testenv:wheelinstall] # use with `--installpkg dist/*-none-any.whl`