Skip to content

Commit e014b29

Browse files
authored
Merge branch 'main' into keyword-only
2 parents 97de8dd + 455b4f9 commit e014b29

4 files changed

Lines changed: 37 additions & 4 deletions

File tree

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ repos:
4949
- id: rst-directive-colons
5050
- id: rst-inline-touching-normal
5151
- repo: https://github.com/numpy/numpydoc
52-
rev: v1.8.0
52+
rev: v1.9.0
5353
hooks:
5454
- id: numpydoc-validation
5555
- repo: https://github.com/twisted/towncrier

changes/3233.feature.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add an alternate `from_array_metadata_and_store` constructor to `CodecPipeline`.

src/zarr/abc/codec.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@
1212
from collections.abc import Awaitable, Callable, Iterable
1313
from typing import Self
1414

15-
from zarr.abc.store import ByteGetter, ByteSetter
15+
from zarr.abc.store import ByteGetter, ByteSetter, Store
1616
from zarr.core.array_spec import ArraySpec
1717
from zarr.core.chunk_grids import ChunkGrid
1818
from zarr.core.dtype.wrapper import TBaseDType, TBaseScalar, ZDType
1919
from zarr.core.indexing import SelectorTuple
20+
from zarr.core.metadata import ArrayMetadata
2021

2122
__all__ = [
2223
"ArrayArrayCodec",
@@ -281,6 +282,25 @@ def from_codecs(cls, codecs: Iterable[Codec]) -> Self:
281282
"""
282283
...
283284

285+
@classmethod
286+
def from_array_metadata_and_store(cls, array_metadata: ArrayMetadata, store: Store) -> Self:
287+
"""Creates a codec pipeline from array metadata and a store path.
288+
289+
Raises NotImplementedError by default, indicating the CodecPipeline must be created with from_codecs instead.
290+
291+
Parameters
292+
----------
293+
array_metadata : ArrayMetadata
294+
store : Store
295+
296+
Returns
297+
-------
298+
Self
299+
"""
300+
raise NotImplementedError(
301+
f"'{type(cls).__name__}' does not implement CodecPipeline.from_array_metadata_and_store."
302+
)
303+
284304
@property
285305
@abstractmethod
286306
def supports_partial_decode(self) -> bool: ...

src/zarr/core/array.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,15 @@ def parse_array_metadata(data: Any) -> ArrayMetadata:
191191
raise TypeError # pragma: no cover
192192

193193

194-
def create_codec_pipeline(metadata: ArrayMetadata) -> CodecPipeline:
194+
def create_codec_pipeline(metadata: ArrayMetadata, *, store: Store | None = None) -> CodecPipeline:
195+
if store is not None:
196+
try:
197+
return get_pipeline_class().from_array_metadata_and_store(
198+
array_metadata=metadata, store=store
199+
)
200+
except NotImplementedError:
201+
pass
202+
195203
if isinstance(metadata, ArrayV3Metadata):
196204
return get_pipeline_class().from_codecs(metadata.codecs)
197205
elif isinstance(metadata, ArrayV2Metadata):
@@ -310,7 +318,11 @@ def __init__(
310318
object.__setattr__(self, "metadata", metadata_parsed)
311319
object.__setattr__(self, "store_path", store_path)
312320
object.__setattr__(self, "_config", config_parsed)
313-
object.__setattr__(self, "codec_pipeline", create_codec_pipeline(metadata=metadata_parsed))
321+
object.__setattr__(
322+
self,
323+
"codec_pipeline",
324+
create_codec_pipeline(metadata=metadata_parsed, store=store_path.store),
325+
)
314326

315327
# this overload defines the function signature when zarr_format is 2
316328
@overload

0 commit comments

Comments
 (0)