|
12 | 12 | from datetime import UTC, datetime |
13 | 13 | from numbers import Number |
14 | 14 | from pathlib import Path |
15 | | -from typing import TYPE_CHECKING |
| 15 | +from typing import TYPE_CHECKING, Unpack |
16 | 16 |
|
17 | 17 | import cv2 |
18 | 18 | import fsspec |
|
31 | 31 | from PIL import Image |
32 | 32 | from tifffile import TiffPages |
33 | 33 | from zarr.experimental.cache_store import CacheStore |
34 | | -from zarr.storage import MemoryStore |
| 34 | +from zarr.storage import FsspecStore, MemoryStore |
35 | 35 |
|
36 | 36 | from tiatoolbox import logger, utils |
37 | 37 | from tiatoolbox.annotation import AnnotationStore, SQLiteStore |
38 | 38 | from tiatoolbox.utils import postproc_defs |
39 | 39 | from tiatoolbox.utils.env_detection import pixman_warning |
40 | 40 | from tiatoolbox.utils.exceptions import FileNotSupportedError |
41 | | -from tiatoolbox.utils.magic import is_sqlite3 |
42 | 41 | from tiatoolbox.utils.visualization import AnnotationRenderer |
43 | 42 | from tiatoolbox.wsicore.wsimeta import WSIMeta |
44 | 43 |
|
|
55 | 54 | Resolution, |
56 | 55 | Units, |
57 | 56 | ) |
| 57 | + from tiatoolbox.wsicore import WSIReaderParams |
58 | 58 | from tiatoolbox.wsicore.metadata.ngff import Multiscales |
59 | 59 |
|
60 | 60 | pixman_warning() |
@@ -146,9 +146,8 @@ def is_ngff( # noqa: PLR0911 |
146 | 146 |
|
147 | 147 | """ |
148 | 148 | path = Path(path) |
149 | | - store = zarr.SQLiteStore(str(path)) if path.is_file() and is_sqlite3(path) else path |
150 | 149 | try: |
151 | | - zarr_group = zarr.open(store, mode="r") |
| 150 | + zarr_group = zarr.open(path, mode="r") |
152 | 151 | except Exception: # skipcq: PYL-W0703 # noqa: BLE001 |
153 | 152 | return False |
154 | 153 | if not isinstance(zarr_group, zarr.Group): |
@@ -347,7 +346,7 @@ def open( |
347 | 346 | mpp: tuple[Number, Number] | None = None, |
348 | 347 | power: Number | None = None, |
349 | 348 | post_proc: str | callable | None = "auto", |
350 | | - **kwargs: dict, |
| 349 | + **kwargs: Unpack[WSIReaderParams], |
351 | 350 | ) -> WSIReader: |
352 | 351 | """Return an appropriate :class:`.WSIReader` object. |
353 | 352 |
|
@@ -482,7 +481,7 @@ def _handle_special_cases( |
482 | 481 | mpp: tuple[Number, Number] | None = None, |
483 | 482 | power: Number | None = None, |
484 | 483 | post_proc: str | callable | None = "auto", |
485 | | - **kwargs: dict, |
| 484 | + **kwargs: Unpack[WSIReaderParams], |
486 | 485 | ) -> WSIReader | None: |
487 | 486 | """Handle special cases for selecting the appropriate WSIReader. |
488 | 487 |
|
@@ -5744,15 +5743,18 @@ class NGFFWSIReader(WSIReader): |
5744 | 5743 |
|
5745 | 5744 | """ |
5746 | 5745 |
|
5747 | | - def __init__(self: NGFFWSIReader, path: str | Path, **kwargs: dict) -> None: |
| 5746 | + def __init__( |
| 5747 | + self: NGFFWSIReader, path: str | Path, **kwargs: Unpack[WSIReaderParams] |
| 5748 | + ) -> None: |
5748 | 5749 | """Initialize :class:`NGFFWSIReader`.""" |
5749 | 5750 | super().__init__(path, **kwargs) |
5750 | 5751 | from imagecodecs import numcodecs # noqa: PLC0415 |
5751 | 5752 |
|
5752 | 5753 | from tiatoolbox.wsicore.metadata import ngff # noqa: PLC0415 |
5753 | 5754 |
|
5754 | 5755 | numcodecs.register_codecs() |
5755 | | - store = zarr.SQLiteStore(path) if is_sqlite3(path) else path |
| 5756 | + storage_options = kwargs.get("storage_options", {}) |
| 5757 | + store = FsspecStore.from_url(path, storage_options=storage_options) |
5756 | 5758 | self._zarr_group: zarr.Group = zarr.open(store, mode="r") |
5757 | 5759 | attrs = self._zarr_group.attrs |
5758 | 5760 | multiscales = attrs["multiscales"][0] |
@@ -5815,7 +5817,7 @@ def _info(self: NGFFWSIReader) -> WSIMeta: |
5815 | 5817 | array.shape[:2][::-1] |
5816 | 5818 | for _, array in sorted(self._zarr_group.arrays(), key=lambda x: x[0]) |
5817 | 5819 | ], |
5818 | | - slide_dimensions=self._zarr_group[0].shape[:2][::-1], |
| 5820 | + slide_dimensions=self._zarr_group["0"].shape[:2][::-1], |
5819 | 5821 | vendor=self.zattrs._creator.name, # skipcq: PYL-W0212 # noqa: SLF001 |
5820 | 5822 | raw=self._zarr_group.attrs, |
5821 | 5823 | mpp=mpp, |
@@ -6319,7 +6321,7 @@ def __init__( |
6319 | 6321 | renderer: AnnotationRenderer | None = None, |
6320 | 6322 | base_wsi: WSIReader | str | None = None, |
6321 | 6323 | alpha: float = 1.0, |
6322 | | - **kwargs: dict, |
| 6324 | + **kwargs: Unpack[WSIReaderParams], |
6323 | 6325 | ) -> None: |
6324 | 6326 | """Initialize :class:`AnnotationStoreReader`.""" |
6325 | 6327 | super().__init__(store, **kwargs) |
|
0 commit comments