ngio 0.4.8__tar.gz → 0.5.0a1__tar.gz

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.
Files changed (261) hide show
  1. {ngio-0.4.8 → ngio-0.5.0a1}/.github/workflows/build_docs.yml +2 -2
  2. {ngio-0.4.8 → ngio-0.5.0a1}/.github/workflows/ci.yml +4 -4
  3. {ngio-0.4.8 → ngio-0.5.0a1}/CHANGELOG.md +0 -11
  4. {ngio-0.4.8 → ngio-0.5.0a1}/PKG-INFO +6 -6
  5. {ngio-0.4.8 → ngio-0.5.0a1}/pyproject.toml +6 -6
  6. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/common/_pyramid.py +41 -28
  7. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/images/_create.py +23 -16
  8. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/images/_create_synt_container.py +9 -8
  9. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/images/_image.py +26 -16
  10. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/images/_label.py +15 -15
  11. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/images/_ome_zarr_container.py +29 -29
  12. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/ome_zarr_meta/_meta_handlers.py +29 -0
  13. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/ome_zarr_meta/ngio_specs/_ngio_image.py +12 -1
  14. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/ome_zarr_meta/v04/_v04_spec_utils.py +2 -2
  15. ngio-0.5.0a1/src/ngio/ome_zarr_meta/v05/__init__.py +23 -0
  16. ngio-0.5.0a1/src/ngio/ome_zarr_meta/v05/_custom_models.py +18 -0
  17. ngio-0.5.0a1/src/ngio/ome_zarr_meta/v05/_v05_spec_utils.py +518 -0
  18. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/_tables_container.py +3 -3
  19. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/backends/_abstract_backend.py +7 -0
  20. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/backends/_anndata.py +4 -1
  21. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/backends/_anndata_utils.py +4 -1
  22. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/backends/_non_zarr_backends.py +6 -6
  23. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/backends/_utils.py +1 -1
  24. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/v1/_roi_table.py +3 -3
  25. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/utils/_datasets.py +0 -6
  26. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/utils/_zarr_utils.py +108 -32
  27. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/common/test_pyramid.py +2 -2
  28. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/tables/test_backends.py +1 -1
  29. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/tables/test_table_group.py +1 -1
  30. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/utils/test_zarr_utils.py +7 -6
  31. {ngio-0.4.8 → ngio-0.5.0a1}/.copier-answers.yml +0 -0
  32. {ngio-0.4.8 → ngio-0.5.0a1}/.gitattributes +0 -0
  33. {ngio-0.4.8 → ngio-0.5.0a1}/.github/ISSUE_TEMPLATE.md +0 -0
  34. {ngio-0.4.8 → ngio-0.5.0a1}/.github/TEST_FAIL_TEMPLATE.md +0 -0
  35. {ngio-0.4.8 → ngio-0.5.0a1}/.github/dependabot.yml +0 -0
  36. {ngio-0.4.8 → ngio-0.5.0a1}/.github/pull_request_template.md +0 -0
  37. {ngio-0.4.8 → ngio-0.5.0a1}/.gitignore +0 -0
  38. {ngio-0.4.8 → ngio-0.5.0a1}/.pre-commit-config.yaml +0 -0
  39. {ngio-0.4.8 → ngio-0.5.0a1}/LICENSE +0 -0
  40. {ngio-0.4.8 → ngio-0.5.0a1}/README.md +0 -0
  41. {ngio-0.4.8 → ngio-0.5.0a1}/_typos.toml +0 -0
  42. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/hcs.md +0 -0
  43. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/images.md +0 -0
  44. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/iterators.md +0 -0
  45. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/ngio/common.md +0 -0
  46. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/ngio/hcs.md +0 -0
  47. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/ngio/images.md +0 -0
  48. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/ngio/io_pipes.md +0 -0
  49. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/ngio/iterators.md +0 -0
  50. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/ngio/ngio.md +0 -0
  51. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/ngio/tables.md +0 -0
  52. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/ngio/transforms.md +0 -0
  53. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/ngio/utils.md +0 -0
  54. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/ome_zarr_container.md +0 -0
  55. {ngio-0.4.8 → ngio-0.5.0a1}/docs/api/tables.md +0 -0
  56. {ngio-0.4.8 → ngio-0.5.0a1}/docs/changelog.md +0 -0
  57. {ngio-0.4.8 → ngio-0.5.0a1}/docs/code_of_conduct.md +0 -0
  58. {ngio-0.4.8 → ngio-0.5.0a1}/docs/contributing.md +0 -0
  59. {ngio-0.4.8 → ngio-0.5.0a1}/docs/getting_started/0_quickstart.md +0 -0
  60. {ngio-0.4.8 → ngio-0.5.0a1}/docs/getting_started/1_ome_zarr_containers.md +0 -0
  61. {ngio-0.4.8 → ngio-0.5.0a1}/docs/getting_started/2_images.md +0 -0
  62. {ngio-0.4.8 → ngio-0.5.0a1}/docs/getting_started/3_tables.md +0 -0
  63. {ngio-0.4.8 → ngio-0.5.0a1}/docs/getting_started/4_masked_images.md +0 -0
  64. {ngio-0.4.8 → ngio-0.5.0a1}/docs/getting_started/5_hcs.md +0 -0
  65. {ngio-0.4.8 → ngio-0.5.0a1}/docs/getting_started/6_iterators.md +0 -0
  66. {ngio-0.4.8 → ngio-0.5.0a1}/docs/index.md +0 -0
  67. {ngio-0.4.8 → ngio-0.5.0a1}/docs/table_specs/backend.md +0 -0
  68. {ngio-0.4.8 → ngio-0.5.0a1}/docs/table_specs/overview.md +0 -0
  69. {ngio-0.4.8 → ngio-0.5.0a1}/docs/table_specs/table_types/condition_table.md +0 -0
  70. {ngio-0.4.8 → ngio-0.5.0a1}/docs/table_specs/table_types/custom_table.md +0 -0
  71. {ngio-0.4.8 → ngio-0.5.0a1}/docs/table_specs/table_types/feature_table.md +0 -0
  72. {ngio-0.4.8 → ngio-0.5.0a1}/docs/table_specs/table_types/generic_table.md +0 -0
  73. {ngio-0.4.8 → ngio-0.5.0a1}/docs/table_specs/table_types/masking_roi_table.md +0 -0
  74. {ngio-0.4.8 → ngio-0.5.0a1}/docs/table_specs/table_types/roi_table.md +0 -0
  75. {ngio-0.4.8 → ngio-0.5.0a1}/docs/tutorials/create_ome_zarr.ipynb +0 -0
  76. {ngio-0.4.8 → ngio-0.5.0a1}/docs/tutorials/feature_extraction.ipynb +0 -0
  77. {ngio-0.4.8 → ngio-0.5.0a1}/docs/tutorials/hcs_exploration.ipynb +0 -0
  78. {ngio-0.4.8 → ngio-0.5.0a1}/docs/tutorials/image_processing.ipynb +0 -0
  79. {ngio-0.4.8 → ngio-0.5.0a1}/docs/tutorials/image_segmentation.ipynb +0 -0
  80. {ngio-0.4.8 → ngio-0.5.0a1}/mkdocs.yml +0 -0
  81. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/__init__.py +0 -0
  82. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/common/__init__.py +0 -0
  83. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/common/_dimensions.py +0 -0
  84. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/common/_masking_roi.py +0 -0
  85. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/common/_roi.py +0 -0
  86. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/common/_synt_images_utils.py +0 -0
  87. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/common/_zoom.py +0 -0
  88. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/experimental/__init__.py +0 -0
  89. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/experimental/iterators/__init__.py +0 -0
  90. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/experimental/iterators/_abstract_iterator.py +0 -0
  91. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/experimental/iterators/_feature.py +0 -0
  92. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/experimental/iterators/_image_processing.py +0 -0
  93. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/experimental/iterators/_mappers.py +0 -0
  94. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/experimental/iterators/_rois_utils.py +0 -0
  95. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/experimental/iterators/_segmentation.py +0 -0
  96. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/hcs/__init__.py +0 -0
  97. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/hcs/_plate.py +0 -0
  98. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/images/__init__.py +0 -0
  99. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/images/_abstract_image.py +0 -0
  100. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/images/_masked_image.py +0 -0
  101. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/images/_table_ops.py +0 -0
  102. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/io_pipes/__init__.py +0 -0
  103. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/io_pipes/_io_pipes.py +0 -0
  104. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/io_pipes/_io_pipes_masked.py +0 -0
  105. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/io_pipes/_io_pipes_roi.py +0 -0
  106. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/io_pipes/_io_pipes_types.py +0 -0
  107. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/io_pipes/_match_shape.py +0 -0
  108. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/io_pipes/_ops_axes.py +0 -0
  109. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/io_pipes/_ops_slices.py +0 -0
  110. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/io_pipes/_ops_slices_utils.py +0 -0
  111. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/io_pipes/_ops_transforms.py +0 -0
  112. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/io_pipes/_zoom_transform.py +0 -0
  113. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/ome_zarr_meta/__init__.py +0 -0
  114. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/ome_zarr_meta/ngio_specs/__init__.py +0 -0
  115. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/ome_zarr_meta/ngio_specs/_axes.py +0 -0
  116. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/ome_zarr_meta/ngio_specs/_channels.py +0 -0
  117. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/ome_zarr_meta/ngio_specs/_dataset.py +0 -0
  118. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py +0 -0
  119. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/ome_zarr_meta/ngio_specs/_pixel_size.py +0 -0
  120. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/ome_zarr_meta/v04/__init__.py +0 -0
  121. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/ome_zarr_meta/v04/_custom_models.py +0 -0
  122. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/mask.png +0 -0
  123. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/nuclei.png +0 -0
  124. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/raw.jpg +0 -0
  125. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/resources/__init__.py +0 -0
  126. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/resources/resource_model.py +0 -0
  127. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/__init__.py +0 -0
  128. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/_abstract_table.py +0 -0
  129. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/backends/__init__.py +0 -0
  130. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/backends/_csv.py +0 -0
  131. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/backends/_json.py +0 -0
  132. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/backends/_parquet.py +0 -0
  133. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/backends/_table_backends.py +0 -0
  134. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/v1/__init__.py +0 -0
  135. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/v1/_condition_table.py +0 -0
  136. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/v1/_feature_table.py +0 -0
  137. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/tables/v1/_generic_table.py +0 -0
  138. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/transforms/__init__.py +0 -0
  139. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/transforms/_zoom.py +0 -0
  140. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/utils/__init__.py +0 -0
  141. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/utils/_errors.py +0 -0
  142. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/utils/_fractal_fsspec_store.py +0 -0
  143. {ngio-0.4.8 → ngio-0.5.0a1}/src/ngio/utils/_logger.py +0 -0
  144. {ngio-0.4.8 → ngio-0.5.0a1}/tests/conftest.py +0 -0
  145. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_c1yx.zarr/.zattrs +0 -0
  146. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_c1yx.zarr/.zgroup +0 -0
  147. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_c1yx.zarr/0/.zarray +0 -0
  148. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_c1yx.zarr/1/.zarray +0 -0
  149. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_c1yx.zarr/labels/.zattrs +0 -0
  150. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_c1yx.zarr/labels/.zgroup +0 -0
  151. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/.zattrs +0 -0
  152. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/.zgroup +0 -0
  153. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/0/.zarray +0 -0
  154. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/1/.zarray +0 -0
  155. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_cyx.zarr/.zattrs +0 -0
  156. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_cyx.zarr/.zgroup +0 -0
  157. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_cyx.zarr/0/.zarray +0 -0
  158. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_cyx.zarr/1/.zarray +0 -0
  159. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_cyx.zarr/labels/.zattrs +0 -0
  160. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_cyx.zarr/labels/.zgroup +0 -0
  161. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_cyx.zarr/labels/label/.zattrs +0 -0
  162. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_cyx.zarr/labels/label/.zgroup +0 -0
  163. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_cyx.zarr/labels/label/0/.zarray +0 -0
  164. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_cyx.zarr/labels/label/1/.zarray +0 -0
  165. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_czyx.zarr/.zattrs +0 -0
  166. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_czyx.zarr/.zgroup +0 -0
  167. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_czyx.zarr/0/.zarray +0 -0
  168. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_czyx.zarr/1/.zarray +0 -0
  169. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_czyx.zarr/labels/.zattrs +0 -0
  170. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_czyx.zarr/labels/.zgroup +0 -0
  171. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_czyx.zarr/labels/label/.zattrs +0 -0
  172. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_czyx.zarr/labels/label/.zgroup +0 -0
  173. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_czyx.zarr/labels/label/0/.zarray +0 -0
  174. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_czyx.zarr/labels/label/1/.zarray +0 -0
  175. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tcyx.zarr/.zattrs +0 -0
  176. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tcyx.zarr/.zgroup +0 -0
  177. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tcyx.zarr/0/.zarray +0 -0
  178. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tcyx.zarr/1/.zarray +0 -0
  179. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tcyx.zarr/labels/.zattrs +0 -0
  180. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tcyx.zarr/labels/.zgroup +0 -0
  181. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/.zattrs +0 -0
  182. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/.zgroup +0 -0
  183. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/0/.zarray +0 -0
  184. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/1/.zarray +0 -0
  185. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tczyx.zarr/.zattrs +0 -0
  186. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tczyx.zarr/.zgroup +0 -0
  187. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tczyx.zarr/0/.zarray +0 -0
  188. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tczyx.zarr/1/.zarray +0 -0
  189. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tczyx.zarr/labels/.zattrs +0 -0
  190. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tczyx.zarr/labels/.zgroup +0 -0
  191. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/.zattrs +0 -0
  192. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/.zgroup +0 -0
  193. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/0/.zarray +0 -0
  194. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/1/.zarray +0 -0
  195. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tyx.zarr/.zattrs +0 -0
  196. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tyx.zarr/.zgroup +0 -0
  197. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tyx.zarr/0/.zarray +0 -0
  198. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tyx.zarr/1/.zarray +0 -0
  199. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tyx.zarr/labels/.zattrs +0 -0
  200. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tyx.zarr/labels/.zgroup +0 -0
  201. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tyx.zarr/labels/label/.zattrs +0 -0
  202. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tyx.zarr/labels/label/.zgroup +0 -0
  203. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tyx.zarr/labels/label/0/.zarray +0 -0
  204. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tyx.zarr/labels/label/1/.zarray +0 -0
  205. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tzyx.zarr/.zattrs +0 -0
  206. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tzyx.zarr/.zgroup +0 -0
  207. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tzyx.zarr/0/.zarray +0 -0
  208. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tzyx.zarr/1/.zarray +0 -0
  209. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tzyx.zarr/labels/.zattrs +0 -0
  210. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tzyx.zarr/labels/.zgroup +0 -0
  211. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/.zattrs +0 -0
  212. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/.zgroup +0 -0
  213. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/0/.zarray +0 -0
  214. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/1/.zarray +0 -0
  215. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_yx.zarr/.zattrs +0 -0
  216. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_yx.zarr/.zgroup +0 -0
  217. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_yx.zarr/0/.zarray +0 -0
  218. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_yx.zarr/1/.zarray +0 -0
  219. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_yx.zarr/labels/.zattrs +0 -0
  220. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_yx.zarr/labels/.zgroup +0 -0
  221. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_yx.zarr/labels/label/.zattrs +0 -0
  222. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_yx.zarr/labels/label/.zgroup +0 -0
  223. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_yx.zarr/labels/label/0/.zarray +0 -0
  224. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_yx.zarr/labels/label/1/.zarray +0 -0
  225. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_zyx.zarr/.zattrs +0 -0
  226. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_zyx.zarr/.zgroup +0 -0
  227. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_zyx.zarr/0/.zarray +0 -0
  228. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_zyx.zarr/1/.zarray +0 -0
  229. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_zyx.zarr/labels/.zattrs +0 -0
  230. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_zyx.zarr/labels/.zgroup +0 -0
  231. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_zyx.zarr/labels/label/.zattrs +0 -0
  232. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_zyx.zarr/labels/label/.zgroup +0 -0
  233. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_zyx.zarr/labels/label/0/.zarray +0 -0
  234. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/images/test_image_zyx.zarr/labels/label/1/.zarray +0 -0
  235. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/meta/base_ome_zarr_image_meta.json +0 -0
  236. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/meta/base_ome_zarr_image_meta_wrong_axis_order.json +0 -0
  237. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/meta/base_ome_zarr_label_meta.json +0 -0
  238. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/meta/base_ome_zarr_well_meta.json +0 -0
  239. {ngio-0.4.8 → ngio-0.5.0a1}/tests/data/v04/meta/ome_zarr_well_path_normalization_meta.json +0 -0
  240. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/common/test_dimensions.py +0 -0
  241. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/common/test_roi.py +0 -0
  242. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/common/test_transforms.py +0 -0
  243. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/hcs/test_plate.py +0 -0
  244. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/hcs/test_well.py +0 -0
  245. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/images/test_create.py +0 -0
  246. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/images/test_images.py +0 -0
  247. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/images/test_masked_images.py +0 -0
  248. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/images/test_omezarr_container.py +0 -0
  249. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/images/test_table_ops.py +0 -0
  250. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/io_pipes/test_axes_ops.py +0 -0
  251. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/io_pipes/test_slicing_ops.py +0 -0
  252. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/iterators/test_iterators.py +0 -0
  253. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/ome_zarr_meta/test_image_handler.py +0 -0
  254. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/ome_zarr_meta/test_unit_ngio_specs.py +0 -0
  255. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/ome_zarr_meta/test_unit_v04_utils.py +0 -0
  256. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/tables/test_backends_utils.py +0 -0
  257. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/tables/test_feature_table.py +0 -0
  258. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/tables/test_generic_table.py +0 -0
  259. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/tables/test_masking_roi_table_v1.py +0 -0
  260. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/tables/test_roi_table_v1.py +0 -0
  261. {ngio-0.4.8 → ngio-0.5.0a1}/tests/unit/utils/test_download_datasets.py +0 -0
