Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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 python/zarrs/_internal.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,3 @@ class WithSubset:
subset: typing.Sequence[slice],
shape: typing.Sequence[builtins.int],
) -> WithSubset: ...

def codec_metadata_v2_to_v3(
filters: typing.Sequence[builtins.str] | None, compressor: builtins.str | None
) -> builtins.list[builtins.str]: ...
29 changes: 3 additions & 26 deletions python/zarrs/pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
from zarr.core.metadata import ArrayMetadata, ArrayV2Metadata, ArrayV3Metadata

if TYPE_CHECKING:
from collections.abc import Generator, Iterable, Iterator
from typing import Any, Self
from collections.abc import Iterable, Iterator
from typing import Self

from zarr.abc.store import ByteGetter, ByteSetter, Store
from zarr.core.array_spec import ArraySpec
Expand All @@ -25,7 +25,7 @@
from zarr.core.indexing import SelectorTuple
from zarr.dtype import ZDType

from ._internal import CodecPipelineImpl, codec_metadata_v2_to_v3
from ._internal import CodecPipelineImpl
from .utils import (
CollapsedDimensionError,
DiscontiguousArrayError,
Expand Down Expand Up @@ -67,29 +67,6 @@ def get_codec_pipeline_impl(
return None


def codecs_to_dict(codecs: Iterable[Codec]) -> Generator[dict[str, Any], None, None]:
for codec in codecs:
if codec.__class__.__name__ == "V2Codec":
codec_dict = codec.to_dict()
if codec_dict.get("filters", None) is not None:
filters = [
json.dumps(filter.get_config())
for filter in codec_dict.get("filters")
]
else:
filters = None
if codec_dict.get("compressor", None) is not None:
compressor_json = codec_dict.get("compressor").get_config()
compressor = json.dumps(compressor_json)
else:
compressor = None
codecs_v3 = codec_metadata_v2_to_v3(filters, compressor)
for codec in codecs_v3:
yield json.loads(codec)
else:
yield codec.to_dict()


class ZarrsCodecPipelineState(TypedDict):
codec_metadata_json: str
codecs: tuple[Codec, ...]
Expand Down
56 changes: 46 additions & 10 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,20 @@ use zarrs::array::codec::{
StoragePartialDecoder,
};
use zarrs::array::{
copy_fill_value_into, update_array_bytes, Array, ArrayBytes, ArrayBytesFixedDisjointView,
copy_fill_value_into, update_array_bytes, ArrayBytes, ArrayBytesFixedDisjointView,
ArrayMetadata, ArraySize, CodecChain, FillValue,
};
use zarrs::array_subset::ArraySubset;
use zarrs::storage::store::MemoryStore;
use zarrs::config::global_config;
use zarrs::metadata::v2::data_type_metadata_v2_to_endianness;
use zarrs::metadata::v3::MetadataV3;
use zarrs::metadata_ext::v2_to_v3::{
codec_metadata_v2_to_v3, data_type_metadata_v2_to_v3, ArrayMetadataV2ToV3Error,
};
use zarrs::storage::{ReadableWritableListableStorage, StorageHandle, StoreKey};

mod chunk_item;
mod concurrency;
mod metadata_v2;
mod runtime;
mod store;
#[cfg(test)]
Expand All @@ -41,7 +45,6 @@ mod utils;

use crate::chunk_item::ChunksItem;
use crate::concurrency::ChunkConcurrentLimitAndCodecOptions;
use crate::metadata_v2::codec_metadata_v2_to_v3;
use crate::store::StoreConfig;
use crate::utils::{PyErrExt as _, PyUntypedArrayExt as _};

Expand Down Expand Up @@ -203,6 +206,41 @@ impl CodecPipelineImpl {
}
}

fn array_metadata_to_codec_metadata_v3(
metadata: ArrayMetadata,
) -> Result<Vec<MetadataV3>, ArrayMetadataV2ToV3Error> {
match metadata {
ArrayMetadata::V3(metadata) => Ok(metadata.codecs),
ArrayMetadata::V2(metadata) => {
let config = global_config();
let (Ok(data_type), endianness) = (
data_type_metadata_v2_to_v3(
&metadata.dtype,
config.data_type_aliases_v2(),
config.data_type_aliases_v3(),
),
data_type_metadata_v2_to_endianness(&metadata.dtype)
.map_err(ArrayMetadataV2ToV3Error::InvalidEndianness)?,
) else {
return Err(ArrayMetadataV2ToV3Error::UnsupportedDataType(
metadata.dtype.clone(),
));
};

codec_metadata_v2_to_v3(
metadata.order,
metadata.shape.len(),
&data_type,
endianness,
&metadata.filters,
&metadata.compressor,
config.codec_aliases_v2(),
config.codec_aliases_v3(),
)
}
}
}

#[gen_stub_pymethods]
#[pymethods]
impl CodecPipelineImpl {
Expand All @@ -226,11 +264,10 @@ impl CodecPipelineImpl {
) -> PyResult<Self> {
let metadata: ArrayMetadata =
serde_json::from_str(array_metadata).map_py_err::<PyTypeError>()?;

// TODO: Add a direct metadata -> codec chain method to zarrs
let store = Arc::new(MemoryStore::new());
let array = Array::new_with_metadata(store, "/", metadata).map_py_err::<PyTypeError>()?;
let codec_chain = Arc::new(array.codecs().clone());
let codec_metadata =
array_metadata_to_codec_metadata_v3(metadata).map_py_err::<PyTypeError>()?;
let codec_chain =
Arc::new(CodecChain::from_metadata(&codec_metadata).map_py_err::<PyTypeError>()?);

let mut codec_options = CodecOptionsBuilder::new();
if let Some(validate_checksums) = validate_checksums {
Expand Down Expand Up @@ -470,7 +507,6 @@ fn _internal(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_class::<CodecPipelineImpl>()?;
m.add_class::<chunk_item::Basic>()?;
m.add_class::<chunk_item::WithSubset>()?;
m.add_function(wrap_pyfunction!(codec_metadata_v2_to_v3, m)?)?;
Ok(())
}

Expand Down
57 changes: 0 additions & 57 deletions src/metadata_v2.rs

This file was deleted.

Loading