diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 7b0c4dcfc4..a806c74ad9 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -27,7 +27,7 @@ body: attributes: label: Python Version description: Version of Python interpreter - placeholder: 3.10, 3.11, 3.12 etc. + placeholder: 3.11, 3.12, 3.13 etc. validations: required: true - type: input diff --git a/.github/workflows/minimal.yml b/.github/workflows/minimal.yml index b5b2f48d62..76e7951954 100644 --- a/.github/workflows/minimal.yml +++ b/.github/workflows/minimal.yml @@ -4,9 +4,9 @@ name: Minimal installation on: push: - branches: [ main ] + branches: [ support/v2 ] pull_request: - branches: [ main ] + branches: [ support/v2 ] jobs: minimum_build: diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index b1be7e425d..811ecad2d6 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -5,9 +5,9 @@ name: Linux Testing on: push: - branches: [ main ] + branches: [ support/v2] pull_request: - branches: [ main ] + branches: [ support/v2] jobs: build: @@ -15,11 +15,13 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.10', '3.11', '3.12'] + python-version: ['3.11', '3.12', '3.13'] numpy_version: ['>=2.1', '==1.24.*'] exclude: - python-version: '3.12' numpy_version: '==1.24.*' + - python-version: '3.13' + numpy_version: '==1.24.*' services: redis: image: redis @@ -50,7 +52,7 @@ jobs: - name: Create Conda environment with the rights deps shell: "bash -l {0}" run: | - conda create -n zarr-env python==${{matrix.python-version}} bsddb3 pip nodejs + conda create -n zarr-env python==${{matrix.python-version}} pip nodejs conda activate zarr-env npm install -g azurite - name: Install dependencies diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 2d7cbd49b6..26b669abea 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -64,7 +64,7 @@ jobs: with: name: releases path: dist - - uses: pypa/gh-action-pypi-publish@v1.10.1 + - uses: pypa/gh-action-pypi-publish@v1.10.3 with: user: __token__ password: ${{ secrets.pypi_password }} diff --git a/.github/workflows/windows-testing.yml b/.github/workflows/windows-testing.yml index 1e22fec6d1..8bd560fb2f 100644 --- a/.github/workflows/windows-testing.yml +++ b/.github/workflows/windows-testing.yml @@ -5,9 +5,9 @@ name: Python package on: push: - branches: [ main ] + branches: [ support/v2 ] pull_request: - branches: [ main ] + branches: [ support/v2 ] jobs: windows: @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: True matrix: - python-version: ['3.10', '3.11'] + python-version: ['3.11', '3.12'] steps: - uses: actions/checkout@v4 with: diff --git a/TEAM.md b/TEAM.md index 824e57fa7f..e6975d7c04 100644 --- a/TEAM.md +++ b/TEAM.md @@ -8,6 +8,8 @@ - @martindurant (Martin Durant) - @normanrz (Norman Rzepka) - @dstansby (David Stansby) +- @dcherian (Deepak Cherian) +- @TomAugspurger (Tom Augspurger) ## Emeritus core-developers - @alimanfoo (Alistair Miles) diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 87dd70e347..4e664a596b 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -74,7 +74,6 @@ Nat Methods 8, 441 (2011). https://doi.org/10.1038/nmeth.1618 .sd-card .sd-card-header { border: none; background-color: white; - color: #150458 !important; font-size: var(--pst-font-size-h5); font-weight: bold; padding: 2.5rem 0rem 0.5rem 0rem; @@ -107,7 +106,6 @@ html[data-theme=dark] .sd-shadow-sm { html[data-theme=dark] .sd-card .sd-card-header { background-color:var(--pst-color-background); - color: #150458 !important; } html[data-theme=dark] .sd-card .sd-card-footer { diff --git a/docs/release.rst b/docs/release.rst index 0a86e3a153..18e1fd60dc 100644 --- a/docs/release.rst +++ b/docs/release.rst @@ -25,11 +25,19 @@ Release notes Enhancements ~~~~~~~~~~~~ +* Added testing on Python 3.13. Maintenance ~~~~~~~~~~~ -* ``getsize`` now returns the total size of all nested arrays. +* ``getsize`` now returns the total size of all nested arrays. By :user:`Ben Jeffery ` :issue:`253`. +* Dropped support for Python 3.10. + By :user:`David Stansby ` (:issue:`2344`). +* Removed testing for compatibility with the ``bsddb3`` package. + ``bsddb3`` was last released four years ago, and should still work with + ``zarr-python`` if you can install it, but to reduce our maintenance + burden we will no longer run our compatibility tests for it. + By :user:`David Stansby ` (:issue:`2344`). Deprecations ~~~~~~~~~~~~ @@ -43,7 +51,7 @@ Enhancements ~~~~~~~~~~~~ * Added support for creating a copy of data when converting a `zarr.Array` to a numpy array. - By :user:`David Stansby ` (:issue:`2106`) and + By :user:`David Stansby ` (:issue:`2106`) and :user:`Joe Hamman ` (:issue:`2123`). Maintenance diff --git a/docs/tutorial.rst b/docs/tutorial.rst index 214dd4f63f..87c4a20103 100644 --- a/docs/tutorial.rst +++ b/docs/tutorial.rst @@ -811,6 +811,8 @@ storing an array or group. Here is an example using a Berkeley DB B-tree database for storage (requires `bsddb3 `_ to be installed):: +.. doctest-requires:: bsddb3 + >>> import bsddb3 >>> store = zarr.DBMStore('data/example.bdb', open=bsddb3.btopen) >>> root = zarr.group(store=store, overwrite=True) @@ -1009,12 +1011,12 @@ class from ``fsspec``. The following example demonstrates how to access a ZIP-archived Zarr group on s3 using `s3fs `_ and ``ZipFileSystem``: >>> s3_path = "s3://path/to/my.zarr.zip" - >>> + >>> >>> s3 = s3fs.S3FileSystem() >>> f = s3.open(s3_path) >>> fs = ZipFileSystem(f, mode="r") >>> store = FSMap("", fs, check=False) - >>> + >>> >>> # caching may improve performance when repeatedly reading the same data >>> cache = zarr.storage.LRUStoreCache(store, max_size=2**28) >>> z = zarr.group(store=cache) diff --git a/pyproject.toml b/pyproject.toml index ec06b63a96..c5ff73a102 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,19 +7,15 @@ build-backend = "setuptools.build_meta" name = "zarr" description = "An implementation of chunked, compressed, N-dimensional arrays for Python" readme = { file = "README.md", content-type = "text/markdown" } -maintainers = [ - { name = "Alistair Miles", email = "alimanfoo@googlemail.com" } -] -requires-python = ">=3.10" +maintainers = [{ name = "Alistair Miles", email = "alimanfoo@googlemail.com" }] +requires-python = ">=3.11" dependencies = [ 'asciitree', 'numpy>=1.24', 'fasteners; sys_platform != "emscripten"', 'numcodecs>=0.10.0', ] -dynamic = [ - "version", -] +dynamic = ["version"] classifiers = [ 'Development Status :: 6 - Mature', 'Intended Audience :: Developers', @@ -30,18 +26,14 @@ classifiers = [ 'Topic :: Software Development :: Libraries :: Python Modules', 'Operating System :: Unix', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', + 'Programming Language :: Python :: 3.13', ] license = { text = "MIT" } [project.optional-dependencies] -jupyter = [ - 'notebook', - 'ipytree>=0.2.2', - 'ipywidgets>=8.0.0', -] +jupyter = ['notebook', 'ipytree>=0.2.2', 'ipywidgets>=8.0.0'] docs = [ 'sphinx', 'sphinx-automodapi', @@ -64,14 +56,11 @@ Homepage = "https://github.com/zarr-developers/zarr-python" exclude_lines = [ "pragma: no cover", "pragma: ${PY_MAJOR_VERSION} no cover", - '.*\.\.\.' # Ignore "..." lines + '.*\.\.\.', # Ignore "..." lines ] [tool.coverage.run] -omit = [ - "zarr/meta_v1.py", - "bench/compress_normal.py", -] +omit = ["zarr/meta_v1.py", "bench/compress_normal.py"] [tool.setuptools] packages = ["zarr", "zarr._storage", "zarr.tests"] @@ -100,14 +89,12 @@ exclude = [ "build", "dist", "venv", - "docs" + "docs", ] [tool.ruff.lint] -extend-select = [ - "B" -] -ignore = ["B905"] # zip-without-explicit-strict +extend-select = ["B"] +ignore = ["B905"] # zip-without-explicit-strict [tool.black] line-length = 100 @@ -136,9 +123,7 @@ doctest_optionflags = [ "ELLIPSIS", "IGNORE_EXCEPTION_DETAIL", ] -addopts = [ - "--durations=10", -] +addopts = ["--durations=10"] filterwarnings = [ "error:::zarr.*", "ignore:PY_SSIZE_T_CLEAN will be required.*:DeprecationWarning", @@ -146,9 +131,9 @@ filterwarnings = [ "ignore:The .* is deprecated and will be removed in a Zarr-Python version 3*:FutureWarning", "ignore:The experimental Zarr V3 implementation in this version .*:FutureWarning", ] -doctest_subpackage_requires =[ +doctest_subpackage_requires = [ "zarr/core.py = numpy>=2", - "zarr/creation.py = numpy>=2" + "zarr/creation.py = numpy>=2", ] diff --git a/requirements_dev_minimal.txt b/requirements_dev_minimal.txt index 1d29404d6c..caa078cc82 100644 --- a/requirements_dev_minimal.txt +++ b/requirements_dev_minimal.txt @@ -1,7 +1,7 @@ # library requirements asciitree==0.3.3 fasteners==0.19 -numcodecs==0.13.0 +numcodecs==0.13.1 msgpack-python==0.5.6 setuptools-scm==8.1.0 # test requirements diff --git a/requirements_dev_numpy.txt b/requirements_dev_numpy.txt index 190610d3d3..4a619aa3ef 100644 --- a/requirements_dev_numpy.txt +++ b/requirements_dev_numpy.txt @@ -1,4 +1,4 @@ # Break this out into a separate file to allow testing against # different versions of numpy. This file should pin to the latest # numpy version. -numpy==2.1.1 +numpy==2.1.2 diff --git a/requirements_dev_optional.txt b/requirements_dev_optional.txt index 9d75d78e44..df1d4fd793 100644 --- a/requirements_dev_optional.txt +++ b/requirements_dev_optional.txt @@ -8,16 +8,16 @@ ipywidgets==8.1.5 # don't let pyup change pinning for azure-storage-blob, need to pin to older # version to get compatibility with azure storage emulator on appveyor (FIXME) azure-storage-blob==12.21.0 # pyup: ignore -redis==5.0.8 +redis==5.1.1 types-redis types-setuptools -pymongo==4.8.0 +pymongo==4.10.1 # optional test requirements coverage pytest-cov==5.0.0 pytest-doctestplus==1.2.1 pytest-timeout==2.3.1 -h5py==3.11.0 +h5py==3.12.1 fsspec==2023.12.2 s3fs==2023.12.2 moto[server]>=5.0.1 diff --git a/zarr/storage.py b/zarr/storage.py index e1a6a4b79e..f7da0210a3 100644 --- a/zarr/storage.py +++ b/zarr/storage.py @@ -1699,7 +1699,6 @@ class NestedDirectoryStore(DirectoryStore): def __init__( self, path, normalize_keys=False, dimension_separator: Optional[DIMENSION_SEPARATOR] = "/" ): - warnings.warn( V3_DEPRECATION_MESSAGE.format(store=self.__class__.__name__), FutureWarning, @@ -2073,6 +2072,8 @@ class DBMStore(Store): `_ package is installed, a Berkeley DB database can be used:: + .. doctest-requires:: bsddb3 + >>> import bsddb3 >>> store = zarr.DBMStore('data/array.bdb', open=bsddb3.btopen) >>> z = zarr.zeros((10, 10), chunks=(5, 5), store=store, overwrite=True)