@@ -18,7 +18,7 @@ jobs:
18
18
  runs-on: ubuntu-latest
19
19
 
20
20
  steps:
21
- - uses: actions/checkout@v6
21
+ - uses: actions/checkout@v5
22
22
  with:
23
23
  fetch-depth: 0
24
24
  - name: 🐍 Set up Python
@@ -41,7 +41,7 @@ jobs:
41
41
 
42
42
  - name: Restore shared data cache
43
43
  id: cache-data
44
- uses: actions/cache@v5
44
+ uses: actions/cache@v4
45
45
  with:
46
46
  path: data/
47
47
  key: "${{ runner.os }}-data-${{ hashFiles('tests/conftest.py') }}"
@@ -24,7 +24,7 @@ jobs:
24
24
  # included in the sdist (unless explicitly excluded)
25
25
  runs-on: ubuntu-latest
26
26
  steps:
27
- - uses: actions/checkout@v6
27
+ - uses: actions/checkout@v5
28
28
  - run: pipx run check-manifest
29
29
 
30
30
  test:
@@ -37,7 +37,7 @@ jobs:
37
37
  platform: [ubuntu-latest, macos-latest, windows-latest]
38
38
 
39
39
  steps:
40
- - uses: actions/checkout@v6
40
+ - uses: actions/checkout@v5
41
41
 
