@@ -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+             parsed_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+ 
44774539def  _parse_chunk_key_encoding (
44784540    data : ChunkKeyEncodingLike  |  None , zarr_format : ZarrFormat 
44794541) ->  ChunkKeyEncoding :
0 commit comments