Skip to content

Commit 6144535

Browse files
committed
ENH: Create CaretMetaData object to unify GIFTI/CIFTI-2/CaretSpecFile metadata
1 parent 1e93bd5 commit 6144535

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed

nibabel/caret.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
from collections.abc import MutableMapping
2+
3+
from . import xmlutils as xml
4+
5+
6+
class CaretMetaData(xml.XmlSerializable, MutableMapping):
7+
""" A list of name-value pairs used in various Caret-based XML formats
8+
9+
* Description - Provides a simple method for user-supplied metadata that
10+
associates names with values.
11+
* Attributes: [NA]
12+
* Child Elements
13+
14+
* MD (0...N)
15+
16+
* Text Content: [NA]
17+
18+
MD elements are a single metadata entry consisting of a name and a value.
19+
20+
Attributes
21+
----------
22+
data : mapping of {name: value} pairs
23+
24+
>>> md = CaretMetaData()
25+
>>> md['key'] = 'val'
26+
>>> md
27+
<CaretMetaData {'key': 'val'}>
28+
>>> dict(md)
29+
{'key': 'val'}
30+
>>> md.to_xml()
31+
b'<MetaData><MD><Name>key</Name><Value>val</Value></MD></MetaData>'
32+
33+
Objects may be constructed like any ``dict``:
34+
35+
>>> md = CaretMetaData(key='val')
36+
>>> md.to_xml()
37+
b'<MetaData><MD><Name>key</Name><Value>val</Value></MD></MetaData>'
38+
"""
39+
def __init__(self, *args, **kwargs):
40+
self._data = dict(*args, **kwargs)
41+
42+
def __getitem__(self, key):
43+
""" Get metadata entry by name
44+
45+
>>> md = CaretMetaData({'key': 'val'})
46+
>>> md['key']
47+
'val'
48+
"""
49+
return self._data[key]
50+
51+
def __setitem__(self, key, value):
52+
""" Set metadata entry by name
53+
54+
>>> md = CaretMetaData({'key': 'val'})
55+
>>> dict(md)
56+
{'key': 'val'}
57+
>>> md['newkey'] = 'newval'
58+
>>> dict(md)
59+
{'key': 'val', 'newkey': 'newval'}
60+
>>> md['key'] = 'otherval'
61+
>>> dict(md)
62+
{'key': 'otherval', 'newkey': 'newval'}
63+
"""
64+
self._data[key] = value
65+
66+
def __delitem__(self, key):
67+
""" Delete metadata entry by name
68+
69+
>>> md = CaretMetaData({'key': 'val'})
70+
>>> dict(md)
71+
{'key': 'val'}
72+
>>> del md['key']
73+
>>> dict(md)
74+
{}
75+
"""
76+
del self._data[key]
77+
78+
def __len__(self):
79+
""" Get length of metadata list
80+
81+
>>> md = CaretMetaData({'key': 'val'})
82+
>>> len(md)
83+
1
84+
"""
85+
return len(self._data)
86+
87+
def __iter__(self):
88+
""" Iterate over metadata entries
89+
90+
>>> md = CaretMetaData({'key': 'val'})
91+
>>> for key in md:
92+
... print(key)
93+
key
94+
"""
95+
return iter(self._data)
96+
97+
def __repr__(self):
98+
return f"<{self.__class__.__name__} {self._data!r}>"
99+
100+
def _to_xml_element(self):
101+
metadata = xml.Element('MetaData')
102+
103+
for name_text, value_text in self._data.items():
104+
md = xml.SubElement(metadata, 'MD')
105+
name = xml.SubElement(md, 'Name')
106+
name.text = str(name_text)
107+
value = xml.SubElement(md, 'Value')
108+
value.text = str(value_text)
109+
return metadata

0 commit comments

Comments
 (0)