diff --git a/doc/source/changes/version_0_30.rst.inc b/doc/source/changes/version_0_30.rst.inc index dde69b6d3..c437fe0a9 100644 --- a/doc/source/changes/version_0_30.rst.inc +++ b/doc/source/changes/version_0_30.rst.inc @@ -231,3 +231,5 @@ Fixes of the API Reference (closes :issue:`698`). * fixed arithmetic operations between two sessions returning a nan value for each axis and group (closes :issue:`725`). + +* fixed dumping sessions with metadata using HDF format (closes :issue:`702`). diff --git a/larray/core/metadata.py b/larray/core/metadata.py index 1a7387f53..61821c091 100644 --- a/larray/core/metadata.py +++ b/larray/core/metadata.py @@ -168,11 +168,15 @@ def _convert_value(value): return Metadata([(key, _convert_value(value)) for key, value in zip(array.axes.labels[0], array.data)]) # ---------- IO methods ---------- - def to_hdf(self, hdfstore, key): + def to_hdf(self, hdfstore, key=None): if len(self): - hdfstore.get_storer(key).attrs.metadata = self + attrs = hdfstore.get_storer(key).attrs if key is not None else hdfstore.root._v_attrs + attrs.metadata = self @classmethod - def from_hdf(cls, hdfstore, key): - if 'metadata' in hdfstore.get_storer(key).attrs: - return hdfstore.get_storer(key).attrs.metadata + def from_hdf(cls, hdfstore, key=None): + attrs = hdfstore.get_storer(key).attrs if key is not None else hdfstore.root._v_attrs + if 'metadata' in attrs: + return attrs.metadata + else: + return None diff --git a/larray/inout/hdf.py b/larray/inout/hdf.py index 0ce326a9d..67a69c811 100644 --- a/larray/inout/hdf.py +++ b/larray/inout/hdf.py @@ -143,11 +143,13 @@ def _dump_item(self, key, value, *args, **kwargs): raise TypeError() def _read_metadata(self): - attrs = self.handle.get_node('')._v_attrs - return attrs.metadata if 'metadata' in attrs else Metadata() + metadata = Metadata.from_hdf(self.handle) + if metadata is None: + metadata = Metadata() + return metadata def _dump_metadata(self, metadata): - self.handle.get_node('')._v_attrs.metadata = metadata + metadata.to_hdf(self.handle) def close(self): self.handle.close()