42
42
  - name: 🐍 Set up Python ${{ matrix.python-version }}
43
43
  uses: actions/setup-python@v6
@@ -54,7 +54,7 @@ jobs:
54
54
 
55
55
  - name: Restore shared data cache
56
56
  id: cache-data
57
- uses: actions/cache@v5
57
+ uses: actions/cache@v4
58
58
  with:
59
59
  path: data/
60
60
  key: "${{ runner.os }}-data-${{ hashFiles('tests/conftest.py') }}"
@@ -98,7 +98,7 @@ jobs:
98
98
  contents: write
99
99
 
100
100
  steps:
101
- - uses: actions/checkout@v6
101
+ - uses: actions/checkout@v5
102
102
  with:
103
103
  fetch-depth: 0
104
104
 
@@ -1,16 +1,5 @@
1
1
  # Changelog
2
2
 
3
- ## [v0.4.6]
4
-
5
- ### Bug Fixes
6
- - Fix channel selection from `wavelenght_id`
7
- - Fix table opening mode to stop wrtiting groups when opening in append mode.
8
-
9
- ## [v0.4.5]
10
-
11
- ### Bug Fixes
12
- - Pin Dask to version <2025.11 to avoid errors when writing zarr pyramids with dask (see https://github.com/dask/dask/issues/12159#issuecomment-3548421833)
13
-
14
3
  ## [v0.4.4]
15
4
 
16
5
  ### Bug Fixes
@@ -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'
@@ -35,14 +35,14 @@ classifiers = [
35
35
  dependencies = [
36
36
  "numpy",
37
37
  "filelock",
38
- "zarr<3",
39
- "anndata>=0.8.0,<0.11.4", # To be removed when we transition to zarr v3
38
+ "zarr>3",
39
+ "anndata",
40
40
  "pydantic",
41
- "pandas>=1.2.0,<3.0.0",
41
+ "pandas>=1.2.0",
42
42
  "requests",
43
43
  "aiohttp",
44
- "dask[array]<2025.11.0",
45
- "dask[distributed]<2025.11.0",
44
+ "dask[array]",
45
+ "dask[distributed]",
46
46
  # "xarray", still not used
47
47
  "ome-zarr-models",
48
48
  "pooch",
@@ -155,7 +155,7 @@ minversion = "7.0"
155
155
  testpaths = ["tests"]
156
156
  filterwarnings = [
157
157
  "error",
158
- "ignore::FutureWarning", # TODO remove after zarr-python v3
158
+ "ignore::zarr.errors.ZarrUserWarning", # required for anndata
159
159
  ]
160
160
  addopts = [
161
161
  "-vv",
@@ -2,12 +2,12 @@ import math
2
2
  from collections.abc import Callable, Sequence
3
3
  from typing import Literal
4
4
 
5
- import dask
6
5
  import dask.array as da
7
6
  import numpy as np
8
7
  import zarr
9
- from zarr.types import DIMENSION_SEPARATOR
8
+ from zarr.core.array import CompressorLike
10
9
 
10
+ # from zarr.types import DIMENSION_SEPARATOR
11
11
  from ngio.common._zoom import (
12
12
  InterpolationOrder,
13
13
  _zoom_inputs_check,
@@ -27,7 +27,10 @@ def _on_disk_numpy_zoom(
27
27
  target: zarr.Array,
28
28
  order: InterpolationOrder,
29
29
  ) -> None:
30
- target[...] = numpy_zoom(source[...], target_shape=target.shape, order=order)
30
+ source_array = source[...]
31
+ if not isinstance(source_array, np.ndarray):
32
+ raise NgioValueError("source zarr array could not be read as a numpy array")
33
+ target[...] = numpy_zoom(source_array, target_shape=target.shape, order=order)
31
34
 
32
35
 
33
36
  def _on_disk_dask_zoom(
@@ -37,17 +40,9 @@ def _on_disk_dask_zoom(
37
40
  ) -> None:
38
41
  source_array = da.from_zarr(source)
39
42
  target_array = dask_zoom(source_array, target_shape=target.shape, order=order)
40
- # This is a potential fix for Dask 2025.11
41
- # chunk_size_bytes = np.prod(target.chunks) * target_array.dtype.itemsize
42
- # current_chunk_size = dask.config.get("array.chunk-size", 0)
43
- #
44
- #if current_chunk_size < chunk_size_bytes:
45
- # # Increase the chunk size to avoid dask potentially creating
46
- # # corrupted chunks when writing chunks that are not multiple of the
47
- # # target chunk size
48
- # dask.config.set({"array.chunk-size": f"{chunk_size_bytes}B"})
49
- target_array = target_array.rechunk(target.chunks)
50
- target_array = target_array.compute_chunk_sizes()
43
+
44
+ target_array = target_array.rechunk(target.chunks) # type: ignore
45
+ target_array.compute_chunk_sizes()
51
46
  target_array.to_zarr(target)
52
47
 
53
48
 
@@ -208,20 +203,24 @@ def init_empty_pyramid(
208
203
  paths: list[str],
209
204
  ref_shape: Sequence[int],
210
205
  scaling_factors: Sequence[float],
211
- chunks: Sequence[int] | None = None,
206
+ axes: Sequence[str],
207
+ chunks: Sequence[int] | Literal["auto"] = "auto",
212
208
  dtype: str = "uint16",
213
209
  mode: AccessModeLiteral = "a",
214
- dimension_separator: DIMENSION_SEPARATOR = "/",
215
- compressor="default",
210
+ dimension_separator: Literal[".", "/"] = "/",
211
+ compressors: CompressorLike = "auto",
212
+ zarr_format: Literal[2, 3] = 2,
216
213
  ) -> None:
217
214
  # Return the an Image object
218
- if chunks is not None and len(chunks) != len(ref_shape):
215
+ if chunks != "auto" and len(chunks) != len(ref_shape):
219
216
  raise NgioValueError(
220
217
  "The shape and chunks must have the same number of dimensions."
221
218
  )
222
219
 
223
- if chunks is not None:
224
- chunks = [min(c, s) for c, s in zip(chunks, ref_shape, strict=True)]
220
+ if chunks != "auto":
221
+ chunks = tuple(min(c, s) for c, s in zip(chunks, ref_shape, strict=True))
222
+ else:
223
+ chunks = "auto"
225
224
 
226
225
  if len(ref_shape) != len(scaling_factors):
227
226
  raise NgioValueError(
@@ -232,7 +231,25 @@ def init_empty_pyramid(
232
231
  # To reduce the risk of floating point issues
233
232
  scaling_factors = [_maybe_int(s) for s in scaling_factors]
234
233
 
235
- root_group = open_group_wrapper(store, mode=mode)
234
+ root_group = open_group_wrapper(store, mode=mode, zarr_format=zarr_format)
235
+
236
+ array_static_kwargs = {
237
+ "dtype": dtype,
238
+ "overwrite": True,
239
+ "compressors": compressors,
240
+ }
241
+
242
+ if zarr_format == 2:
243
+ array_static_kwargs["chunk_key_encoding"] = {
244
+ "name": "v2",
245
+ "separator": dimension_separator,
246
+ }
247
+ else:
248
+ array_static_kwargs["chunk_key_encoding"] = {
249
+ "name": "default",
250
+ "separator": dimension_separator,
251
+ }
252
+ array_static_kwargs["dimension_names"] = axes
236
253
 
237
254
  for path in paths:
238
255
  if any(s < 1 for s in ref_shape):
@@ -240,14 +257,11 @@ def init_empty_pyramid(
240
257
  "Level shape must be at least 1 on all dimensions. "
241
258
  f"Calculated shape: {ref_shape} at level {path}."
242
259
  )
243
- new_arr = root_group.zeros(
260
+ new_arr = root_group.create_array(
244
261
  name=path,
245
- shape=ref_shape,
246
- dtype=dtype,
262
+ shape=tuple(ref_shape),
247
263
  chunks=chunks,
248
- dimension_separator=dimension_separator,
249
- overwrite=True,
250
- compressor=compressor,
264
+ **array_static_kwargs,
251
265
  )
252
266
 
253
267
  ref_shape = [
@@ -256,5 +270,4 @@ def init_empty_pyramid(
256
270
  chunks = tuple(
257
271
  min(c, s) for c, s in zip(new_arr.chunks, ref_shape, strict=True)
258
272
  )
259
-
260
273
  return None
@@ -1,9 +1,9 @@
1
1
  """Utility functions for working with OME-Zarr images."""
2
2
 
3
3
  from collections.abc import Sequence
4
- from typing import TypeVar
4
+ from typing import Literal, TypeVar
5
5
 
6
- from zarr.types import DIMENSION_SEPARATOR
6
+ from zarr.core.array import CompressorLike
7
7
 
8
8
  from ngio.common._pyramid import init_empty_pyramid
9
9
  from ngio.ome_zarr_meta import (
@@ -93,10 +93,10 @@ def create_empty_label_container(
93
93
  time_unit: TimeUnits | str | None = DefaultTimeUnit,
94
94
  axes_names: Sequence[str] | None = None,
95
95
  name: str | None = None,
96
- chunks: Sequence[int] | None = None,
96
+ chunks: Sequence[int] | Literal["auto"] = "auto",
97
97
  dtype: str = "uint32",
98
- dimension_separator: DIMENSION_SEPARATOR = "/",
99
- compressor="default",
98
+ dimension_separator: Literal[".", "/"] = "/",
99
+ compressors: CompressorLike = "auto",
100
100
  overwrite: bool = False,
101
101
  version: NgffVersions = DefaultNgffVersion,
102
102
  ) -> ZarrGroupHandler:
@@ -122,11 +122,11 @@ def create_empty_label_container(
122
122
  axes_names (Sequence[str] | None, optional): The names of the axes.
123
123
  If None the canonical names are used. Defaults to None.
124
124
  name (str | None, optional): The name of the image. Defaults to None.
125
- chunks (Sequence[int] | None, optional): The chunk shape. If None the shape
125
+ chunks (Sequence[int] | Literal["auto"]): The chunk shape. If None the shape
126
126
  is used. Defaults to None.
127
127
  dimension_separator (DIMENSION_SEPARATOR): The separator to use for
128
128
  dimensions. Defaults to "/".
129
- compressor: The compressor to use. Defaults to "default".
129
+ compressors (CompressorLike): The compressors to use. Defaults to "auto".
130
130
  dtype (str, optional): The data type of the image. Defaults to "uint16".
131
131
  overwrite (bool, optional): Whether to overwrite an existing image.
132
132
  Defaults to True.
@@ -159,7 +159,9 @@ def create_empty_label_container(
159
159
  )
160
160
 
161
161
  mode = "w" if overwrite else "w-"
162
- group_handler = ZarrGroupHandler(store=store, mode=mode, cache=False)
162
+ group_handler = ZarrGroupHandler(
163
+ store=store, mode=mode, cache=False, zarr_format=meta.zarr_format
164
+ )
163
165
  image_handler = get_label_meta_handler(version=version, group_handler=group_handler)
164
166
  image_handler.write_meta(meta)
165
167
 
@@ -169,10 +171,11 @@ def create_empty_label_container(
169
171
  scaling_factors=scaling_factors,
170
172
  ref_shape=shape,
171
173
  chunks=chunks,
174
+ axes=axes_names,
172
175
  dtype=dtype,
173
176
  mode="a",
174
177
  dimension_separator=dimension_separator,
175
- compressor=compressor,
178
+ compressors=compressors,
176
179
  )
177
180
  group_handler._mode = "r+"
178
181
  return group_handler
@@ -191,10 +194,10 @@ def create_empty_image_container(
191
194
  time_unit: TimeUnits | str | None = DefaultTimeUnit,
192
195
  axes_names: Sequence[str] | None = None,
193
196
  name: str | None = None,
194
- chunks: Sequence[int] | None = None,
197
+ chunks: Sequence[int] | Literal["auto"] = "auto",
195
198
  dtype: str = "uint16",
196
- dimension_separator: DIMENSION_SEPARATOR = "/",
197
- compressor="default",
199
+ dimension_separator: Literal[".", "/"] = "/",
200
+ compressors: CompressorLike = "auto",
198
201
  overwrite: bool = False,
199
202
  version: NgffVersions = DefaultNgffVersion,
200
203
  ) -> ZarrGroupHandler:
@@ -220,12 +223,12 @@ def create_empty_image_container(
220
223
  axes_names (Sequence[str] | None, optional): The names of the axes.
221
224
  If None the canonical names are used. Defaults to None.
222
225
  name (str | None, optional): The name of the image. Defaults to None.
223
- chunks (Sequence[int] | None, optional): The chunk shape. If None the shape
226
+ chunks (Sequence[int] | Literal["auto"]): The chunk shape. If None the shape
224
227
  is used. Defaults to None.
225
228
  dtype (str, optional): The data type of the image. Defaults to "uint16".
226
229
  dimension_separator (DIMENSION_SEPARATOR): The separator to use for
227
230
  dimensions. Defaults to "/".
228
- compressor: The compressor to use. Defaults to "default".
231
+ compressors (CompressorLike): The compressors to use. Defaults to "auto".
229
232
  overwrite (bool, optional): Whether to overwrite an existing image.
230
233
  Defaults to True.
231
234
  version (str, optional): The version of the OME-Zarr specification.
@@ -256,7 +259,9 @@ def create_empty_image_container(
256
259
  version=version,
257
260
  )
258
261
  mode = "w" if overwrite else "w-"
259
- group_handler = ZarrGroupHandler(store=store, mode=mode, cache=False)
262
+ group_handler = ZarrGroupHandler(
263
+ store=store, mode=mode, cache=False, zarr_format=meta.zarr_format
264
+ )
260
265
  image_handler = get_image_meta_handler(version=version, group_handler=group_handler)
261
266
  image_handler.write_meta(meta)
262
267
 
@@ -266,10 +271,12 @@ def create_empty_image_container(
266
271
  scaling_factors=scaling_factors,
267
272
  ref_shape=shape,
268
273
  chunks=chunks,
274
+ axes=axes_names,
269
275
  dtype=dtype,
270
276
  mode="a",
271
277
  dimension_separator=dimension_separator,
272
- compressor=compressor,
278
+ compressors=compressors,
279
+ zarr_format=meta.zarr_format,
273
280
  )
274
281
 
275
282
  group_handler._mode = "r+"
@@ -1,10 +1,11 @@
1
1
  """Abstract class for handling OME-NGFF images."""
2
2
 
3
3
  from collections.abc import Sequence
4
+ from typing import Literal
4
5
 
5
6
  import numpy as np
6
7
  import PIL.Image
7
- from zarr.types import DIMENSION_SEPARATOR
8
+ from zarr.core.array import CompressorLike
8
9
 
9
10
  from ngio.common._synt_images_utils import fit_to_shape
10
11
  from ngio.images._ome_zarr_container import OmeZarrContainer, create_ome_zarr_from_array
@@ -30,14 +31,14 @@ def create_synthetic_ome_zarr(
30
31
  xy_scaling_factor: float = 2,
31
32
  z_scaling_factor: float = 1.0,
32
33
  axes_names: Sequence[str] | None = None,
33
- chunks: Sequence[int] | None = None,
34
+ chunks: Sequence[int] | Literal["auto"] = "auto",
34
35
  channel_labels: list[str] | None = None,
35
36
  channel_wavelengths: list[str] | None = None,
36
37
  channel_colors: Sequence[str] | None = None,
37
38
  channel_active: Sequence[bool] | None = None,
38
39
  table_backend: TableBackend = DefaultTableBackend,
39
- dimension_separator: DIMENSION_SEPARATOR = "/",
40
- compressor="default",
40
+ dimension_separator: Literal[".", "/"] = "/",
41
+ compressors: CompressorLike = "auto",
41
42
  overwrite: bool = False,
42
43
  version: NgffVersions = DefaultNgffVersion,
43
44
  ) -> OmeZarrContainer:
@@ -55,8 +56,8 @@ def create_synthetic_ome_zarr(
55
56
  Defaults to 1.0.
56
57
  axes_names (Sequence[str] | None, optional): The names of the axes.
57
58
  If None the canonical names are used. Defaults to None.
58
- chunks (Sequence[int] | None, optional): The chunk shape. If None the shape
59
- is used. Defaults to None.
59
+ chunks (Sequence[int] | Literal["auto"]): The chunk shape. If None the shape
60
+ is used. Defaults to "auto".
60
61
  channel_labels (list[str] | None, optional): The labels of the channels.
61
62
  Defaults to None.
62
63
  channel_wavelengths (list[str] | None, optional): The wavelengths of the
@@ -68,7 +69,7 @@ def create_synthetic_ome_zarr(
68
69
  table_backend (TableBackend): Table backend to be used to store tables
69
70
  dimension_separator (DIMENSION_SEPARATOR): The separator to use for
70
71
  dimensions. Defaults to "/".
71
- compressor: The compressor to use. Defaults to "default".
72
+ compressors (CompressorLike): The compressors to use. Defaults to "auto".
72
73
  overwrite (bool, optional): Whether to overwrite an existing image.
73
74
  Defaults to True.
74
75
  version (NgffVersion, optional): The version of the OME-Zarr specification.
@@ -103,7 +104,7 @@ def create_synthetic_ome_zarr(
103
104
  chunks=chunks,
104
105
  overwrite=overwrite,
105
106
  dimension_separator=dimension_separator,
106
- compressor=compressor,
107
+ compressors=compressors,
107
108
  version=version,
108
109
  )
109
110
 
@@ -6,7 +6,7 @@ from typing import Literal
6
6
  import dask.array as da
7
7
  import numpy as np
8
8
  from pydantic import BaseModel, model_validator
9
- from zarr.types import DIMENSION_SEPARATOR
9
+ from zarr.core.array import CompressorLike
10
10
 
11
11
  from ngio.common import (
12
12
  Dimensions,
@@ -32,6 +32,7 @@ from ngio.ome_zarr_meta.ngio_specs import (
32
32
  ChannelVisualisation,
33
33
  DefaultSpaceUnit,
34
34
  DefaultTimeUnit,
35
+ NgffVersions,
35
36
  SpaceUnits,
36
37
  TimeUnits,
37
38
  )
@@ -40,6 +41,7 @@ from ngio.utils import (
40
41
  StoreOrGroup,
41
42
  ZarrGroupHandler,
42
43
  )
44
+ from ngio.utils._zarr_utils import find_dimension_separator
43
45
 
44
46
 
45
47
  class ChannelSelectionModel(BaseModel):
@@ -604,8 +606,9 @@ class ImagesContainer:
604
606
  name: str | None = None,
605
607
  chunks: Sequence[int] | None = None,
606
608
  dtype: str | None = None,
607
- dimension_separator: DIMENSION_SEPARATOR | None = None,
608
- compressor: str | None = None,
609
+ dimension_separator: Literal[".", "/"] | None = None,
610
+ compressors: CompressorLike | None = None,
611
+ ngff_version: NgffVersions | None = None,
609
612
  overwrite: bool = False,
610
613
  ) -> "ImagesContainer":
611
614
  """Create an empty OME-Zarr image from an existing image.
@@ -619,12 +622,13 @@ class ImagesContainer:
619
622
  pixel_size (PixelSize | None): The pixel size of the new image.
620
623
  axes_names (Sequence[str] | None): The axes names of the new image.
621
624
  name (str | None): The name of the new image.
622
- chunks (Sequence[int] | None): The chunk shape of the new image.
625
+ chunks (Sequence[int] | Literal["auto"]): The chunk shape of the new image.
623
626
  dimension_separator (DIMENSION_SEPARATOR | None): The separator to use for
624
627
  dimensions. If None it will use the same as the reference image.
625
- compressor (str | None): The compressor to use. If None it will use
628
+ compressors: The compressor to use. If None it will use
626
629
  the same as the reference image.
627
630
  dtype (str | None): The data type of the new image.
631
+ ngff_version (NgffVersions): The NGFF version to use.
628
632
  overwrite (bool): Whether to overwrite an existing image.
629
633
 
630
634
  Returns:
@@ -642,7 +646,8 @@ class ImagesContainer:
642
646
  chunks=chunks,
643
647
  dtype=dtype,
644
648
  dimension_separator=dimension_separator,
645
- compressor=compressor,
649
+ compressors=compressors,
650
+ ngff_version=ngff_version,
646
651
  overwrite=overwrite,
647
652
  )
648
653
 
@@ -725,8 +730,9 @@ def derive_image_container(
725
730
  name: str | None = None,
726
731
  chunks: Sequence[int] | None = None,
727
732
  dtype: str | None = None,
728
- dimension_separator: DIMENSION_SEPARATOR | None = None,
729
- compressor=None,
733
+ dimension_separator: Literal[".", "/"] | None = None,
734
+ compressors: CompressorLike | None = None,
735
+ ngff_version: NgffVersions | None = None,
730
736
  overwrite: bool = False,
731
737
  ) -> ImagesContainer:
732
738
  """Create an empty OME-Zarr image from an existing image.
@@ -743,8 +749,9 @@ def derive_image_container(
743
749
  chunks (Sequence[int] | None): The chunk shape of the new image.
744
750
  dimension_separator (DIMENSION_SEPARATOR | None): The separator to use for
745
751
  dimensions. If None it will use the same as the reference image.
746
- compressor: The compressor to use. If None it will use
752
+ compressors (CompressorLike | None): The compressors to use. If None it will use
747
753
  the same as the reference image.
754
+ ngff_version (NgffVersions): The NGFF version to use.
748
755
  dtype (str | None): The data type of the new image.
749
756
  overwrite (bool): Whether to overwrite an existing image.
750
757
 
@@ -790,10 +797,13 @@ def derive_image_container(
790
797
  dtype = ref_image.dtype
791
798
 
792
799
  if dimension_separator is None:
793
- dimension_separator = ref_image.zarr_array._dimension_separator # type: ignore
800
+ dimension_separator = find_dimension_separator(ref_image.zarr_array)
794
801
 
795
- if compressor is None:
796
- compressor = ref_image.zarr_array.compressor # type: ignore
802
+ if compressors is None:
803
+ compressors = ref_image.zarr_array.compressors # type: ignore
804
+
805
+ if ngff_version is None:
806
+ ngff_version = ref_meta.version
797
807
 
798
808
  handler = create_empty_image_container(
799
809
  store=store,
@@ -810,10 +820,10 @@ def derive_image_container(
810
820
  name=name,
811
821
  chunks=chunks,
812
822
  dtype=dtype,
813
- dimension_separator=dimension_separator, # type: ignore
814
- compressor=compressor, # type: ignore
823
+ dimension_separator=dimension_separator,
824
+ compressors=compressors,
815
825
  overwrite=overwrite,
816
- version=ref_meta.version,
826
+ version=ngff_version,
817
827
  )
818
828
  image_container = ImagesContainer(handler)
819
829
 
@@ -875,7 +885,7 @@ def _parse_str_or_model(
875
885
  )
876
886
  elif channel_selection.mode == "wavelength_id":
877
887
  return image.get_channel_idx(
878
- wavelength_id=str(channel_selection.identifier)
888
+ channel_label=str(channel_selection.identifier)
879
889
  )
880
890
  elif channel_selection.mode == "index":
881
891
  return int(channel_selection.identifier)
@@ -3,7 +3,7 @@
3
3
  from collections.abc import Sequence
4
4
  from typing import Literal
5
5
 
6
- from zarr.types import DIMENSION_SEPARATOR
6
+ from zarr.core.array import CompressorLike
7
7
 
8
8
  from ngio.common import compute_masking_roi
9
9
  from ngio.images._abstract_image import AbstractImage
@@ -28,6 +28,7 @@ from ngio.utils import (
28
28
  StoreOrGroup,
29
29
  ZarrGroupHandler,
30
30
  )
31
+ from ngio.utils._zarr_utils import find_dimension_separator
31
32
 
32
33
 
33
34
  class Label(AbstractImage[LabelMetaHandler]):
@@ -107,7 +108,6 @@ class LabelsContainer:
107
108
  def __init__(self, group_handler: ZarrGroupHandler) -> None:
108
109
  """Initialize the LabelGroupHandler."""
109
110
  self._group_handler = group_handler
110
-
111
111
  # Validate the group
112
112
  # Either contains a labels attribute or is empty
113
113
  attrs = self._group_handler.load_attrs()
@@ -169,8 +169,8 @@ class LabelsContainer:
169
169
  axes_names: Sequence[str] | None = None,
170
170
  chunks: Sequence[int] | None = None,
171
171
  dtype: str = "uint32",
172
- dimension_separator: DIMENSION_SEPARATOR | None = None,
173
- compressor=None,
172
+ dimension_separator: Literal[".", "/"] | None = None,
173
+ compressors: CompressorLike | None = None,
174
174
  overwrite: bool = False,
175
175
  ) -> "Label":
176
176
  """Create an empty OME-Zarr label from a reference image.
@@ -190,8 +190,8 @@ class LabelsContainer:
190
190
  dtype (str): The data type of the new label.
191
191
  dimension_separator (DIMENSION_SEPARATOR | None): The separator to use for
192
192
  dimensions. If None it will use the same as the reference image.
193
- compressor: The compressor to use. If None it will use
194
- the same as the reference image.
193
+ compressors (CompressorLike | None): The compressors to use. If None it will
194
+ use the same as the reference image.
195
195
  overwrite (bool): Whether to overwrite an existing image.
196
196
 
197
197
  Returns:
@@ -217,7 +217,7 @@ class LabelsContainer:
217
217
  chunks=chunks,
218
218
  dtype=dtype,
219
219
  dimension_separator=dimension_separator,
220
- compressor=compressor,
220
+ compressors=compressors,
221
221
  overwrite=overwrite,
222
222
  )
223
223
 
@@ -236,8 +236,8 @@ def derive_label(
236
236
  pixel_size: PixelSize | None = None,
237
237
  axes_names: Sequence[str] | None = None,
238
238
  chunks: Sequence[int] | None = None,
239
- dimension_separator: DIMENSION_SEPARATOR | None = None,
240
- compressor=None,
239
+ dimension_separator: Literal[".", "/"] | None = None,
240
+ compressors: CompressorLike | None = None,
241
241
  dtype: str = "uint32",
242
242
  overwrite: bool = False,
243
243
  ) -> None:
@@ -256,7 +256,7 @@ def derive_label(
256
256
  dtype (str): The data type of the new label.
257
257
  dimension_separator (DIMENSION_SEPARATOR | None): The separator to use for
258
258
  dimensions. If None it will use the same as the reference image.
259
- compressor: The compressor to use. If None it will use
259
+ compressors (CompressorLike | None): The compressor to use. If None it will use
260
260
  the same as the reference image.
261
261
  overwrite (bool): Whether to overwrite an existing image.
262
262
 
@@ -308,9 +308,9 @@ def derive_label(
308
308
  axes_names = axes_names[:c_axis] + axes_names[c_axis + 1 :]
309
309
 
310
310
  if dimension_separator is None:
311
- dimension_separator = ref_image.zarr_array._dimension_separator # type: ignore
312
- if compressor is None:
313
- compressor = ref_image.zarr_array.compressor # type: ignore
311
+ dimension_separator = find_dimension_separator(ref_image.zarr_array)
312
+ if compressors is None:
313
+ compressors = ref_image.zarr_array.compressors # type: ignore
314
314
 
315
315
  _ = create_empty_label_container(
316
316
  store=store,
@@ -326,8 +326,8 @@ def derive_label(
326
326
  axes_names=axes_names,
327
327
  chunks=chunks,
328
328
  dtype=dtype,
329
- dimension_separator=dimension_separator, # type: ignore
330
- compressor=compressor, # type: ignore
329
+ dimension_separator=dimension_separator,
330
+ compressors=compressors,
331
331
  overwrite=overwrite,
332
332
  version=ref_meta.version,
333
333
  name=name,