ngio 0.4.8__py3-none-any.whl → 0.5.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ngio/utils/_zarr_utils.py CHANGED
@@ -6,9 +6,10 @@ from typing import Literal
6
6
  import fsspec
7
7
  import zarr
8
8
  from filelock import BaseFileLock, FileLock
9
- from zarr.errors import ContainsGroupError, GroupNotFoundError
10
- from zarr.storage import DirectoryStore, FSStore, MemoryStore, Store, StoreLike
11
- from zarr.types import DIMENSION_SEPARATOR
9
+ from zarr.abc.store import Store
10
+ from zarr.core.array import CompressorLike
11
+ from zarr.errors import ContainsGroupError
12
+ from zarr.storage import FsspecStore, LocalStore, MemoryStore
12
13
 
13
14
  from ngio.utils import NgioFileExistsError, NgioFileNotFoundError, NgioValueError
14
15
  from ngio.utils._errors import NgioError
@@ -18,7 +19,7 @@ AccessModeLiteral = Literal["r", "r+", "w", "w-", "a"]
18
19
  # but to make sure we can handle the store correctly
19
20
  # we need to be more restrictive
20
21
  NgioSupportedStore = (
21
- str | Path | fsspec.mapping.FSMap | FSStore | DirectoryStore | MemoryStore
22
+ str | Path | fsspec.mapping.FSMap | FsspecStore | MemoryStore | LocalStore
22
23
  )
23
24
  GenericStore = Store | NgioSupportedStore
24
25
  StoreOrGroup = GenericStore | zarr.Group
@@ -37,25 +38,29 @@ def _check_store(store) -> NgioSupportedStore:
37
38
 
38
39
  def _check_group(group: zarr.Group, mode: AccessModeLiteral) -> zarr.Group:
39
40
  """Check the group and return a valid group."""
40
- is_read_only = getattr(group, "_read_only", False)
41
- if is_read_only and mode in ["w", "w-"]:
41
+ if group.read_only and mode in ["w", "w-"]:
42
42
  raise NgioValueError(
43
43
  "The group is read only. Cannot open in write mode ['w', 'w-']"
44
44
  )
45
45
 
46
- if mode == "r" and not is_read_only:
46
+ if mode == "r" and not group.read_only:
47
47
  # let's make sure we don't accidentally write to the group
48
48
  group = zarr.open_group(store=group.store, path=group.path, mode="r")
49
49
 
50
50
  return group
51
51
 
52
52
 
