Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
8d01860
chore: Pre-commit hook for multi-character lstrip/rstrip (#3756)
maxrjones Mar 10, 2026
a89b927
docs: use dark text color on light mode search bar (#3760)
maxrjones Mar 11, 2026
1cb1cce
docs: add example of creating uncompressed arrays (#3464) (#3752)
abishop1990 Mar 11, 2026
fa61ed8
fix: BaseFloat._check_scalar rejects invalid string values (#3586) (#…
abishop1990 Mar 11, 2026
a02d996
docs: fix docstring for Array.cdata_shape (#3768)
maxrjones Mar 12, 2026
93dbf78
fix: apply drop_axes squeeze in partial decode path for sharding (#36…
abishop1990 Mar 13, 2026
1bfa53f
docs: add favicon (#3775)
maxrjones Mar 13, 2026
fccf372
fix: validate that dask-style chunks have regular shapes (#3779)
maxrjones Mar 16, 2026
7c78574
docs: add glossary (#3767)
maxrjones Mar 16, 2026
46654ad
docs: fix search color (#3777)
maxrjones Mar 16, 2026
03355b8
perf/store sync (#3725)
d-v-b Mar 16, 2026
65e1375
Remove `rich` as required for `tree()` (#3778)
ianhi Mar 17, 2026
536ce9d
chore: less frequent codspeed runs (#3784)
maxrjones Mar 17, 2026
4acebeb
Add missing slash character to towncrier issue format (#3788)
d-v-b Mar 19, 2026
a323ac7
doc: add ai use policy to contributing guide (#3769)
jhamman Mar 19, 2026
9a71d59
chore/towncrier header (#3789)
d-v-b Mar 19, 2026
8116454
chore: Use OIDC for publishing (#3791)
maxrjones Mar 19, 2026
25ee087
chore/3.1.6 release notes (#3790)
d-v-b Mar 19, 2026
420f11c
Rename the `DimensionNames` type to `DimensionNamesLike`. (#3800)
d-v-b Mar 20, 2026
afd95d9
fix #3773: Fix divergent behavior between MemoryStore and LocalStore …
Mar 21, 2026
427df3b
docs: remove incorrect redirect (#3801)
maxrjones Mar 21, 2026
93dd0e4
fix: handle special uint32 arrays on Windows correctly (#3797)
radoering Mar 21, 2026
a0e61fe
Merge branch 'main' into issue-3773-store-divergence
abishop1990 Mar 22, 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
14 changes: 5 additions & 9 deletions .github/workflows/codspeed.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
name: CodSpeed Benchmarks

on:
push:
branches:
- "main"
schedule:
- cron: '0 9 * * 1' # Every Monday at 9am UTC
pull_request:
types: [labeled, synchronize]
# `workflow_dispatch` allows CodSpeed to trigger backtest
# performance analysis in order to generate initial data.
types: [labeled]
workflow_dispatch:

permissions:
Expand All @@ -17,15 +14,14 @@ jobs:
benchmarks:
name: Run benchmarks
runs-on: codspeed-macro
# Only run benchmarks for: pushes to main, manual triggers, or PRs with 'benchmark' label
if: |
github.event_name == 'push' ||
github.event_name == 'schedule' ||
github.event_name == 'workflow_dispatch' ||
(github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'benchmark'))
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0 # grab all branches and tags
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v6
with:
Expand Down
24 changes: 18 additions & 6 deletions .github/workflows/releases.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ on:
permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:

build_artifacts:
Expand All @@ -35,7 +39,7 @@ jobs:
version: '1.16.5'
- name: Build wheel and sdist
run: hatch build
- uses: actions/upload-artifact@v6
- uses: actions/upload-artifact@v7
with:
name: releases
path: dist
Expand All @@ -55,16 +59,24 @@ jobs:
ls dist

upload_pypi:
needs: [build_artifacts]
needs: [build_artifacts, test_dist_pypi]
runs-on: ubuntu-latest
if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v')
environment:
name: releases
url: https://pypi.org/p/zarr
permissions:
id-token: write
attestations: write
artifact-metadata: write
steps:
- uses: actions/download-artifact@v7
with:
name: releases
path: dist
- uses: pypa/gh-action-pypi-publish@v1.13.0
- name: Generate artifact attestation
uses: actions/attest@v4
with:
user: __token__
password: ${{ secrets.pypi_password }}
# To test: repository_url: https://test.pypi.org/legacy/
subject-path: dist/*
- name: Publish package to PyPI
uses: pypa/gh-action-pypi-publish@v1.13.0
9 changes: 9 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,15 @@ repos:
rev: v1.10.0
hooks:
- id: numpydoc-validation
- repo: local
hooks:
- id: ban-lstrip-rstrip
name: ban lstrip/rstrip
language: pygrep
# Matches .lstrip() or .rstrip() where the string argument is 2+ characters.
entry: "\\.(lstrip|rstrip)\\([\"'][^\"']{2,}[\"']\\)"
types: [python]
files: ^(src|tests)/
- repo: https://github.com/twisted/towncrier
rev: 25.8.0
hooks:
Expand Down
1 change: 0 additions & 1 deletion changes/3562.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3603.bugfix.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3605.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3619.misc.md

This file was deleted.

5 changes: 0 additions & 5 deletions changes/3623.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3636.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3648.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3655.bugfix.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3656.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3657.bugfix.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3658.misc.md

This file was deleted.

4 changes: 0 additions & 4 deletions changes/3668.feature.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3673.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3695.bugfix.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3700.bugfix.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3702.bugfix.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3704.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3705.bugfix.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3706.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3708.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3710.bugfix.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3712.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3713.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3717.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3721.misc.md

This file was deleted.

1 change: 0 additions & 1 deletion changes/3728.misc.md

This file was deleted.

5 changes: 5 additions & 0 deletions changes/3773.bugfix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Fix divergent behavior between `MemoryStore` and `LocalStore` `list_prefix` methods.

Both stores now consistently use string prefix matching (checking if keys start with the given prefix string),
rather than `LocalStore` treating the prefix as a filesystem directory path. This ensures consistent
behavior across different store implementations and aligns with the documented behavior of `list_prefix`.
2 changes: 2 additions & 0 deletions changes/3797.bugfix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix an issue that prevents the correct parsing of special NumPy ``uint32`` dtypes resulting e.g.
from bit wise operations on ``uint32`` arrays on Windows.
Binary file added docs/_static/favicon-96x96.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
26 changes: 26 additions & 0 deletions docs/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,32 @@ If you have an idea about a new feature or some other improvement to Zarr, pleas

We very much welcome ideas and suggestions for how to improve Zarr, but please bear in mind that we are likely to be conservative in accepting proposals for new features. The reasons for this are that we would like to keep the Zarr code base lean and focused on a core set of functionalities, and available time for development, review and maintenance of new features is limited. But if you have a great idea, please don't let that stop you from posting it on GitHub, just please don't be offended if we respond cautiously.

## AI-assisted contributions

AI coding tools are increasingly common in open source development. These tools are welcome in Zarr-Python, but the same standards apply to all contributions regardless of how they were produced — whether written by hand, with AI assistance, or generated entirely by an AI tool.

### You are responsible for your changes

If you submit a pull request, you are responsible for understanding and having fully reviewed the changes. You must be able to explain why each change is correct and how it fits into the project.

### Communication must be your own

PR descriptions, issue comments, and review responses must be in your own words. The substance and reasoning must come from you. Using AI to polish grammar or phrasing is fine, but do not paste AI-generated text as comments or review responses.

### Review every line

You must have personally reviewed and understood all changes before submitting. If you used AI to generate code, you are expected to have read it critically and tested it. The PR description should explain the approach and reasoning — do not leave it to reviewers to figure out what the code does and why.

### Keep PRs reviewable

Generating code with AI is fast; reviewing it is not. A large diff shifts the burden from the contributor to the reviewer. PRs that cannot be reviewed in reasonable time with reasonable effort may be closed, regardless of their potential usefulness or correctness. Use AI tools not only to write code but to prepare better, more reviewable PRs — well-structured commits, clear descriptions, and minimal scope.

If you are planning a large AI-assisted contribution (e.g., a significant refactor or a new subsystem), **open an issue first** to discuss the scope and approach with maintainers. Maintainers may also request that large changes be broken into smaller, reviewable pieces.

### Documentation

The same principles apply to documentation. Zarr has domain-specific semantics (chunked storage, codec pipelines, Zarr v2/v3 format details) that AI tools frequently get wrong. Do not submit documentation that you haven't carefully read and verified.

## Contributing code and/or documentation

### Forking the repository
Expand Down
9 changes: 2 additions & 7 deletions docs/overrides/stylesheets/extra.css
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,10 @@
color: white;
}

/* Search box styling */
.md-search__input {
/* Search box styling in the header */
.md-header .md-search__input {
background-color: rgba(255, 255, 255, 0.15);
border: 1px solid rgba(255, 255, 255, 0.2);
color: white;
}

.md-search__input::placeholder {
color: rgba(255, 255, 255, 0.7);
}

/* Navigation tabs */
Expand Down
38 changes: 37 additions & 1 deletion docs/release-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,43 @@

<!-- towncrier release notes start -->

# zarr 3.1.5 (2025-11-21)
## 3.1.6 (2026-03-19)

### Features

- Exposes the array runtime configuration as an attribute called `config` on the `Array` and
`AsyncArray` classes. The previous `AsyncArray._config` attribute is now a deprecated alias for `AsyncArray.config`. ([#3668](https://github.com/zarr-developers/zarr-python/issues/3668))
- Adds a method for creating a new `Array` / `AsyncArray` instance with a new runtime configuration, and fixes inaccurate documentation about the `write_empty_chunks` configuration parameter. ([#3668](https://github.com/zarr-developers/zarr-python/issues/3668))
- Adds synchronous methods to stores that do not benefit from an async event loop. The shape of these methods is defined by protocol classes to support structural subtyping. ([#3725](https://github.com/zarr-developers/zarr-python/pull/3725))
- Fix near-miss penalty in `_morton_order` with hybrid ceiling+argsort strategy. ([#3718](https://github.com/zarr-developers/zarr-python/pull/3718))

### Bugfixes

- Correct the target bytes number for auto-chunking when auto-sharding. ([#3603](https://github.com/zarr-developers/zarr-python/issues/3603))
- Fixed a bug in the sharding codec that prevented nested shard reads in certain cases. ([#3655](https://github.com/zarr-developers/zarr-python/issues/3655))
- Fix obstore `_transform_list_dir` implementation to correctly relativize paths (removing `lstrip` usage). ([#3657](https://github.com/zarr-developers/zarr-python/issues/3657))
- Raise error when trying to encode :class:`numpy.dtypes.StringDType` with `na_object` set. ([#3695](https://github.com/zarr-developers/zarr-python/issues/3695))
- `CacheStore`, `LoggingStore` and `LatencyStore` now support with_read_only. ([#3700](https://github.com/zarr-developers/zarr-python/issues/3700))
- Skip chunk coordinate enumeration in resize when the array is only growing, avoiding unbounded memory usage for large arrays. ([#3702](https://github.com/zarr-developers/zarr-python/issues/3702))
- Fix a performance bug in morton curve generation. ([#3705](https://github.com/zarr-developers/zarr-python/issues/3705))
- Add a dedicated in-memory cache for byte-range requests to the experimental `CacheStore`. ([#3710](https://github.com/zarr-developers/zarr-python/issues/3710))
- `BaseFloat._check_scalar` rejects invalid string values. ([#3586](https://github.com/zarr-developers/zarr-python/issues/3586))
- Apply drop_axes squeeze in partial decode path for sharding. ([#3763](https://github.com/zarr-developers/zarr-python/issues/3763))
- Set `copy=False` in reshape operation. ([#3649](https://github.com/zarr-developers/zarr-python/issues/3649))
- Validate that dask-style chunks have regular shapes. ([#3779](https://github.com/zarr-developers/zarr-python/issues/3779))

### Improved Documentation

- Add documentation example for creating uncompressed arrays in the Compression section of the user guide. ([#3464](https://github.com/zarr-developers/zarr-python/issues/3464))
- Add AI-assisted code policy to the contributing guide. ([#3769](https://github.com/zarr-developers/zarr-python/issues/3769))
- Added a glossary. ([#3767](https://github.com/zarr-developers/zarr-python/issues/3767))

### Misc

- [#3562](https://github.com/zarr-developers/zarr-python/issues/3562), [#3605](https://github.com/zarr-developers/zarr-python/issues/3605), [#3619](https://github.com/zarr-developers/zarr-python/issues/3619), [#3623](https://github.com/zarr-developers/zarr-python/issues/3623), [#3636](https://github.com/zarr-developers/zarr-python/issues/3636), [#3648](https://github.com/zarr-developers/zarr-python/issues/3648), [#3656](https://github.com/zarr-developers/zarr-python/issues/3656), [#3658](https://github.com/zarr-developers/zarr-python/issues/3658), [#3673](https://github.com/zarr-developers/zarr-python/issues/3673), [#3704](https://github.com/zarr-developers/zarr-python/issues/3704), [#3706](https://github.com/zarr-developers/zarr-python/issues/3706), [#3708](https://github.com/zarr-developers/zarr-python/issues/3708), [#3712](https://github.com/zarr-developers/zarr-python/issues/3712), [#3713](https://github.com/zarr-developers/zarr-python/issues/3713), [#3717](https://github.com/zarr-developers/zarr-python/issues/3717), [#3721](https://github.com/zarr-developers/zarr-python/issues/3721), [#3728](https://github.com/zarr-developers/zarr-python/issues/3728), [#3778](https://github.com/zarr-developers/zarr-python/issues/3778)


## zarr 3.1.5 (2025-11-21)

## Bugfixes

Expand Down
7 changes: 7 additions & 0 deletions docs/user-guide/arrays.md
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,13 @@ print(z.info_complete())
If you don't specify a compressor, by default Zarr uses the Zstandard
compressor.

To create an array without any compression, set `compressors=None`:

```python exec="true" session="arrays" source="above" result="ansi"
z_no_compress = zarr.create_array(store='data/example-uncompressed.zarr', shape=(10000, 10000), chunks=(1000, 1000), dtype='int32', compressors=None)
print(f"Compressors: {z_no_compress.compressors}")
```

In addition to Blosc and Zstandard, other compression libraries can also be used. For example,
here is an array using Gzip compression, level 1:

Expand Down
Loading
Loading