Skip to content

Commit f971a66

Browse files
committed
RF: Subclass Cifti2MetaData from CaretMetaData and add API compatibility hacks
1 parent d2215c3 commit f971a66

File tree

2 files changed

+22
-33
lines changed

2 files changed

+22
-33
lines changed

nibabel/cifti2/cifti2.py

+22-30
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from ..nifti1 import Nifti1Extensions
2626
from ..nifti2 import Nifti2Image, Nifti2Header
2727
from ..arrayproxy import reshape_dataobj
28+
from ..caret import CaretMetaData
2829
from warnings import warn
2930

3031

@@ -102,7 +103,7 @@ def _underscore(string):
102103
return re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', string).lower()
103104

104105

105-
class Cifti2MetaData(xml.XmlSerializable, MutableMapping):
106+
class Cifti2MetaData(CaretMetaData):
106107
""" A list of name-value pairs
107108
108109
* Description - Provides a simple method for user-supplied metadata that
@@ -121,25 +122,27 @@ class Cifti2MetaData(xml.XmlSerializable, MutableMapping):
121122
----------
122123
data : list of (name, value) tuples
123124
"""
124-
def __init__(self, metadata=None):
125-
self.data = OrderedDict()
126-
if metadata is not None:
127-
self.update(metadata)
125+
def __init__(self, *args, **kwargs):
126+
if not args and list(kwargs) == ["metadata"]:
127+
md = kwargs.pop("metadata")
128+
if not isinstance(md, str):
129+
warn("CaretMetaData now has a dict-like interface and will "
130+
"no longer accept the ``metadata`` keyword argument in "
131+
"NiBabel 6.0. See ``pydoc dict`` for initialization options.",
132+
FutureWarning, stacklevel=2)
133+
if md is not None:
134+
args = (md,)
135+
if args == (None,):
136+
warn("CaretMetaData now has a dict-like interface and will no longer "
137+
"accept the positional argument ``None`` in NiBabel 6.0. "
138+
"See ``pydoc dict`` for initialization options.",
139+
FutureWarning, stacklevel=2)
140+
args = ()
141+
super().__init__(*args, **kwargs)
128142

129-
def __getitem__(self, key):
130-
return self.data[key]
131-
132-
def __setitem__(self, key, value):
133-
self.data[key] = value
134-
135-
def __delitem__(self, key):
136-
del self.data[key]
137-
138-
def __len__(self):
139-
return len(self.data)
140-
141-
def __iter__(self):
142-
return iter(self.data)
143+
@property
144+
def data(self):
145+
return self._data
143146

144147
def difference_update(self, metadata):
145148
"""Remove metadata key-value pairs
@@ -159,17 +162,6 @@ def difference_update(self, metadata):
159162
for k in pairs:
160163
del self.data[k]
161164

162-
def _to_xml_element(self):
163-
metadata = xml.Element('MetaData')
164-
165-
for name_text, value_text in self.data.items():
166-
md = xml.SubElement(metadata, 'MD')
167-
name = xml.SubElement(md, 'Name')
168-
name.text = str(name_text)
169-
value = xml.SubElement(md, 'Value')
170-
value.text = str(value_text)
171-
return metadata
172-
173165

174166
class Cifti2LabelTable(xml.XmlSerializable, MutableMapping):
175167
r""" CIFTI-2 label table: a sequence of ``Cifti2Label``\s

nibabel/cifti2/cifti2_axes.py

-3
Original file line numberDiff line numberDiff line change
@@ -1075,7 +1075,6 @@ def to_mapping(self, dim):
10751075
"""
10761076
mim = cifti2.Cifti2MatrixIndicesMap([dim], 'CIFTI_INDEX_TYPE_SCALARS')
10771077
for name, meta in zip(self.name, self.meta):
1078-
meta = None if len(meta) == 0 else meta
10791078
named_map = cifti2.Cifti2NamedMap(name, cifti2.Cifti2MetaData(meta))
10801079
mim.append(named_map)
10811080
return mim
@@ -1213,8 +1212,6 @@ def to_mapping(self, dim):
12131212
label_table = cifti2.Cifti2LabelTable()
12141213
for key, value in label.items():
12151214
label_table[key] = (value[0],) + tuple(value[1])
1216-
if len(meta) == 0:
1217-
meta = None
12181215
named_map = cifti2.Cifti2NamedMap(name, cifti2.Cifti2MetaData(meta),
12191216
label_table)
12201217
mim.append(named_map)

0 commit comments

Comments
 (0)