Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 0 additions & 4 deletions .dialyzer_ignore.exs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,6 @@
{"lib/ex_zarr/telemetry.ex", :contract_supertype},

# Pattern match and coverage warnings - false positives from conditional compilation
{"lib/ex_zarr/codecs.ex", :pattern_match},
{"lib/ex_zarr/codecs.ex", :pattern_match_cov},
{"lib/ex_zarr/codecs/compression_config.ex", :pattern_match_cov},
{"lib/ex_zarr/codecs/registry.ex", :pattern_match_cov},
{"lib/ex_zarr/storage/backend/mongo_gridfs.ex", :pattern_match},

# Callback arg type mismatches - behavior signatures are intentionally flexible
Expand Down
23 changes: 4 additions & 19 deletions .github/RELEASE_CHECKLIST.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,18 @@ Use this checklist when preparing and publishing the release.
- [x] `docs/release_notes_v1_2_0.md` current
- [x] `docs/ROADMAP.md` marks v1.2.0 released; next is v1.3.0
- [x] `docs/INTEROPERABILITY.md` Python interop testing section current
- [x] GitHub org links use **AnimaLogica/ExZarr** (Hex `source_url`, badges, Zig NIF `base_url`)
- [x] GitHub org links use **AnimaLogica/ExZarr** (Hex `source_url`, badges)
- [ ] Examples / showcase reviewed (`examples/range_aware_sharded_nx.exs`)

### Version Numbers
- [x] `mix.exs` → `1.2.0`
- [x] Guides / livebooks / notebooks install snippets → `~> 1.2`
- [x] ZiglerPrecompiled `base_url` → `https://github.com/AnimaLogica/ExZarr/releases/download/v#{version}`
- [ ] `ex_codecs` dependency points at a published release with a complete checksum file
- [x] CHANGELOG comparison links include 1.2.0 / 1.1.0 / 1.0.0

### Testing
- [ ] `mix test`
- [ ] Python interop (see docs/INTEROPERABILITY.md): fixtures + `--include python` for v2 and v3
- [ ] Precompile dry-run locally if changing NIFs (`docs/PRECOMPILATION.md`)

## Git and GitHub

Expand All @@ -39,30 +38,16 @@ Use this checklist when preparing and publishing the release.
- [ ] Push: `git push origin main && git push origin v1.2.0`
- [ ] Confirm tag on https://github.com/AnimaLogica/ExZarr

### Precompiled NIFs
- [ ] Wait for `.github/workflows/precompile.yml` to attach `.tar.gz` assets to the GitHub Release
(targets: linux x86_64/arm64, macOS arm64, Windows x86_64)
- [ ] If a tag already exists and the workflow was fixed after tagging: push the fix, then
`gh workflow run "Build precompiled NIFs" -f release_tag=v1.2.0`
- [ ] Generate checksums:
```bash
EX_ZARR_BUILD=1 mix deps.get
mix zigler_precompiled.download ExZarr.Codecs.ZigCodecs --all --print
```
- [ ] Commit `checksum-ExZarr.Codecs.ZigCodecs.exs`
- [ ] (Optional) mark `zigler` `optional: true` again once checksums ship — see `docs/PRECOMPILATION.md`

### GitHub Release
- [ ] Draft release for tag `v1.2.0`
- [ ] Title: `ExZarr v1.2.0 - Zarr 3.1 Interoperability & Range-Aware Cloud I/O`
- [ ] Body from `.github/RELEASE_ANNOUNCEMENT.md` / `docs/release_notes_v1_2_0.md`
- [ ] Ensure NIF assets from precompile workflow are attached
- [ ] Publish as latest release

## Hex.pm Publication

### Prepare
- [ ] Review `mix.exs` `package/0` (files include `checksum-*.exs`, CHANGELOG, LICENSE)
- [ ] Review `mix.exs` `package/0` (files include lib, CHANGELOG, LICENSE)
- [ ] `mix docs`
- [ ] `mix hex.build` and inspect `ex_zarr-1.2.0.tar`

Expand All @@ -85,7 +70,7 @@ Use this checklist when preparing and publishing the release.
## Rollback Plan (If Needed)

1. **Hex**: `mix hex.retire ex_zarr 1.2.0 --reason security` (or other reason), then publish a patch
2. **GitHub**: mark release as pre-release / yank NIF assets if corrupted; ship hotfix tag
2. **GitHub**: mark release as pre-release; ship hotfix tag
3. **Comms**: update announcement channels and docs with workaround

## Release Date
Expand Down
55 changes: 0 additions & 55 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,19 +42,6 @@ jobs:
# otp: '25.3'

steps:
- name: Install system libraries
run: |
sudo apt-get update
sudo apt-get install -y libzstd-dev liblz4-dev libsnappy-dev libblosc-dev libbz2-dev
- name: Install Zig
uses: goto-bus-stop/setup-zig@v2
with:
version: 0.16.0

- name: Verify Zig toolchain
run: |
echo "ZIG_EXECUTABLE_PATH=$(which zig)" >> "$GITHUB_ENV"
zig version
- name: Checkout code
uses: actions/checkout@v4

Expand Down Expand Up @@ -111,21 +98,6 @@ jobs:
runs-on: ubuntu-latest

steps:
- name: Install system libraries
run: |
sudo apt-get update
sudo apt-get install -y libzstd-dev liblz4-dev libsnappy-dev libblosc-dev libbz2-dev

- name: Install Zig
uses: goto-bus-stop/setup-zig@v2
with:
version: 0.16.0

- name: Verify Zig toolchain
run: |
echo "ZIG_EXECUTABLE_PATH=$(which zig)" >> "$GITHUB_ENV"
zig version