53
- def open_group_wrapper(store: StoreOrGroup, mode: AccessModeLiteral) -> zarr.Group:
53
+ def open_group_wrapper(
54
+ store: StoreOrGroup,
55
+ mode: AccessModeLiteral,
56
+ zarr_format: Literal[2, 3] | None = None,
57
+ ) -> zarr.Group:
54
58
  """Wrapper around zarr.open_group with some additional checks.
55
59
 
56
60
  Args:
57
61
  store (StoreOrGroup): The store or group to open.
58
- mode (ReadOrEdirLiteral): The mode to open the group in.
62
+ mode (AccessModeLiteral): The mode to open the group in.
63
+ zarr_format (int): The Zarr format version to use.
59
64
 
60
65
  Returns:
61
66
  zarr.Group: The opened Zarr group.
@@ -67,16 +72,21 @@ def open_group_wrapper(store: StoreOrGroup, mode: AccessModeLiteral) -> zarr.Gro
67
72
 
68
73
  try:
69
74
  _check_store(store)
70
- group = zarr.open_group(store=store, mode=mode)
75
+ group = zarr.open_group(store=store, mode=mode, zarr_format=zarr_format)
71
76
 
72
- except ContainsGroupError as e:
77
+ except FileExistsError as e:
73
78
  raise NgioFileExistsError(
74
79
  f"A Zarr group already exists at {store}, consider setting overwrite=True."
75
80
  ) from e
76
81
 
77
- except GroupNotFoundError as e:
82
+ except FileNotFoundError as e:
78
83
  raise NgioFileNotFoundError(f"No Zarr group found at {store}") from e
79
84
 
85
+ except ContainsGroupError as e:
86
+ raise NgioFileExistsError(
87
+ f"A Zarr group already exists at {store}, consider setting overwrite=True."
88
+ ) from e
89
+
80
90
  return group
81
91
 
82
92
 
@@ -86,6 +96,7 @@ class ZarrGroupHandler:
86
96
  def __init__(
87
97
  self,
88
98
  store: StoreOrGroup,
99
+ zarr_format: Literal[2, 3] | None = None,
89
100
  cache: bool = False,
90
101
  mode: AccessModeLiteral = "a",
91
102
  parallel_safe: bool = False,
@@ -96,6 +107,7 @@ class ZarrGroupHandler:
96
107
  Args:
97
108
  store (StoreOrGroup): The Zarr store or group containing the image data.
98
109
  meta_mode (str): The mode of the metadata handler.
110
+ zarr_format (int): The Zarr format version to use.
99
111
  cache (bool): Whether to cache the metadata.
100
112
  mode (str): The mode of the store.
101
113
  parallel_safe (bool): If True, the handler will create a lock file to make
@@ -112,20 +124,24 @@ class ZarrGroupHandler:
112
124
  "If you want to use the lock mechanism, you should not use the cache."
113
125
  )
114
126
 
115
- group = open_group_wrapper(store, mode)
127
+ group = open_group_wrapper(store=store, mode=mode, zarr_format=zarr_format)
116
128
  _store = group.store
117
129
 
118
130
  # Make sure the cache is set in the attrs
119
131
  # in the same way as the cache in the handler
120
- group.attrs.cache = cache
132
+
133
+ ## TODO
134
+ # Figure out how to handle the cache in the new zarr version
135
+ # group.attrs.cache = cache
121
136
 
122
137
  if parallel_safe:
123
- if not isinstance(_store, DirectoryStore):
138
+ if not isinstance(_store, LocalStore):
124
139
  raise NgioValueError(
125
- "The store needs to be a DirectoryStore to use the lock mechanism. "
140
+ "The store needs to be a LocalStore to use the lock mechanism. "
126
141
  f"Instead, got {_store.__class__.__name__}."
127
142
  )
128
- store_path = Path(_store.path) / group.path
143
+
144
+ store_path = _store.root / group.path
129
145
  self._lock_path = store_path.with_suffix(".lock")
130
146
  self._lock = FileLock(self._lock_path, timeout=10)
131
147
 
@@ -148,23 +164,28 @@ class ZarrGroupHandler:
148
164
  )
149
165
 
150
166
  @property
151
- def store(self) -> StoreLike:
167
+ def store(self) -> Store:
152
168
  """Return the store of the group."""
153
- return self.group.store
169
+ return self._group.store
154
170
 
155
171
  @property
156
172
  def full_url(self) -> str | None:
157
173
  """Return the store path."""
158
- if isinstance(self.store, DirectoryStore | FSStore):
159
- _store_path = str(self.store.path)
160
- _store_path = _store_path.rstrip("/")
161
- return f"{self.store.path}/{self._group.path}"
174
+ if isinstance(self.store, LocalStore):
175
+ return (self.store.root / self.group.path).as_posix()
176
+ if isinstance(self.store, FsspecStore):
177
+ return self.store.fs.map.root_path
162
178
  return None
163
179
 
180
+ @property
181
+ def zarr_format(self) -> Literal[2, 3]:
182
+ """Return the Zarr format version."""
183
+ return self._group.metadata.zarr_format
184
+
164
185
  @property
165
186
  def mode(self) -> AccessModeLiteral:
166
187
  """Return the mode of the group."""
167
- return self._mode # type: ignore (return type is Literal)
188
+ return self._mode # type: ignore
168
189
 
169
190
  @property
170
191
  def lock(self) -> BaseFileLock:
@@ -195,9 +216,30 @@ class ZarrGroupHandler:
195
216
 
196
217
  raise NgioValueError("The lock is still in use. Cannot remove it.")
197
218
 
219
+ def reopen_group(self) -> zarr.Group:
220
+ """Reopen the group.
221
+
222
+ This is useful when the group has been modified
223
+ outside of the handler.
224
+ """
225
+ if self.mode == "r":
226
+ mode = "r"
227
+ else:
228
+ mode = "r+"
229
+ return zarr.open_group(
230
+ store=self._group.store,
231
+ path=self._group.path,
232
+ mode=mode,
233
+ zarr_format=self._group.metadata.zarr_format,
234
+ )
235
+
198
236
  @property
199
237
  def group(self) -> zarr.Group:
200
238
  """Return the group."""
239
+ if self._parallel_safe:
240
+ # If we are parallel safe, we need to reopen the group
241
+ # to make sure that the attributes are up to date
242
+ return self.reopen_group()
201
243
  return self._group
202
244
 
203
245
  def add_to_cache(self, key: str, value: object) -> None:
@@ -229,8 +271,7 @@ class ZarrGroupHandler:
229
271
 
230
272
  def _write_attrs(self, attrs: dict, overwrite: bool = False) -> None:
231
273
  """Write the metadata to the store."""
232
- is_read_only = getattr(self._group, "_read_only", False)
233
- if is_read_only:
274
+ if self.group.read_only:
234
275
  raise NgioValueError("The group is read only. Cannot write metadata.")
235
276
 
236
277
  # we need to invalidate the current attrs cache
@@ -342,23 +383,34 @@ class ZarrGroupHandler:
342
383
  path: str,
343
384
  shape: tuple[int, ...],
344
385
  dtype: str,
345
- chunks: tuple[int, ...] | None = None,
346
- dimension_separator: DIMENSION_SEPARATOR = "/",
347
- compressor: str = "default",
386
+ chunks: tuple[int, ...] | Literal["auto"] = "auto",
387
+ compressors: CompressorLike = "auto",
388
+ separator: Literal[".", "/"] = "/",
348
389
  overwrite: bool = False,
349
390
  ) -> zarr.Array:
350
391
  if self.mode == "r":
351
392
  raise NgioValueError("Cannot create an array in read only mode.")
352
393
 
394
+ if self.zarr_format == 2:
395
+ chunks_encoding = {
396
+ "name": "v2",
397
+ "separator": separator,
398
+ }
399
+ else:
400
+ chunks_encoding = {
401
+ "name": "default",
402
+ "separator": separator,
403
+ }
404
+
353
405
  try:
354
- return self.group.zeros(
406
+ return self.group.create_array(
355
407
  name=path,
356
408
  shape=shape,
357
409
  dtype=dtype,
358
410
  chunks=chunks,
359
- dimension_separator=dimension_separator,
360
- compressor=compressor,
411
+ chunk_key_encoding=chunks_encoding,
361
412
  overwrite=overwrite,
413
+ compressors=compressors,
362
414
  )
363
415
  except ContainsGroupError as e:
364
416
  raise NgioFileExistsError(
@@ -382,6 +434,7 @@ class ZarrGroupHandler:
382
434
  group = self.get_group(path, create_mode=True, overwrite=overwrite)
383
435
  return ZarrGroupHandler(
384
436
  store=group,
437
+ zarr_format=self.zarr_format,
385
438
  cache=self.use_cache,
386
439
  mode=self.mode,
387
440
  parallel_safe=self._parallel_safe,
@@ -413,3 +466,26 @@ class ZarrGroupHandler:
413
466
  f"Error copying group to {handler.full_url}, "
414
467
  f"#{n_skipped} files where skipped."
415
468
  )
469
+
470
+
471
+ def find_dimension_separator(array: zarr.Array) -> Literal[".", "/"]:
472
+ """Find the dimension separator used in the Zarr store.
473
+
474
+ Args:
475
+ array (zarr.Array): The Zarr array to check.
476
+
477
+ Returns:
478
+ Literal[".", "/"]: The dimension separator used in the store.
479
+ """
480
+ from zarr.core.chunk_key_encodings import DefaultChunkKeyEncoding
481
+
482
+ if array.metadata.zarr_format == 2:
483
+ separator = array.metadata.dimension_separator
484
+ else:
485
+ separator = array.metadata.chunk_key_encoding
486
+ if not isinstance(separator, DefaultChunkKeyEncoding):
487
+ raise ValueError(
488
+ "Only DefaultChunkKeyEncoding is supported in this example."
489
+ )
490
+ separator = separator.separator
491
+ return separator
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ngio
3
- Version: 0.4.8
3
+ Version: 0.5.0a1
4
4
  Summary: Next Generation file format IO
5
5
  Project-URL: homepage, https://github.com/BioVisionCenter/ngio
6
6
  Project-URL: repository, https://github.com/BioVisionCenter/ngio
@@ -16,20 +16,20 @@ Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Typing :: Typed
17
17
  Requires-Python: <3.14,>=3.11
18
18
  Requires-Dist: aiohttp
19
- Requires-Dist: anndata<0.11.4,>=0.8.0
20
- Requires-Dist: dask[array]<2025.11.0
21
- Requires-Dist: dask[distributed]<2025.11.0
19
+ Requires-Dist: anndata
20
+ Requires-Dist: dask[array]
21
+ Requires-Dist: dask[distributed]
22
22
  Requires-Dist: filelock
23
23
  Requires-Dist: numpy
24
24
  Requires-Dist: ome-zarr-models
25
- Requires-Dist: pandas<3.0.0,>=1.2.0
25
+ Requires-Dist: pandas>=1.2.0
26
26
  Requires-Dist: pillow
27
27
  Requires-Dist: polars
28
28
  Requires-Dist: pooch
29
29
  Requires-Dist: pyarrow
30
30
  Requires-Dist: pydantic
31
31
  Requires-Dist: requests
32
- Requires-Dist: zarr<3
32
+ Requires-Dist: zarr>3
33
33
  Provides-Extra: dev
34
34
  Requires-Dist: devtools; extra == 'dev'
35
35
  Requires-Dist: matplotlib; extra == 'dev'
@@ -2,7 +2,7 @@ ngio/__init__.py,sha256=rEgnXuU6TCejUUGsxt4eKmjMhxjYh0fYBxWF4o5YjbE,1435
2
2
  ngio/common/__init__.py,sha256=aPSuUbdGryrxbnlWrsVNe3LZoBAWC4GijR1BNH1UwuU,612
3
3
  ngio/common/_dimensions.py,sha256=w8PYgyWxA8hgJETjFbw5CXf7WrasCL5FbzgfL1in86M,11361
4
4
  ngio/common/_masking_roi.py,sha256=ZZTXordEZoq_ADk0OzADvq-5dPOwUBSuNobzFR8fpTw,5697
5
- ngio/common/_pyramid.py,sha256=Wxj8RXSWWEPm5ILqvga484Hd2j3IQ4tGzHZsL5WSOuo,8446
5
+ ngio/common/_pyramid.py,sha256=186eQSCxP_x2heYKmMP_Edl4Aml9Eo1bBmIHlwslqy8,8699
6
6
  ngio/common/_roi.py,sha256=9fKFTHoUiP0xmxvQiFkNmIuwWg3bFuRaAx-froCSqvA,11487
7
7
  ngio/common/_synt_images_utils.py,sha256=B6uYOW1NyrM06YMR-csca3_YnAAkPRTbvnbLdy9tk9E,3188
8
8
  ngio/common/_zoom.py,sha256=U01c-vqXjzZkrpd9Yvs24frVfTls_xPJeeaFCGmUwYI,6727
@@ -18,12 +18,12 @@ ngio/hcs/__init__.py,sha256=G8j9vD-liLeB_UeGtKYIgshWvJnUA6ks9GwjvWBLdHs,357
18
18
  ngio/hcs/_plate.py,sha256=qfRwbCKaoz_AWTi8RDFFwOxy5geSknfJrPcqFVno9zI,44288
19
19
  ngio/images/__init__.py,sha256=9Whvt7GTiCgT_vXaEEqGnDaY1-UsRk3dhLTv091F_g4,1211
20
20
  ngio/images/_abstract_image.py,sha256=hrB9xn4MFRxnxE1d7HKnM8SXVPUGhMD9u32yBHTsFiU,18517
21
- ngio/images/_create.py,sha256=61cuco2jUK25WzOY-Sel9s931FtGPL2ut25L9W10bJ4,10171
22
- ngio/images/_create_synt_container.py,sha256=il_rr5_2KIQ5Xsskj2rb2fEm100ZErZq89aW06kn_7k,5444
23
- ngio/images/_image.py,sha256=aMJb-YDghbZIHfSzY8ZoTmScEOqNfWQzJFO2AoMCdF4,33053
24
- ngio/images/_label.py,sha256=Se3ZpgXDArtLHPlx9pw8Rnr5pZ_sEkmbeMh9sU63ncg,11799
21
+ ngio/images/_create.py,sha256=OirIKg843CCSiwy_oUolX2UHlROR_iO4rN_IK47jDWc,10448
22
+ ngio/images/_create_synt_container.py,sha256=D3SkjYN_AZ5fSefjEX0iQ3ZGEuBTWZvuPQIwHc6l-CU,5519
23
+ ngio/images/_image.py,sha256=JWN7qmNVZxAzm9zmaImYseDt8xzYtOw-N0olR6VQo_8,33483
24
+ ngio/images/_label.py,sha256=sJUB8of7t1YErZRu3t7jzGjlRn3KAAs0EL5nFrbvvlc,11921
25
25
  ngio/images/_masked_image.py,sha256=YhbBzgPZMav6rX0WYue1BaxAzEIsfaQrxUIOK6ZWZcw,18848
26
- ngio/images/_ome_zarr_container.py,sha256=UJERXEgBkwclpLaHzWqUIQc6P-TG4zYuKuxPukJGa4Y,38433
26
+ ngio/images/_ome_zarr_container.py,sha256=tfG40PLNfyfaR2pVAmGINlkKJRoQ4W0L0melFotMcP8,38737
27
27
  ngio/images/_table_ops.py,sha256=jFv_AMqoB4JBpoWsMtZppZVW7dAOC_u-JpfNm8b33kY,15292
28
28
  ngio/io_pipes/__init__.py,sha256=arW_7GWzZs82kPNKdm_6B1sIDFV0lWwp-ZaORr9Q1FQ,2412
29
29
  ngio/io_pipes/_io_pipes.py,sha256=KuwMYofE11EKx0iplWXBQZ-eE1A9YpGDprWh98cUlAI,10710
@@ -37,17 +37,20 @@ ngio/io_pipes/_ops_slices_utils.py,sha256=xjDaCVGmtME5Q0XSmGrY3nUKYgw5jOBQZW4YDq
37
37
  ngio/io_pipes/_ops_transforms.py,sha256=uITs6v6sZ7DQ_Hpw3JdX8MuPOzir-bihvGzY84Qn4wY,2934
38
38
  ngio/io_pipes/_zoom_transform.py,sha256=WBY1tO6_Qhf8FaDujfTdipuuqFf7PSi204wx5VKKs88,6884
39
39
  ngio/ome_zarr_meta/__init__.py,sha256=tzxW2oVhfeMBVuv3XkcbOLzMnbDvUnie-AVsvSxRkdE,1265
40
- ngio/ome_zarr_meta/_meta_handlers.py,sha256=ctknNDT8jxwyvxQf9on5gW31H1tRRsnneO38GT2UXoE,25880
40
+ ngio/ome_zarr_meta/_meta_handlers.py,sha256=P2Edraf2MlTMlwFOpXCkUqD1QTN2nTwGv5Ff0ab5csw,26715
41
41
  ngio/ome_zarr_meta/ngio_specs/__init__.py,sha256=U2FqZR91Ob2N6CqKdyw-_Ll-wMgmGuPZGVRCr6wuRFY,1698
42
42
  ngio/ome_zarr_meta/ngio_specs/_axes.py,sha256=gNzxCddn53m9dlNJlV5CL-aQS-nGJrbCDGfAp5L97LY,16412
43
43
  ngio/ome_zarr_meta/ngio_specs/_channels.py,sha256=TDxIy-yVc2YaWPIFJRYnYwZbA8O5Ee_OiWppHYrEdpU,16647
44
44
  ngio/ome_zarr_meta/ngio_specs/_dataset.py,sha256=CrHnjVWBGYPqErKkHR-E2DKrE3DmGznXMkd3Y9Z4uYo,3434
45
45
  ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py,sha256=N1CGPOubwf0pvm8tiTnh-C1cOu9lToyDe3WagnEnPN4,17207
46
- ngio/ome_zarr_meta/ngio_specs/_ngio_image.py,sha256=XmqeffYRspBZmv8gCrfJvnykmBViWgDo2AtJJkR7OEs,15886
46
+ ngio/ome_zarr_meta/ngio_specs/_ngio_image.py,sha256=y44AVdB7IQD9t5yiZV6cXSvV9_-CGDiYrCfX3PeaclQ,16231
47
47
  ngio/ome_zarr_meta/ngio_specs/_pixel_size.py,sha256=4VF1djY9T5tp6GCJXppFrUJwALI1XgIm0imoM5rNvdE,3876
48
48
  ngio/ome_zarr_meta/v04/__init__.py,sha256=dJRzzxyYc81kf-0Hip_bqvbdManaM8XTdQX2meWyCSs,583
49
49
  ngio/ome_zarr_meta/v04/_custom_models.py,sha256=5GxiDERvLuvq4QvApcA6EiKLS6hLFX1R0R_9rSaa85A,530
50
- ngio/ome_zarr_meta/v04/_v04_spec_utils.py,sha256=OFMAKYvjhgCRhN_RNs8mJmOtyFHuw3k-lqOOrTRXvzU,15764
50
+ ngio/ome_zarr_meta/v04/_v04_spec_utils.py,sha256=xa3DT7VJJZyd-4EB-KGjlPcKkTmst_izTcoWj30mLiY,15766
51
+ ngio/ome_zarr_meta/v05/__init__.py,sha256=j6YuIKu2bxmhlhFCbhXg5UA4qD7V8CpyTAHl1vnIpq8,583
52
+ ngio/ome_zarr_meta/v05/_custom_models.py,sha256=ZN3bE9nwx4y3tElhsYafI4S2zp_WzdkQKcyuuBiaXXo,530
53
+ ngio/ome_zarr_meta/v05/_v05_spec_utils.py,sha256=vd9-EiZZjBpCXmwgLj8a1RWiwFpSjjxKBfbH8OpsG9M,16493
51
54
  ngio/resources/__init__.py,sha256=4E4TXTNYEgRHt26C1XcC4pPobJJsmZRYm1Ml4uAuAkE,1664
52
55
  ngio/resources/resource_model.py,sha256=eE1m0dyk-2psPC4X8Ifyan524QHUOd52TEQdvoU0m8I,861
53
56
  ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/mask.png,sha256=g3QmxQdmeciAtBe5cTCRfR6yw3keG9cBYfjizMo6EGo,11890
@@ -55,31 +58,31 @@ ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/nuclei.png,sha
55
58
  ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/raw.jpg,sha256=82lejQAIokj5w9g-qqhysDTWpHtNvJTkdURG_BjqIxQ,37743
56
59
  ngio/tables/__init__.py,sha256=_BV3sclNMLITu_J8_3DkkUrCB6Kro0HzeWLDCD1ivKM,877
57
60
  ngio/tables/_abstract_table.py,sha256=rwGa47TzbFmosucBWVfFq6JEXtgGvOdUVtU9DIelV88,8204
58
- ngio/tables/_tables_container.py,sha256=jB3iVlUnJdMIBUqfuZDtPkiEI9haL19Bz-QfJ0BUwl4,12176
61
+ ngio/tables/_tables_container.py,sha256=3xmpREaN671l40MPprnl1BD-VoOb6xfjECb5mNoMW0w,12173
59
62
  ngio/tables/backends/__init__.py,sha256=MwSRXNF1rWQBFOTDA_vT3oGoNZpviVgytsL5Txnu08I,1619
60
- ngio/tables/backends/_abstract_backend.py,sha256=54Vh9yPfLx1NixGVfFkW4msD51nsim0zIfHRnO80Xt8,7276
61
- ngio/tables/backends/_anndata.py,sha256=97RWG4Hjc42JBxm-YxjHEU8HHd14NiayelKlI1PTsCo,2868
62
- ngio/tables/backends/_anndata_utils.py,sha256=HsmP27fm7JW1kjahl4lUnnViK_iqmu2bnsu86z43U98,3116
63
+ ngio/tables/backends/_abstract_backend.py,sha256=M1ogsBpWBiQMV65YweZhA845PAtkzG2BsZCPN_7Xp8U,7613
64
+ ngio/tables/backends/_anndata.py,sha256=KBzXVxaXstVx3ofcLYYFm8ECVFDaHxfUWcKdg5vQPqY,2992
65
+ ngio/tables/backends/_anndata_utils.py,sha256=g0mIfihXd4p75bvMvCYTljBKTP13EZ9p_SVMifDKE3Y,3208
63
66
  ngio/tables/backends/_csv.py,sha256=Ev61D-AUKo4LIhXRmWPJgYbHI7eQdxiajQR574DevEM,932
64
67
  ngio/tables/backends/_json.py,sha256=1ZsEuXDJm1rOZV_KjFm8CB0qhv7L1W7L2EGWPf4q_p0,3137
65
- ngio/tables/backends/_non_zarr_backends.py,sha256=BybUl800pqCdqJJmsGnUi4jsH1ibpQSUl0ZnumkFDwY,7298
68
+ ngio/tables/backends/_non_zarr_backends.py,sha256=5a1fbxiVnUXt1tiA025BqN0T7SQJvIERFtQHp4PhFHw,7294
66
69
  ngio/tables/backends/_parquet.py,sha256=ic-p86h8lce8q9luBJGRzy6vxlWyJvA0-2l5cUD6OqY,1398
67
70
  ngio/tables/backends/_table_backends.py,sha256=ksP2NAosXZkNMZf-IMrLx7bjQgp_eKfvPYK4vMdT1A8,7250
68
- ngio/tables/backends/_utils.py,sha256=YFB7u2_l8lLAK_jrmlSfzH-2sOAFaDP1bmeUfuNo7YM,19719
71
+ ngio/tables/backends/_utils.py,sha256=t4dLXSPxx2AnJvVtj0GIwrLoO11h4Ges6U7hj4md0hY,19730
69
72
  ngio/tables/v1/__init__.py,sha256=Wr1_9RZFpaN8FYMTnxT9Yjkw4AS7y9FMWailmB_uj5g,617
70
73
  ngio/tables/v1/_condition_table.py,sha256=T0Uq5BKkmMoEspt_Rx0U99Ow6S9GAMZDHqvUO5obCAM,1780
71
74
  ngio/tables/v1/_feature_table.py,sha256=n9uMHwoBh-_dlOhUXCFbmAjXFVXncNCR3SjE2qzXI68,3821
72
75
  ngio/tables/v1/_generic_table.py,sha256=1ktJHeuv7U1g5Z8PFUuTkCjOzcYMQd8xegKHKUedJB8,1240
73
- ngio/tables/v1/_roi_table.py,sha256=b7lwjsdCSUOCMT6Lx4hwAqGBKC25Q5bdzoK3DQWnAQM,17074
76
+ ngio/tables/v1/_roi_table.py,sha256=g7UpMmpf3uAfaG59WYRnimUBgiB_T1qUJRwMZpMt9cI,17099
74
77
  ngio/transforms/__init__.py,sha256=JA0-Ui7skbXkm9ofN-AEhU1FTLutkMkwTdVD-310frQ,113
75
78
  ngio/transforms/_zoom.py,sha256=otyE-vxFnywUJ8U4mHjat-bNG_7_jv62ckTpqDMxyVQ,550
76
79
  ngio/utils/__init__.py,sha256=XPYh8ehC7uXNU2cFFXZAw-S3DpWpX1Yq2xGkffZv5vI,1142
77
- ngio/utils/_datasets.py,sha256=YOV367skFA8nbKAqbyK0EsUU7E9UId_u5ButuLesrzk,5896
80
+ ngio/utils/_datasets.py,sha256=6GtxfPkjutNaeg5BHuJDBP0GudvQXHLU6mmHp_o0bGA,5650
78
81
  ngio/utils/_errors.py,sha256=pKQ12LUjQLYE1nUawemA5h7HsgznjaSvV1n2PQU33N0,759
79
82
  ngio/utils/_fractal_fsspec_store.py,sha256=RdcCFOgHexRKX9zZvJV5RI-5OPc7VOPS6q_IeRxm24I,1548
80
83
  ngio/utils/_logger.py,sha256=N5W0a_xwze4blS1MolidBkTMbjTbg8GPguJZNun3mAE,1392
81
- ngio/utils/_zarr_utils.py,sha256=GUOcAx02IcfrJ5tIdKu8ChtRUUaBbkkddW5jaCCYnS8,13797
82
- ngio-0.4.8.dist-info/METADATA,sha256=Z01svPND2BsHMW6i-PYzEQNiSZI-YEgvWnVHmbEZHhk,6144
83
- ngio-0.4.8.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
84
- ngio-0.4.8.dist-info/licenses/LICENSE,sha256=UgN_a1QCeNh9rZWfz-wORQFxE3elQzLWPQaoK6N6fxQ,1502
85
- ngio-0.4.8.dist-info/RECORD,,
84
+ ngio/utils/_zarr_utils.py,sha256=ATehiEALPI__eNQSWdSW5PpJLmI2FECrexA9jTZAI2s,16103
85
+ ngio-0.5.0a1.dist-info/METADATA,sha256=AT0kbnHlYkhiL0_AmZpOm8DagaEPGCkI1xze_cJy3w8,6104
86
+ ngio-0.5.0a1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
87
+ ngio-0.5.0a1.dist-info/licenses/LICENSE,sha256=UgN_a1QCeNh9rZWfz-wORQFxE3elQzLWPQaoK6N6fxQ,1502
88
+ ngio-0.5.0a1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.28.0
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any