Part of #20. Depends on #21.
Goal
adata convert data.h5ad -o data.zarr [--zarr-format 2|3]
adata convert data.zarr -o data.h5ad
This already works implicitly through adata subset in.h5ad -o out.zarr, which proves copy_store_contents handles every backend pair. A dedicated, discoverable command is what's missing.
Plan
- Thin converter over
storage.copy_store_contents.
- Keep the source's chunking and compression by default; add
--rechunk and --compressor for zarr targets.
- Write consolidated metadata for zarr targets.
- zarr v3 by default from an h5ad source (existing behaviour); follow the source format for zarr → zarr.
- Refuse
-o - and output == input.
Tests
- All six pairings of h5ad / zarr2 / zarr3.
- Open the result with
anndata.read_zarr / read_h5ad under the integration marker.
- Perf guard: one read per chunk, no full materialisation.
Part of #20. Depends on #21.
Goal
This already works implicitly through
adata subset in.h5ad -o out.zarr, which provescopy_store_contentshandles every backend pair. A dedicated, discoverable command is what's missing.Plan
storage.copy_store_contents.--rechunkand--compressorfor zarr targets.-o -and output == input.Tests
anndata.read_zarr/read_h5adunder theintegrationmarker.