Skip to content

Commit 9782aed

Browse files
committed
extract _parse_keep_array_attr from from_array
1 parent df7a8ee commit 9782aed

File tree

1 file changed

+108
-46
lines changed

1 file changed

+108
-46
lines changed

src/zarr/core/array.py

Lines changed: 108 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3984,52 +3984,30 @@ async def from_array(
39843984
config_parsed = parse_array_config(config)
39853985
store_path = await make_store_path(store, path=name, mode=mode, storage_options=storage_options)
39863986

3987-
if isinstance(data, Array):
3988-
if chunks == "keep":
3989-
chunks = data.chunks
3990-
if shards == "keep":
3991-
shards = data.shards
3992-
if zarr_format is None:
3993-
zarr_format = data.metadata.zarr_format
3994-
if filters == "keep":
3995-
if zarr_format == data.metadata.zarr_format:
3996-
filters = data.filters or None
3997-
else:
3998-
filters = "auto"
3999-
if compressors == "keep":
4000-
if zarr_format == data.metadata.zarr_format:
4001-
compressors = data.compressors or None
4002-
else:
4003-
compressors = "auto"
4004-
if serializer == "keep":
4005-
if zarr_format == 3 and data.metadata.zarr_format == 3:
4006-
serializer = cast(SerializerLike, data.serializer)
4007-
else:
4008-
serializer = "auto"
4009-
if fill_value is None:
4010-
fill_value = data.fill_value
4011-
if order is None:
4012-
order = data.order
4013-
if chunk_key_encoding is None and zarr_format == data.metadata.zarr_format:
4014-
if isinstance(data.metadata, ArrayV2Metadata):
4015-
chunk_key_encoding = {"name": "v2", "separator": data.metadata.dimension_separator}
4016-
elif isinstance(data.metadata, ArrayV3Metadata):
4017-
chunk_key_encoding = data.metadata.chunk_key_encoding
4018-
if dimension_names is None and data.metadata.zarr_format == 3:
4019-
dimension_names = data.metadata.dimension_names
4020-
else:
4021-
if chunks == "keep":
4022-
chunks = "auto"
4023-
if shards == "keep":
4024-
shards = None
4025-
if zarr_format is None:
4026-
zarr_format = 3
4027-
if filters == "keep":
4028-
filters = "auto"
4029-
if compressors == "keep":
4030-
compressors = "auto"
4031-
if serializer == "keep":
4032-
serializer = "auto"
3987+
(
3988+
chunks,
3989+
shards,
3990+
filters,
3991+
compressors,
3992+
serializer,
3993+
fill_value,
3994+
order,
3995+
zarr_format,
3996+
chunk_key_encoding,
3997+
dimension_names,
3998+
) = _parse_keep_array_attr(
3999+
data=data,
4000+
chunks=chunks,
4001+
shards=shards,
4002+
filters=filters,
4003+
compressors=compressors,
4004+
serializer=serializer,
4005+
fill_value=fill_value,
4006+
order=order,
4007+
zarr_format=zarr_format,
4008+
chunk_key_encoding=chunk_key_encoding,
4009+
dimension_names=dimension_names,
4010+
)
40334011
if not hasattr(data, "dtype") or not hasattr(data, "shape"):
40344012
data = np.array(data)
40354013

@@ -4474,6 +4452,90 @@ async def create_array(
44744452
return AsyncArray(metadata=meta, store_path=store_path, config=config_parsed)
44754453

44764454

4455+
def _parse_keep_array_attr(
4456+
data: Array | npt.ArrayLike,
4457+
chunks: Literal["auto", "keep"] | ChunkCoords,
4458+
shards: ShardsLike | None | Literal["keep"],
4459+
filters: FiltersLike | Literal["keep"],
4460+
compressors: CompressorsLike | Literal["keep"],
4461+
serializer: SerializerLike | Literal["keep"],
4462+
fill_value: Any | None,
4463+
order: MemoryOrder | None,
4464+
zarr_format: ZarrFormat | None,
4465+
chunk_key_encoding: ChunkKeyEncodingLike | None,
4466+
dimension_names: Iterable[str] | None,
4467+
) -> tuple[
4468+
ChunkCoords | Literal["auto"],
4469+
ShardsLike | None,
4470+
FiltersLike,
4471+
CompressorsLike,
4472+
SerializerLike,
4473+
Any | None,
4474+
MemoryOrder | None,
4475+
ZarrFormat,
4476+
ChunkKeyEncodingLike | None,
4477+
Iterable[str] | None,
4478+
]:
4479+
if isinstance(data, Array):
4480+
if chunks == "keep":
4481+
chunks = data.chunks
4482+
if shards == "keep":
4483+
shards = data.shards
4484+
if zarr_format is None:
4485+
zarr_format = data.metadata.zarr_format
4486+
if filters == "keep":
4487+
if zarr_format == data.metadata.zarr_format:
4488+
filters = data.filters or None
4489+
else:
4490+
filters = "auto"
4491+
if compressors == "keep":
4492+
if zarr_format == data.metadata.zarr_format:
4493+
compressors = data.compressors or None
4494+
else:
4495+
compressors = "auto"
4496+
if serializer == "keep":
4497+
if zarr_format == 3 and data.metadata.zarr_format == 3:
4498+
serializer = cast(SerializerLike, data.serializer)
4499+
else:
4500+
serializer = "auto"
4501+
if fill_value is None:
4502+
fill_value = data.fill_value
4503+
if order is None:
4504+
order = data.order
4505+
if chunk_key_encoding is None and zarr_format == data.metadata.zarr_format:
4506+
if isinstance(data.metadata, ArrayV2Metadata):
4507+
chunk_key_encoding = {"name": "v2", "separator": data.metadata.dimension_separator}
4508+
elif isinstance(data.metadata, ArrayV3Metadata):
4509+
chunk_key_encoding = data.metadata.chunk_key_encoding
4510+
if dimension_names is None and data.metadata.zarr_format == 3:
4511+
dimension_names = data.metadata.dimension_names
4512+
else:
4513+
if chunks == "keep":
4514+
chunks = "auto"
4515+
if shards == "keep":
4516+
shards = None
4517+
if zarr_format is None:
4518+
zarr_format = 3
4519+
if filters == "keep":
4520+
filters = "auto"
4521+
if compressors == "keep":
4522+
compressors = "auto"
4523+
if serializer == "keep":
4524+
serializer = "auto"
4525+
return (
4526+
chunks,
4527+
shards,
4528+
filters,
4529+
compressors,
4530+
serializer,
4531+
fill_value,
4532+
order,
4533+
zarr_format,
4534+
chunk_key_encoding,
4535+
dimension_names,
4536+
)
4537+
4538+
44774539
def _parse_chunk_key_encoding(
44784540
data: ChunkKeyEncodingLike | None, zarr_format: ZarrFormat
44794541
) -> ChunkKeyEncoding:

0 commit comments

Comments
 (0)