- name: Checkout code
uses: actions/checkout@v4

Expand Down Expand Up @@ -177,21 +149,6 @@ jobs:
MIX_ENV: dev

steps:
- name: Install system libraries
run: |
sudo apt-get update
sudo apt-get install -y libzstd-dev liblz4-dev libsnappy-dev libblosc-dev libbz2-dev

- name: Install Zig
uses: goto-bus-stop/setup-zig@v2
with:
version: 0.16.0

- name: Verify Zig toolchain
run: |
echo "ZIG_EXECUTABLE_PATH=$(which zig)" >> "$GITHUB_ENV"
zig version

- name: Checkout code
uses: actions/checkout@v4

Expand Down Expand Up @@ -273,18 +230,6 @@ jobs:
with:
elixir-version: "1.19.5"
otp-version: "28.3.1"
- name: Install system libraries
run: |
sudo apt-get update
sudo apt-get install -y libzstd-dev liblz4-dev libsnappy-dev libblosc-dev libbz2-dev
- name: Install Zig
uses: goto-bus-stop/setup-zig@v2
with:
version: 0.16.0
- name: Verify Zig
run: |
echo "ZIG_EXECUTABLE_PATH=$(which zig)" >> "$GITHUB_ENV"
zig version
- run: mix deps.get
- name: Read zarr-python fixtures with ExZarr
env:
Expand Down
172 changes: 0 additions & 172 deletions .github/workflows/precompile.yml

This file was deleted.

55 changes: 55 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,60 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added
- `compressor_config:` option for `ExZarr.create/1` (e.g. `[level: 9]`; Blosc
also `cname`, `shuffle`, `typesize`), validated per compressor by the new
`ExZarr.Codecs.CompressorConfig`. v2 arrays store the settings in `.zarray`
in numcodecs form and reuse them after reopening (including arrays created
by zarr-python); v3 arrays store them in the codec configuration. The
option was documented before but never implemented.
- `compressor: :gzip` for Zarr v3 arrays.

### Fixed
- `config :ex_zarr, default_zarr_version` is now applied by `ExZarr.create/1`
and `ExZarr.Nx`. Unset, new arrays remain v2; `ExZarr.Version` previously
documented (and returned) 3 although nothing used it.
- `ExZarr.create/1` rejects unknown compressors, invalid compressor settings
and Zarr versions other than 2 or 3 with an error tuple. Previously an
unknown compressor failed on the first write and an invalid version raised.
- Zarr v3 arrays created with a compressor that has no v3 codec (`:snappy`,
custom codecs without `codecs:`) were silently stored uncompressed; they now
return `{:error, {:unsupported_codec_for_v3, compressor}}`.
- `:zlib` honours a compression `level`.
- v2 `.zarray` compressor levels now record the level ExZarr actually uses
(zlib 6, zstd 3) instead of a fixed 5.

### Changed
- Compression codecs (zstd, lz4, snappy, blosc, bzip2, crc32c) now come from
[ExCodecs](https://hex.pm/packages/ex_codecs) `~> 0.2.4`: pure-Rust NIFs
with precompiled binaries for macOS, Linux (glibc and musl) and Windows.
ExZarr no longer contains native code; Zig, zigler, zigler_precompiled and
system compression libraries are no longer needed.
- `:lz4` writes the numcodecs `LZ4` format (4-byte little-endian size prefix)
and `:bzip2` writes plain bzip2 streams (numcodecs `BZ2`), so zarr-python can
read them. Data written by earlier ExZarr versions (8-byte size prefix) is
still read.
- v2 `.zarray` compressor metadata uses numcodecs configurations: `lz4`
(`acceleration`), `blosc` (`cname`, `clevel`, `shuffle`, `blocksize`) and
`bz2` (previously `bzip2`). The old `bzip2` id is still read. zarr-python can
now open ExZarr v2 arrays compressed with lz4, blosc and bzip2.
- The v3 `blosc` codec honours `cname`, `clevel`, `shuffle` and `typesize` from
its configuration; without them ExZarr keeps BloscLZ, byte shuffle,
typesize 1.
- Decompressed chunks are capped at 256 MiB (`config :ex_zarr,
max_chunk_bytes: ...`) to guard against decompression bombs.
- Minimum OTP is 26 (ExCodecs NIFs target NIF 2.17).
- `ExZarr.Codecs.compress/3` accepts options as a map as well as a keyword list.

### Removed
- `ExZarr.Codecs.ZigCodecs`, `ExZarr.Codecs.CompressionConfig`, the
`fix_nif_rpaths` Mix task, the precompile workflow and
`docs/PRECOMPILATION.md` / `docs/COMPRESSION_SETUP.md`.
- `COMPRESSION_LIB_DIRS`, `HOMEBREW_PREFIX`, `BZIP2_STATIC_LIB`, `ZIG_PATH` and
`EX_ZARR_BUILD` no longer have any effect.

## [1.2.0] - 2026-10-03

### Zarr 3.1 Interoperability & Range-Aware Cloud I/O
Expand Down Expand Up @@ -841,6 +895,7 @@ None - Full backward compatibility maintained with v2 arrays

---

[Unreleased]: https://github.com/AnimaLogica/ExZarr/compare/v1.2.0...HEAD
[1.2.0]: https://github.com/AnimaLogica/ExZarr/releases/tag/v1.2.0
[1.1.0]: https://github.com/AnimaLogica/ExZarr/releases/tag/v1.1.0
[1.0.0]: https://github.com/AnimaLogica/ExZarr/releases/tag/v1.0.0
Expand Down
Loading
Loading