diff --git a/lindi/LindiH5pyFile/LindiH5pyAttributes.py b/lindi/LindiH5pyFile/LindiH5pyAttributes.py index 34444ed..5dd7715 100644 --- a/lindi/LindiH5pyFile/LindiH5pyAttributes.py +++ b/lindi/LindiH5pyFile/LindiH5pyAttributes.py @@ -2,7 +2,7 @@ from .LindiH5pyReference import LindiH5pyReference from ..conversion.attr_conversion import zarr_to_h5_attr from ..conversion.nan_inf_ninf import decode_nan_inf_ninf -from .write.LindiH5pyAttributesWrite import LindiH5pyAttributesWrite +from .writers.LindiH5pyAttributesWriter import LindiH5pyAttributesWriter _special_attribute_keys = [ "_SCALAR", @@ -19,7 +19,10 @@ def __init__(self, attrs, attrs_type: Literal["h5py", "zarr"], readonly: bool): self._attrs_type = attrs_type self._readonly = readonly - self._write = LindiH5pyAttributesWrite(self) + if self._readonly: + self._writer = None + else: + self._writer = LindiH5pyAttributesWriter(self) def get(self, key, default=None): if self._attrs_type == "h5py": @@ -61,7 +64,10 @@ def __getitem__(self, key): raise ValueError(f"Unknown attrs_type: {self._attrs_type}") def __setitem__(self, key, value): - self._write.__setitem__(key, value) + if self._readonly: + raise ValueError("Cannot set items on read-only object") + assert self._writer is not None + self._writer.__setitem__(key, value) def __delitem__(self, key): raise KeyError("Cannot delete attributes on read-only object") diff --git a/lindi/LindiH5pyFile/LindiH5pyDataset.py b/lindi/LindiH5pyFile/LindiH5pyDataset.py index 049215d..5973739 100644 --- a/lindi/LindiH5pyFile/LindiH5pyDataset.py +++ b/lindi/LindiH5pyFile/LindiH5pyDataset.py @@ -30,6 +30,7 @@ class LindiH5pyDataset(h5py.Dataset): def __init__(self, _dataset_object: Union[h5py.Dataset, zarr.Array], _file: "LindiH5pyFile"): self._dataset_object = _dataset_object self._file = _file + self._readonly = _file.mode not in ['r+'] # See if we have the _COMPOUND_DTYPE attribute, which signifies that # this is a compound dtype @@ -62,8 +63,12 @@ def __init__(self, _dataset_object: Union[h5py.Dataset, zarr.Array], _file: "Lin self._is_scalar = self._dataset_object.ndim == 0 # The self._write object handles all the writing operations - from .write.LindiH5pyDatasetWrite import LindiH5pyDatasetWrite # avoid circular import - self._write = LindiH5pyDatasetWrite(self) + from .writers.LindiH5pyDatasetWriter import LindiH5pyDatasetWriter # avoid circular import + + if self._readonly: + self._writer = None + else: + self._writer = LindiH5pyDatasetWriter(self) @property def id(self): @@ -224,14 +229,18 @@ def _get_external_hdf5_client(self, url: str) -> h5py.File: @property def ref(self): - return self._write.ref + if self._readonly: + raise ValueError("Cannot get ref on read-only object") + assert self._writer is not None + return self._writer.ref ############################## # Write def __setitem__(self, args, val): - if self._file._mode not in ['r+']: - raise Exception('Cannot set item on dataset in read-only mode.') - self._write.__setitem__(args, val) + if self._readonly: + raise ValueError("Cannot set items on read-only object") + assert self._writer is not None + self._writer.__setitem__(args, val) class LindiH5pyDatasetCompoundFieldSelection: diff --git a/lindi/LindiH5pyFile/LindiH5pyGroup.py b/lindi/LindiH5pyFile/LindiH5pyGroup.py index db8b755..89d303f 100644 --- a/lindi/LindiH5pyFile/LindiH5pyGroup.py +++ b/lindi/LindiH5pyFile/LindiH5pyGroup.py @@ -20,10 +20,14 @@ class LindiH5pyGroup(h5py.Group): def __init__(self, _group_object: Union[h5py.Group, zarr.Group], _file: "LindiH5pyFile"): self._group_object = _group_object self._file = _file + self._readonly = _file.mode not in ['r+'] # The self._write object handles all the writing operations - from .write.LindiH5pyGroupWrite import LindiH5pyGroupWrite # avoid circular import - self._write = LindiH5pyGroupWrite(self) + from .writers.LindiH5pyGroupWriter import LindiH5pyGroupWriter # avoid circular import + if self._readonly: + self._writer = None + else: + self._writer = LindiH5pyGroupWriter(self) def __getitem__(self, name): if isinstance(self._group_object, h5py.Group): @@ -154,31 +158,39 @@ def attrs(self): # type: ignore @property def ref(self): - return self._write.ref + if self._readonly: + raise ValueError("Cannot get ref on read-only object") + assert self._writer is not None + return self._writer.ref ############################## # write def create_group(self, name, track_order=None): - if self._file._mode not in ['r+']: + if self._readonly: raise Exception('Cannot create group in read-only mode') - return self._write.create_group(name, track_order=track_order) + assert self._writer is not None + return self._writer.create_group(name, track_order=track_order) def require_group(self, name): - if self._file._mode not in ['r+']: + if self._readonly: raise Exception('Cannot require group in read-only mode') - return self._write.require_group(name) + assert self._writer is not None + return self._writer.require_group(name) def create_dataset(self, name, shape=None, dtype=None, data=None, **kwds): - if self._file._mode not in ['r+']: + if self._readonly: raise Exception('Cannot create dataset in read-only mode') - return self._write.create_dataset(name, shape=shape, dtype=dtype, data=data, **kwds) + assert self._writer is not None + return self._writer.create_dataset(name, shape=shape, dtype=dtype, data=data, **kwds) def __setitem__(self, name, obj): - if self._file._mode not in ['r+']: + if self._readonly: raise Exception('Cannot set item in read-only mode') - return self._write.__setitem__(name, obj) + assert self._writer is not None + return self._writer.__setitem__(name, obj) def __delitem__(self, name): - if self._file._mode not in ['r+']: + if self._readonly: raise Exception('Cannot delete item in read-only mode') - return self._write.__delitem__(name) + assert self._writer is not None + return self._writer.__delitem__(name) diff --git a/lindi/LindiH5pyFile/write/LindiH5pyAttributesWrite.py b/lindi/LindiH5pyFile/writers/LindiH5pyAttributesWriter.py similarity index 95% rename from lindi/LindiH5pyFile/write/LindiH5pyAttributesWrite.py rename to lindi/LindiH5pyFile/writers/LindiH5pyAttributesWriter.py index 6d77886..d2908ab 100644 --- a/lindi/LindiH5pyFile/write/LindiH5pyAttributesWrite.py +++ b/lindi/LindiH5pyFile/writers/LindiH5pyAttributesWriter.py @@ -4,7 +4,7 @@ from ..LindiH5pyAttributes import LindiH5pyAttributes # pragma: no cover -class LindiH5pyAttributesWrite: +class LindiH5pyAttributesWriter: def __init__(self, p: 'LindiH5pyAttributes'): self.p = p diff --git a/lindi/LindiH5pyFile/write/LindiH5pyDatasetWrite.py b/lindi/LindiH5pyFile/writers/LindiH5pyDatasetWriter.py similarity index 98% rename from lindi/LindiH5pyFile/write/LindiH5pyDatasetWrite.py rename to lindi/LindiH5pyFile/writers/LindiH5pyDatasetWriter.py index 5d7fd0e..c455e79 100644 --- a/lindi/LindiH5pyFile/write/LindiH5pyDatasetWrite.py +++ b/lindi/LindiH5pyFile/writers/LindiH5pyDatasetWriter.py @@ -11,7 +11,7 @@ from ..LindiH5pyDataset import LindiH5pyDataset # pragma: no cover -class LindiH5pyDatasetWrite: +class LindiH5pyDatasetWriter: def __init__(self, p: 'LindiH5pyDataset'): self.p = p diff --git a/lindi/LindiH5pyFile/write/LindiH5pyGroupWrite.py b/lindi/LindiH5pyFile/writers/LindiH5pyGroupWriter.py similarity index 99% rename from lindi/LindiH5pyFile/write/LindiH5pyGroupWrite.py rename to lindi/LindiH5pyFile/writers/LindiH5pyGroupWriter.py index 5526aa9..5bfa58e 100644 --- a/lindi/LindiH5pyFile/write/LindiH5pyGroupWrite.py +++ b/lindi/LindiH5pyFile/writers/LindiH5pyGroupWriter.py @@ -12,7 +12,7 @@ from ...conversion.create_zarr_dataset_from_h5_data import create_zarr_dataset_from_h5_data -class LindiH5pyGroupWrite: +class LindiH5pyGroupWriter: def __init__(self, p: 'LindiH5pyGroup'): self.p = p diff --git a/lindi/LindiH5pyFile/write/__init__.py b/lindi/LindiH5pyFile/writers/__init__.py similarity index 100% rename from lindi/LindiH5pyFile/write/__init__.py rename to lindi/LindiH5pyFile/writers/__init__.py