diff --git a/lindi/LindiClient/LindiAttributes.py b/lindi/LindiClient/LindiAttributes.py index 8ab0723..586f380 100644 --- a/lindi/LindiClient/LindiAttributes.py +++ b/lindi/LindiClient/LindiAttributes.py @@ -8,7 +8,10 @@ def __init__(self, *, _object: Union[zarr.Group, zarr.Array]): self._object = _object def get(self, key, default=None): - return self._object.attrs.get(key, default) + try: + return self[key] + except KeyError: + return default def __getitem__(self, key): val = self._object.attrs[key] diff --git a/lindi/LindiClient/LindiClient.py b/lindi/LindiClient/LindiClient.py index cf16209..e745dd5 100644 --- a/lindi/LindiClient/LindiClient.py +++ b/lindi/LindiClient/LindiClient.py @@ -18,7 +18,11 @@ def __init__( _zarr_group: zarr.Group, ) -> None: self._zarr_group = _zarr_group - super().__init__(_zarr_group=self._zarr_group) + super().__init__(_zarr_group=self._zarr_group, _client=self) + + @property + def filename(self): + return '' @staticmethod def from_zarr_store(zarr_store: Union[Store, FSMap]) -> "LindiClient": @@ -51,9 +55,22 @@ def from_zarr_group(zarr_group: zarr.Group) -> "LindiClient": @staticmethod def from_reference_file_system(data: dict) -> "LindiClient": - fs = ReferenceFileSystem(data).get_mapper(root="/") + fs = ReferenceFileSystem(data).get_mapper(root="") return LindiClient.from_zarr_store(fs) + def get(self, key, default=None, getlink: bool = False): + try: + ret = self[key] + except KeyError: + ret = default + if getlink: + return ret + else: + if isinstance(ret, LindiReference): + return self[ret] + else: + return ret + def __getitem__(self, key): # type: ignore if isinstance(key, str): if key.startswith('/'): diff --git a/lindi/LindiClient/LindiDataset.py b/lindi/LindiClient/LindiDataset.py index 0b12d66..ee14a9a 100644 --- a/lindi/LindiClient/LindiDataset.py +++ b/lindi/LindiClient/LindiDataset.py @@ -8,9 +8,10 @@ class LindiDataset: - def __init__(self, *, _zarr_array: zarr.Array): + def __init__(self, *, _zarr_array: zarr.Array, _client): self._zarr_array = _zarr_array self._is_scalar = self._zarr_array.attrs.get("_SCALAR", False) + self._client = _client # See if we have the _COMPOUND_DTYPE attribute, which signifies that # this is a compound dtype @@ -25,6 +26,14 @@ def __init__(self, *, _zarr_array: zarr.Array): self._external_hdf5_clients: Dict[str, h5py.File] = {} + @property + def file(self): + return self._client + + @property + def id(self): + return None + @property def name(self): return self._zarr_array.name diff --git a/lindi/LindiClient/LindiGroup.py b/lindi/LindiClient/LindiGroup.py index fd3f726..b05822f 100644 --- a/lindi/LindiClient/LindiGroup.py +++ b/lindi/LindiClient/LindiGroup.py @@ -4,8 +4,17 @@ class LindiGroup: - def __init__(self, *, _zarr_group: zarr.Group): + def __init__(self, *, _zarr_group: zarr.Group, _client): self._zarr_group = _zarr_group + self._client = _client + + @property + def file(self): + return self._client + + @property + def id(self): + return None @property def attrs(self): @@ -33,9 +42,9 @@ def __getitem__(self, key): if key in self._zarr_group.keys(): x = self._zarr_group[key] if isinstance(x, zarr.Group): - return LindiGroup(_zarr_group=x) + return LindiGroup(_zarr_group=x, _client=self._client) elif isinstance(x, zarr.Array): - return LindiDataset(_zarr_array=x) + return LindiDataset(_zarr_array=x, _client=self._client) else: raise Exception(f"Unknown type: {type(x)}") else: