Skip to content

Commit 7ce8de0

Browse files
authored
Merge pull request #462 from achilleas-k/file-references
File references
2 parents 9b63d54 + f76a283 commit 7ce8de0

24 files changed

+618
-277
lines changed

nixio/block.py

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@
3838

3939
class Block(Entity):
4040

41-
def __init__(self, nixparent, h5group, compression=Compression.Auto):
42-
super(Block, self).__init__(nixparent, h5group)
41+
def __init__(self, nixfile, nixparent, h5group,
42+
compression=Compression.Auto):
43+
super(Block, self).__init__(nixfile, nixparent, h5group)
4344
self._groups = None
4445
self._data_arrays = None
4546
self._tags = None
@@ -49,9 +50,10 @@ def __init__(self, nixparent, h5group, compression=Compression.Auto):
4950
self._data_frames = None
5051

5152
@classmethod
52-
def _create_new(cls, nixparent, h5parent, name, type_, compression):
53-
newentity = super(Block, cls)._create_new(nixparent, h5parent,
54-
name, type_)
53+
def create_new(cls, nixparent, h5parent, name, type_, compression):
54+
nixfile = nixparent # file is parent
55+
newentity = super(Block, cls).create_new(nixfile, nixparent, h5parent,
56+
name, type_)
5557
newentity._compr = compression
5658
return newentity
5759

