From d1c28cd9d7235a134f0441abf418ff546e023d55 Mon Sep 17 00:00:00 2001 From: jswhit2 Date: Mon, 12 Oct 2026 13:38:19 -0600 Subject: [PATCH 1/8] Prepare for 1.7.5 release. --- Changelog | 4 ++-- README.md | 2 ++ src/netCDF4/_netCDF4.pyx | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Changelog b/Changelog index a9d3c3d44..2ed8870a7 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,5 @@ - version 1.7.4.1 (tag v1.7.4.1rel) - ================================= + version 1.7.5 (tag v1.7.5rel) + ============================= * Keep a numpy pin for Windows ARM64 on Python 3.10 so lockers can resolve that environment (issue #1491). * Preserve surviving dimensions and decoded types for empty orthogonal selections, including empty integer indices and all-false masks (PR #1499). diff --git a/README.md b/README.md index c5acc70c2..35a5f0142 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ ## News For details on the latest updates, see the [Changelog](https://github.com/Unidata/netcdf4-python/blob/master/Changelog). +10/17/2026: Version [1.7.5](https://pypi.python.org/pypi/netCDF4/1.7.5) released. See Changelog for details. + 1/5/2026: Version [1.7.4](https://pypi.python.org/pypi/netCDF4/1.7.4) released. Compression plugins now included in wheels, windows/arm64 and free-threaded python wheels provided. Automatic conversion of character arrays <--> string arrays works for Unicode (not just ascii) strings. WARNING: netcdf-c is not thread-safe and netcdf4-python does have internal locking so expect segfaults if you diff --git a/src/netCDF4/_netCDF4.pyx b/src/netCDF4/_netCDF4.pyx index 123732190..fec74fdcc 100644 --- a/src/netCDF4/_netCDF4.pyx +++ b/src/netCDF4/_netCDF4.pyx @@ -1,4 +1,4 @@ -"""Version 1.7.4.1 +"""Version 1.7.5 ------------- # Introduction @@ -1283,7 +1283,7 @@ import sys import functools from typing import Union -__version__ = "1.7.4.1" +__version__ = "1.7.5" # Initialize numpy import posixpath From 70ed9fb5be77a0f0448afc2ead2c289135cd90fd Mon Sep 17 00:00:00 2001 From: jswhit2 Date: Mon, 12 Oct 2026 15:44:19 -0600 Subject: [PATCH 2/8] upload to pypi when github release made --- .github/workflows/cibuildwheel.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index 5a081a508..f37002ff9 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -198,8 +198,8 @@ jobs: needs: [build_bdist, build_sdist, build_wheels_winmac, build_wheels_windows_arm] name: "Publish to PyPI" runs-on: ubuntu-22.04 - # upload to PyPI for every tag starting with 'v' - if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') + # upload to PyPI when github release made. + if: github.event_name == 'release' && github.event.action == 'published' steps: - uses: actions/download-artifact@v8 with: From 0215bf33f3d0cb2c6ceaadd188bdd74a26098d85 Mon Sep 17 00:00:00 2001 From: jswhit2 Date: Tue, 13 Oct 2026 08:14:03 -0600 Subject: [PATCH 3/8] add python 3.15 free-threaded wheels (issue #1509) --- .github/workflows/cibuildwheel.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index f37002ff9..630212a70 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -79,7 +79,7 @@ jobs: # These needs to rotate every new Python release. run: | set -x - echo "CIBW_BUILD=cp310-* cp311-* cp314-* cp314t-*" >> $GITHUB_ENV + echo "CIBW_BUILD=cp310-* cp311-* cp314-* cp314t-* cp315t-*" >> $GITHUB_ENV set +x if: ${{ github.event_name }} == "pull_request" From 314255df3dba88630f1639756ae4a02d475b1cc5 Mon Sep 17 00:00:00 2001 From: jswhit2 Date: Tue, 13 Oct 2026 08:17:18 -0600 Subject: [PATCH 4/8] update --- .github/workflows/cibuildwheel.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index 630212a70..6cd7fd919 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -74,12 +74,12 @@ jobs: shell: bash # On PRs we run only oldest and newest Python versions to reduce CI load. # Skips pypy and musllinux everywhere. - # We are building 310, 311 and 314 for now. + # We are building 310, 311 and 315 for now. # (3.11 is the oldest version for which we support abi3 wheels) # These needs to rotate every new Python release. run: | set -x - echo "CIBW_BUILD=cp310-* cp311-* cp314-* cp314t-* cp315t-*" >> $GITHUB_ENV + echo "CIBW_BUILD=cp310-* cp311-* cp315-* cp314t-* cp315t-*" >> $GITHUB_ENV set +x if: ${{ github.event_name }} == "pull_request" From b57500e3be61009e65e1b34a3c51f0b92013804e Mon Sep 17 00:00:00 2001 From: jswhit2 Date: Wed, 14 Oct 2026 14:02:26 -0600 Subject: [PATCH 5/8] remove Python 3.10 support --- .github/workflows/cibuildwheel.yml | 4 ++-- Changelog | 3 +-- pyproject.toml | 10 +++------- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index 2f3125a21..8a002c1c1 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -74,12 +74,12 @@ jobs: shell: bash # On PRs we run only oldest and newest Python versions to reduce CI load. # Skips pypy and musllinux everywhere. - # We are building 310, 311 and 315 for now. + # We are building 311 and 315 for now. # (3.11 is the oldest version for which we support abi3 wheels) # These needs to rotate every new Python release. run: | set -x - echo "CIBW_BUILD=cp310-* cp311-* cp315-* cp314t-* cp315t-*" >> $GITHUB_ENV + echo "CIBW_BUILD=cp311-* cp315-* cp315t-*" >> $GITHUB_ENV set +x if: ${{ github.event_name }} == "pull_request" diff --git a/Changelog b/Changelog index cb3358fd2..3791d22fc 100644 --- a/Changelog +++ b/Changelog @@ -1,8 +1,7 @@ - version 1.7.5 (tag v1.7.5rel) ============================= + * remove python 3.10 support (it reaches EOL October 31, 2026). * Reject fractional scalar indices instead of silently truncating reads or writes (issue #1350). - * Keep a numpy pin for Windows ARM64 on Python 3.10 so lockers can resolve that environment (issue #1491). * Preserve surviving dimensions and decoded types for empty orthogonal selections, including empty integer indices and all-false masks (PR #1499). * Convert non-native-endian numeric attributes to native byte order before writing (issue #1502). diff --git a/pyproject.toml b/pyproject.toml index a3266d86d..4983136bc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ description = "Provides an object-oriented python interface to the netCDF versio authors = [ {name = "Jeff Whitaker", email = "whitaker.jeffrey@gmail.com"}, ] -requires-python = ">=3.10" +requires-python = ">=3.11" keywords = [ "numpy", "netcdf", "data", "science", "network", "oceanography", "meteorology", "climate", @@ -25,11 +25,11 @@ license-files = ["LICENSE"] classifiers = [ "Development Status :: 3 - Alpha", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", "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", "Intended Audience :: Science/Research", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Compression", @@ -39,11 +39,7 @@ dependencies = [ "cftime", "certifi", "packaging", - "numpy>=2.3.0; platform_system == 'Windows' and platform_machine == 'ARM64' and python_version >= '3.11'", - # Windows ARM64 + Python 3.10 has no numpy>=2.3.0 wheel. Keep the older - # pin there so lockers (e.g. uv lock --python 3.10) can still resolve - # that environment. See issue #1491. - "numpy>=1.21.2; platform_system != 'Windows' or platform_machine != 'ARM64' or python_version < '3.11'", + "numpy>=1.23.2", ] dynamic = ["version"] From 467269dba94e07b68ea0a7f462478605ed419d7e Mon Sep 17 00:00:00 2001 From: jswhit2 Date: Wed, 14 Oct 2026 14:10:02 -0600 Subject: [PATCH 6/8] update python versions. --- .github/workflows/build_latest.yml | 2 +- .github/workflows/build_master.yml | 2 +- .github/workflows/build_old.yml | 2 +- .github/workflows/miniconda.yml | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build_latest.yml b/.github/workflows/build_latest.yml index f356cdc79..e61f649a7 100644 --- a/.github/workflows/build_latest.yml +++ b/.github/workflows/build_latest.yml @@ -14,7 +14,7 @@ jobs: #NO_NET: 1 strategy: matrix: - python-version: ["3.14"] + python-version: ["3.15"] steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/build_master.yml b/.github/workflows/build_master.yml index e031925ee..07f6ede1f 100644 --- a/.github/workflows/build_master.yml +++ b/.github/workflows/build_master.yml @@ -11,7 +11,7 @@ jobs: #NO_NET: 1 strategy: matrix: - python-version: ["3.14"] + python-version: ["3.15"] steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/build_old.yml b/.github/workflows/build_old.yml index 7a115b74b..220241de0 100644 --- a/.github/workflows/build_old.yml +++ b/.github/workflows/build_old.yml @@ -14,7 +14,7 @@ jobs: #NO_NET: 1 strategy: matrix: - python-version: ["3.14"] + python-version: ["3.15"] steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/miniconda.yml b/.github/workflows/miniconda.yml index c35d81c16..637266c42 100644 --- a/.github/workflows/miniconda.yml +++ b/.github/workflows/miniconda.yml @@ -13,12 +13,12 @@ jobs: strategy: matrix: python-version: [ - ["python", "3.10"], ["python", "3.11"], ["python", "3.12"], ["python", "3.13"], ["python", "3.14"], - ["python-freethreading", "3.14" ], + ["python", "3.15"], + ["python-freethreading", "3.15" ], ] os: [windows-latest, ubuntu-latest, macos-latest] platform: [x64, x32] From 35c98d06bc783e7f4547d905a0b94bede496349b Mon Sep 17 00:00:00 2001 From: jswhit2 Date: Wed, 14 Oct 2026 14:12:30 -0600 Subject: [PATCH 7/8] revert to python 3.14 --- .github/workflows/build_latest.yml | 2 +- .github/workflows/build_master.yml | 2 +- .github/workflows/build_old.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_latest.yml b/.github/workflows/build_latest.yml index e61f649a7..f356cdc79 100644 --- a/.github/workflows/build_latest.yml +++ b/.github/workflows/build_latest.yml @@ -14,7 +14,7 @@ jobs: #NO_NET: 1 strategy: matrix: - python-version: ["3.15"] + python-version: ["3.14"] steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/build_master.yml b/.github/workflows/build_master.yml index 07f6ede1f..e031925ee 100644 --- a/.github/workflows/build_master.yml +++ b/.github/workflows/build_master.yml @@ -11,7 +11,7 @@ jobs: #NO_NET: 1 strategy: matrix: - python-version: ["3.15"] + python-version: ["3.14"] steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/build_old.yml b/.github/workflows/build_old.yml index 220241de0..7a115b74b 100644 --- a/.github/workflows/build_old.yml +++ b/.github/workflows/build_old.yml @@ -14,7 +14,7 @@ jobs: #NO_NET: 1 strategy: matrix: - python-version: ["3.15"] + python-version: ["3.14"] steps: - uses: actions/checkout@v7 From f2af34565a6c4f1e3b130aa1ae3ccec4ad703339 Mon Sep 17 00:00:00 2001 From: jswhit2 Date: Wed, 14 Oct 2026 14:16:04 -0600 Subject: [PATCH 8/8] update --- .github/workflows/miniconda.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/miniconda.yml b/.github/workflows/miniconda.yml index 637266c42..b9c7a0668 100644 --- a/.github/workflows/miniconda.yml +++ b/.github/workflows/miniconda.yml @@ -18,7 +18,7 @@ jobs: ["python", "3.13"], ["python", "3.14"], ["python", "3.15"], - ["python-freethreading", "3.15" ], + ["python-freethreading", "3.14" ], ] os: [windows-latest, ubuntu-latest, macos-latest] platform: [x64, x32]