Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
5d60db6
fix: complete imagecodecs codec package hints (#4351)
d-v-b Sep 14, 2026
8ff7cb1
fix(indexing): audit factual contracts and close validation gaps (#4345)
d-v-b Sep 14, 2026
1f13742
test(indexing): broaden planner property coverage (#4346)
d-v-b Sep 14, 2026
34dd17c
fix(indexing): validate index-array bounds during JSON loading (#4347)
d-v-b Sep 14, 2026
0de6077
fix(indexing): delegate source tokenization to Dask (#4348)
d-v-b Sep 14, 2026
d6f8483
chore: extract just recipes from hatch replacement proposal
maxrjones Sep 14, 2026
de8e08e
chore: use just for python helpers
maxrjones Sep 14, 2026
b99abc4
chore: centralize development and CI verbs in just
d-v-b Sep 14, 2026
762a17d
chore: delegate package commands to their justfiles
d-v-b Sep 14, 2026
6947dd8
fix(store): retry the LocalStore rename when the destination is busy …
Tomatokeftes Sep 15, 2026
4c61dcf
refactor(store): polish the LocalStore rename retry from #4358 (#4359)
d-v-b Sep 15, 2026
4484a60
docs(blog): zarr 3.4.0 release post (#4355)
d-v-b Sep 15, 2026
292aeb4
docs: 3.4.0 release notes (#4360)
d-v-b Sep 15, 2026
e45e075
ci: keep subpackage pull requests out of generated zarr release notes…
d-v-b Sep 15, 2026
2a704a7
fix(indexing): make every view executable with its source grid (#4349)
d-v-b Sep 16, 2026
b6c592e
feat(indexing): make LazyArray indexing lazy by default (#4350)
d-v-b Sep 16, 2026
9f0ae4e
fix: replace runtime assert statements with explicit checks (#4363)
d-v-b Sep 16, 2026
dfa18e8
fix(zarr-indexing): replace runtime assert statements with explicit c…
d-v-b Sep 16, 2026
b3c5972
fix(zarr-metadata): v2 array document is open and filters may be empt…
d-v-b Sep 16, 2026
b8cc68a
chore(deps): bump the python-dependencies group with 5 updates (#4371)
dependabot[bot] Sep 17, 2026
f2ab3d5
fix(ci): preserve branch zarr in xarray downstream tests (#4368)
glaziermag Sep 17, 2026
df1ff87
fix(ci): harden the just migration's environment, pinning and release…
d-v-b Sep 17, 2026
050e42d
fix(ci): install prek persistently for git hooks; run setup steps in …
d-v-b Sep 17, 2026
4aa6b95
chore: renumber the changelog fragment to the upstream pull request
d-v-b Sep 17, 2026
45da006
Merge branch 'main' into codex/justfile-verbs
d-v-b Sep 17, 2026
20f82f1
chore: update pre-commit hooks (#4231)
pre-commit-ci[bot] Sep 17, 2026
7014615
ci: install just as a binary in the benchmark job
d-v-b Sep 17, 2026
0e801bd
Merge branch 'main' into codex/justfile-verbs
d-v-b Sep 17, 2026
1187a43
chore(deps): bump the actions group across 1 directory with 4 updates…
dependabot[bot] Sep 17, 2026
69fd253
Merge branch 'main' into codex/justfile-verbs
d-v-b Sep 17, 2026
ea82101
ci: install just from official release binaries; lock the docs toolchain
d-v-b Sep 17, 2026
ae41d6e
fix(zarr-metadata)!: make entity types assignable to metadata fields;…
d-v-b Sep 20, 2026
753bd51
Merge branch 'main' into codex/justfile-verbs
d-v-b Sep 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
*.py linguist-language=python
*.ipynb linguist-documentation
.git_archival.txt export-subst

# just refuses to format a CRLF file, so `just just-check` would fail on a Windows
# checkout with core.autocrlf=true before the contributor has changed anything.
Justfile text eol=lf
*/justfile text eol=lf
packages/*/justfile text eol=lf
18 changes: 18 additions & 0 deletions .github/labeler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,21 @@ needs release notes:
- all:
- changed-files:
- all-globs-to-all-files: '!changes/*.md'

# Subpackage labels: a pull request whose changes all live under one package
# directory gets that package's label, which .github/release.yml uses to keep
# subpackage work out of the generated `zarr` release notes.
zarr-metadata:
- all:
- changed-files:
- all-globs-to-all-files: 'packages/zarr-metadata/**'

zarr-indexing:
- all:
- changed-files:
- all-globs-to-all-files: 'packages/zarr-indexing/**'

zarr-http-server:
- all:
- changed-files:
- all-globs-to-all-files: 'packages/zarr-http-server/**'
22 changes: 22 additions & 0 deletions .github/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Configuration for GitHub's "Generate release notes" button.
#
# The zarr-python repository also hosts the companion packages under packages/
# (zarr-metadata, zarr-indexing, zarr-http-server), which have their own release
# cadence, tags and changelogs. Pull requests that only touch a subpackage are
# labelled by the labeler workflow (.github/labeler.yml) and excluded here, so a
# `zarr` release lists only the changes that ship in `zarr`.
changelog:
exclude:
labels:
- zarr-metadata
- zarr-indexing
- zarr-http-server
authors:
- pre-commit-ci[bot]
categories:
- title: Dependency updates
labels:
- dependencies
- title: What's Changed
labels:
- "*"
16 changes: 11 additions & 5 deletions .github/workflows/check_changelogs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,22 @@ jobs:
persist-credentials: false

- name: Install uv
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0

- name: Install just
uses: extractions/setup-crate@7577c1bdf2d95e6d65d532788f35ed79d4b1dda2 # v2.0.1
with:
repo: casey/just
version: 1.58.0

- name: Check zarr-python changelog entries
run: uv run --no-sync python ci/check_changelog_entries.py
run: just check-changelogs

- name: Check zarr-metadata changelog entries
run: uv run --no-sync python ci/check_changelog_entries.py packages/zarr-metadata/changes
run: just check-changelogs packages/zarr-metadata/changes

- name: Check zarr-indexing changelog entries
run: uv run --no-sync python ci/check_changelog_entries.py packages/zarr-indexing/changes
run: just check-changelogs packages/zarr-indexing/changes

- name: Check zarr-http-server changelog entries
run: uv run --no-sync python ci/check_changelog_entries.py packages/zarr-http-server/changes
run: just check-changelogs packages/zarr-http-server/changes
11 changes: 10 additions & 1 deletion .github/workflows/codspeed.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,19 @@ jobs:
uses: pypa/hatch@f647ed70d49adb885f53a27d1c7f5bdaeacf2c60
with:
version: '1.16.5'
# No interpreter is set up in this job on purpose. Benchmarks are only comparable
# across runs if the interpreter underneath them does not move: adding a pinned
# Python here measured a uniform ~13% slowdown on every benchmark, because hatch
# then built the environment on that interpreter instead of the runner's own.
- name: Install just
uses: extractions/setup-crate@7577c1bdf2d95e6d65d532788f35ed79d4b1dda2 # v2.0.1
with:
repo: casey/just
version: 1.58.0
- name: Run the benchmarks
uses: CodSpeedHQ/action@373d6868929f444bc08d901fd0eb0ad52a8875ea # v5.2.1
env:
ZARR_BENCHMARK_CLEAR_CACHE: '1'
with:
mode: walltime
run: hatch run test.py3.12-minimal:pytest tests/benchmarks --codspeed
run: HATCH_ENV=test.py3.12-minimal just benchmark-codspeed
16 changes: 10 additions & 6 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,23 @@ jobs:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
- run: uv sync --group docs
- uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
- name: Install just
uses: extractions/setup-crate@7577c1bdf2d95e6d65d532788f35ed79d4b1dda2 # v2.0.1
with:
repo: casey/just
version: 1.58.0
# Fast source-level guards that need no built site, so they run before the (slower)
# build for a quick failure: every public export is in the API reference, and no
# docstring/Markdown carries reStructuredText markup that MkDocs won't render.
- run: uv run python ci/check_documented_exports.py docs/api
- run: uv run python ci/lint_docs.py
- run: just check-doc-exports
- run: just lint-docs
# --strict turns warnings into errors, so a docs code block that fails to execute
# at build time (e.g. a non-exec python fence disrupting a later exec="true" block)
# fails CI instead of merging as a silent warning.
- run: uv run mkdocs build --strict
- run: just docs-build
env:
DISABLE_MKDOCS_2_WARNING: "true"
NO_MKDOCS_2_WARNING: "true"
- run: uv run python ci/check_unlinked_types.py
- run: just check-doc-links
continue-on-error: true
9 changes: 5 additions & 4 deletions .github/workflows/downstream.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
python-version: '3.13'

- name: Install uv
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0

- name: Install xarray and test dependencies
working-directory: xarray
Expand All @@ -59,18 +59,19 @@ jobs:
working-directory: xarray
run: uv pip install --no-deps ..

# Keep the branch override: syncing xarray would reinstall zarr from PyPI.
- name: Show versions
working-directory: xarray
run: |
uv run python -c "
uv run --no-sync python -c "
import zarr; print(f'zarr {zarr.__version__}')
import xarray; print(f'xarray {xarray.__version__}')
"

- name: Run xarray zarr backend tests
working-directory: xarray
run: |
uv run python -m pytest --no-header -q \
uv run --no-sync python -m pytest --no-header -q \
xarray/tests/test_backends.py \
xarray/tests/test_backends_api.py \
xarray/tests/test_backends_datatree.py
Expand Down Expand Up @@ -102,7 +103,7 @@ jobs:
python-version: '3.13'

- name: Install uv
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0

- name: Install numcodecs with test-zarr-main group
working-directory: numcodecs
Expand Down
17 changes: 12 additions & 5 deletions .github/workflows/gpu_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,22 +62,29 @@ jobs:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- name: Install uv
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
- name: Install Hatch
uses: pypa/hatch@f647ed70d49adb885f53a27d1c7f5bdaeacf2c60
with:
version: '1.16.5'
- name: Install just
uses: extractions/setup-crate@7577c1bdf2d95e6d65d532788f35ed79d4b1dda2 # v2.0.1
with:
repo: casey/just
version: 1.58.0
# Two names for the same environment on purpose: `just setup` builds whatever
# HATCH_ENV points at, while `just gpu` reads GPU_HATCH_ENV so that an
# ambient HATCH_ENV can never redirect `pytest -m gpu` into a CPU environment.
- name: Set Up Hatch Env
env:
HATCH_ENV: gputest.py${{ matrix.python-version }}
run: |
hatch env create "$HATCH_ENV"
hatch env run -e "$HATCH_ENV" list-env
just setup
- name: Run Tests
env:
HATCH_ENV: gputest.py${{ matrix.python-version }}
GPU_HATCH_ENV: gputest.py${{ matrix.python-version }}
run: |
hatch env run --env "$HATCH_ENV" run-coverage
just gpu

- name: Upload coverage
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
Expand Down
12 changes: 8 additions & 4 deletions .github/workflows/hypothesis.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -60,17 +60,21 @@ jobs:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- name: Install uv
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
- name: Install Hatch
uses: pypa/hatch@f647ed70d49adb885f53a27d1c7f5bdaeacf2c60
with:
version: '1.16.5'
- name: Install just
uses: extractions/setup-crate@7577c1bdf2d95e6d65d532788f35ed79d4b1dda2 # v2.0.1
with:
repo: casey/just
version: 1.58.0
- name: Set Up Hatch Env
env:
HATCH_ENV: test.py${{ matrix.python-version }}-${{ matrix.dependency-set }}
run: |
hatch env create "$HATCH_ENV"
hatch env run -e "$HATCH_ENV" list-env
just setup
# https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache
- name: Restore cached hypothesis directory
id: restore-hypothesis-cache
Expand All @@ -89,7 +93,7 @@ jobs:
PYTEST_ADDOPTS: "--report-log=output-${{ matrix.python-version }}-log.jsonl"
run: |
echo "Using Hypothesis profile: $HYPOTHESIS_PROFILE"
hatch env run --env "$HATCH_ENV" run-hypothesis
just hypothesis

# explicitly save the cache so it gets updated, also do this even if it fails.
- name: Save cached hypothesis directory
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/issue-metrics.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
echo "last_month=$first_day..$last_day" >> "$GITHUB_ENV"

- name: Run issue-metrics tool
uses: github-community-projects/issue-metrics@61084fa9599a62c7821f06602e180a42d1c7a205 # v5.0.1
uses: github-community-projects/issue-metrics@a7dc2fb675661e208d4fc6fa321a6b95fc4a06f9 # v5.0.2
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SEARCH_QUERY: 'repo:zarr-developers/zarr-python is:issue created:${{ env.last_month }} -reason:"not planned"'
Expand Down
26 changes: 24 additions & 2 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,29 @@ jobs:
with:
python-version: "3.12"
- name: Install uv
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
with:
enable-cache: true
- uses: j178/prek-action@4e14d07f9231acabce116ccfca13b13dd9755ece # v3.0.0
- name: Install just
uses: extractions/setup-crate@7577c1bdf2d95e6d65d532788f35ed79d4b1dda2 # v2.0.1
with:
repo: casey/just
version: 1.58.0
# `uvx prek` builds each hook's environment from scratch, so cache them the
# way the prek action used to. Keyed on the hook config: a new pinned rev or
# a new hook is exactly when the cached environments stop being valid.
- name: Cache prek hook environments
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ~/.cache/prek
# Justfile is hashed too: prek_version lives there, and a bumped prek
# must not restore a store built by the previous one. No restore-keys
# fallback for the same reason.
key: prek-${{ runner.os }}-${{ hashFiles('.pre-commit-config.yaml', 'Justfile') }}
- name: Lint
run: just lint
- name: Check justfile formatting
# After the linters, and never masking them: this is cosmetic, and a
# mis-formatted recipe should not cost someone their ruff/mypy results.
if: always()
run: just just-check
2 changes: 1 addition & 1 deletion .github/workflows/nightly_wheels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ jobs:
run: hatch build

- name: Upload nightly wheels
uses: scientific-python/upload-nightly-action@e76cfec8a4611fd02808a801b0ff5a7d7c1b2d99
uses: scientific-python/upload-nightly-action@16fa02eacee1655195143de09f03676e60ef2bf5
with:
artifacts_path: dist
anaconda_nightly_upload_token: ${{ secrets.ANACONDA_ORG_UPLOAD_TOKEN }}
44 changes: 31 additions & 13 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,21 +66,25 @@ jobs:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- name: Install uv
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
- name: Install Hatch
run: python -m pip install hatch==1.16.5
- name: Install just
uses: extractions/setup-crate@7577c1bdf2d95e6d65d532788f35ed79d4b1dda2 # v2.0.1
with:
repo: casey/just
version: 1.58.0
- name: Set Up Hatch Env
env:
HATCH_ENV: test.py${{ matrix.python-version }}-${{ matrix.dependency-set }}
run: |
hatch env create "$HATCH_ENV"
hatch env run -e "$HATCH_ENV" list-env
just setup
- name: Run Tests
env:
HYPOTHESIS_PROFILE: ci
HATCH_ENV: test.py${{ matrix.python-version }}-${{ matrix.dependency-set }}
run: |
hatch env run --env "$HATCH_ENV" run-coverage
just coverage
- name: Upload coverage
if: ${{ matrix.dependency-set == 'optional' && matrix.os == 'ubuntu-latest' }}
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
Expand Down Expand Up @@ -115,20 +119,24 @@ jobs:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- name: Install uv
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
- name: Install Hatch
run: python -m pip install hatch==1.16.5
- name: Install just
uses: extractions/setup-crate@7577c1bdf2d95e6d65d532788f35ed79d4b1dda2 # v2.0.1
with:
repo: casey/just
version: 1.58.0
- name: Set Up Hatch Env
env:
HATCH_ENV: ${{ matrix.dependency-set }}
run: |
hatch env create "$HATCH_ENV"
hatch env run -e "$HATCH_ENV" list-env
just setup
- name: Run Tests
env:
HATCH_ENV: ${{ matrix.dependency-set }}
run: |
hatch env run --env "$HATCH_ENV" run-coverage
just coverage
- name: Upload coverage
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
with:
Expand All @@ -150,15 +158,20 @@ jobs:
python-version: '3.13'
cache: 'pip'
- name: Install uv
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
- name: Install Hatch
run: python -m pip install hatch==1.16.5
- name: Install just
uses: extractions/setup-crate@7577c1bdf2d95e6d65d532788f35ed79d4b1dda2 # v2.0.1
with:
repo: casey/just
version: 1.58.0
- name: Set Up Hatch Env
run: |
hatch run doctest:pip list
HATCH_ENV=doctest just setup
- name: Run Tests
run: |
hatch run doctest:test
just doctest

benchmarks:
name: Benchmark smoke test
Expand All @@ -174,14 +187,19 @@ jobs:
python-version: '3.13'
cache: 'pip'
- name: Install uv
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
- name: Install Hatch
run: python -m pip install hatch==1.16.5
- name: Install just
uses: extractions/setup-crate@7577c1bdf2d95e6d65d532788f35ed79d4b1dda2 # v2.0.1
with:
repo: casey/just
version: 1.58.0
- name: Run Benchmarks
env:
ZARR_BENCHMARK_CLEAR_CACHE: '1'
run: |
hatch env run --env "test.py3.13-minimal" run-benchmark
HATCH_ENV=test.py3.13-minimal just benchmark

test-complete:
name: Test complete
Expand Down
Loading
Loading