@@ -101,8 +103,8 @@ def create_multi_tag(self, name="", type_="", positions=None,
101103
"{}-extents".format(type_),
102104
data=extents)
103105
extcreated = True
104-
mtag = MultiTag._create_new(self, multi_tags,
105-
name, type_, positions)
106+
mtag = MultiTag.create_new(self.file, self, multi_tags,
107+
name, type_, positions)
106108
except Exception as e:
107109
msg = "MultiTag Creation Failed"
108110
if poscreated:
@@ -150,7 +152,7 @@ def create_tag(self, name="", type_="", position=0,
150152
tags = self._h5group.open_group("tags")
151153
if name in tags:
152154
raise exceptions.DuplicateName("create_tag")
153-
tag = Tag._create_new(self, tags, name, type_, position)
155+
tag = Tag.create_new(self.file, self, tags, name, type_, position)
154156
return tag
155157

156158
# Source
@@ -170,7 +172,7 @@ def create_source(self, name, type_):
170172
sources = self._h5group.open_group("sources")
171173
if name in sources:
172174
raise exceptions.DuplicateName("create_source")
173-
src = Source._create_new(self, sources, name, type_)
175+
src = Source.create_new(self.file, self, sources, name, type_)
174176
return src
175177

176178
# Group
@@ -190,7 +192,7 @@ def create_group(self, name, type_):
190192
groups = self._h5group.open_group("groups")
191193
if name in groups:
192194
raise exceptions.DuplicateName("open_group")
193-
grp = Group._create_new(self, groups, name, type_)
195+
grp = Group.create_new(self.file, self, groups, name, type_)
194196
return grp
195197

196198
def create_data_array(self, name="", array_type="", dtype=None, shape=None,
@@ -250,8 +252,8 @@ def create_data_array(self, name="", array_type="", dtype=None, shape=None,
250252
raise exceptions.DuplicateName("create_data_array")
251253
if compression == Compression.Auto:
252254
compression = self._compr
253-
da = DataArray._create_new(self, data_arrays, name, array_type,
254-
dtype, shape, compression)
255+
da = DataArray.create_new(self.file, self, data_arrays, name, array_type,
256+
dtype, shape, compression)
255257
if data is not None:
256258
da.write_direct(data)
257259
return da
@@ -328,7 +330,7 @@ def create_data_frame(self, name="", type_="", col_dict=None,
328330
)
329331
else: # col_dtypes is None and data is None
330332
raise ValueError(
331-
"The data type of each column have to be specified"
333+
"The data type of each column have to be specified"
332334
)
333335
if len(col_names) != len(col_dict):
334336
raise exceptions.DuplicateColumnName
@@ -348,7 +350,7 @@ def create_data_frame(self, name="", type_="", col_dict=None,
348350
# data is None or type(data[0]) != np.void
349351
# data_type doesnt matter
350352
raise ValueError(
351-
"No information about column names is provided!"
353+
"No information about column names is provided!"
352354
)
353355

354356
if col_dict is not None:
@@ -362,8 +364,8 @@ def create_data_frame(self, name="", type_="", col_dict=None,
362364
dt_arr = list(col_dict.items())
363365
col_dtype = np.dtype(dt_arr)
364366

365-
df = DataFrame._create_new(self, data_frames, name,
366-
type_, shape, col_dtype, compression)
367+
df = DataFrame.create_new(self.file, self, data_frames, name,
368+
type_, shape, col_dtype, compression)
367369

368370
if data is not None:
369371
if type(data[0]) == np.void:
@@ -510,7 +512,7 @@ def sources(self):
510512
This is a read only attribute.
511513
"""
512514
if self._sources is None:
513-
self._sources = SourceContainer("sources", self, Source)
515+
self._sources = SourceContainer("sources", self.file, self, Source)
514516
return self._sources
515517

516518
@property
@@ -522,7 +524,8 @@ def multi_tags(self):
522524
This is a read only attribute.
523525
"""
524526
if self._multi_tags is None:
525-
self._multi_tags = Container("multi_tags", self, MultiTag)
527+
self._multi_tags = Container("multi_tags", self.file,
528+
self, MultiTag)
526529
return self._multi_tags
527530

528531
@property
@@ -534,7 +537,7 @@ def tags(self):
534537
This is a read only attribute.
535538
"""
536539
if self._tags is None:
537-
self._tags = Container("tags", self, Tag)
540+
self._tags = Container("tags", self.file, self, Tag)
538541
return self._tags
539542

540543
@property
@@ -547,13 +550,15 @@ def data_arrays(self):
547550
This is a read only attribute.
548551
"""
549552
if self._data_arrays is None:
550-
self._data_arrays = Container("data_arrays", self, DataArray)
553+
self._data_arrays = Container("data_arrays", self.file,
554+
self, DataArray)
551555
return self._data_arrays
552556

553557
@property
554558
def data_frames(self):
555559
if self._data_frames is None:
556-
self._data_frames = Container("data_frames", self, DataFrame)
560+
self._data_frames = Container("data_frames", self.file,
561+
self, DataFrame)
557562
return self._data_frames
558563

559564
@property
@@ -565,7 +570,7 @@ def groups(self):
565570
This is a read only attribute.
566571
"""
567572
if self._groups is None:
568-
self._groups = Container("groups", self, Group)
573+
self._groups = Container("groups", self.file, self, Group)
569574
return self._groups
570575

571576
# metadata
@@ -579,7 +584,8 @@ def metadata(self):
579584
:type: Section
580585
"""
581586
if "metadata" in self._h5group:
582-
return Section(None, self._h5group.open_group("metadata"))
587+
return Section(self.file, None,
588+
self._h5group.open_group("metadata"))
583589
else:
584590
return None
585591

nixio/container.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ class Container(object):
2323
checking and instantiations)
2424
"""
2525

26-
def __init__(self, name, parent, itemclass):
26+
def __init__(self, name, nixfile, parent, itemclass):
2727
self._backend = parent._h5group.open_group(name)
2828
self._itemclass = itemclass
29+
self._file = nixfile
2930
self._parent = parent
3031
self._name = name
3132

3233
def _inst_item(self, item):
33-
return self._itemclass(self._parent, item)
34+
return self._itemclass(self._file, self._parent, item)
3435

3536
def __len__(self):
3637
return len(self._backend)
@@ -56,10 +57,7 @@ def __delitem__(self, item):
5657
self._itemclass.__name__)
5758
)
5859

59-
root = self._backend.h5root
60-
if not root:
61-
root = self._parent._h5group
62-
root.delete_all([item.id])
60+
self._file._h5group.delete_all([item.id])
6361

6462
def __iter__(self):
6563
for group in self._backend:
@@ -121,8 +119,7 @@ def __delitem__(self, item):
121119
# the root block
122120
secids = [s.id for s in item.find_sections()]
123121

124-
root = self._backend.file
125-
root.delete_all(secids)
122+
self._file._h5group.delete_all(secids)
126123

127124

128125
class SourceContainer(Container):
@@ -145,9 +142,7 @@ def __delitem__(self, item):
145142
# the root block
146143
srcids = [s.id for s in item.find_sources()]
147144
srcids.append(item.id)
148-
149-
root = self._backend.h5root
150-
root.delete_all(srcids)
145+
self._file._h5group.delete_all(srcids)
151146

152147

153148
class LinkContainer(Container):
@@ -180,7 +175,8 @@ class LinkContainer(Container):
180175
"""
181176

182177
def __init__(self, name, parent, itemclass, itemstore):
183-
super(LinkContainer, self).__init__(name, parent, itemclass)
178+
super(LinkContainer, self).__init__(name, parent.file,
179+
parent, itemclass)
184180
self._itemstore = itemstore
185181

186182
def __delitem__(self, item):
@@ -249,7 +245,7 @@ def __contains__(self, item):
249245
return False
250246

251247
def _inst_item(self, item):
252-
return self._itemclass(self._itemstore._parent, item)
248+
return self._itemclass(self._file, self._itemstore._parent, item)
253249

254250
@staticmethod
255251
def _item_key(item):

0 commit comments

Comments
 (0)