annotate tools/myTools/bin/sfa/containers.py @ 1:7e5c71b2e71f draft default tip

Uploaded
author laurenmarazzi
date Wed, 22 Dec 2021 16:00:34 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
1 # -*- coding: utf-8 -*-
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
2
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
3 import sys
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
4 if sys.version_info <= (2, 8):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
5 from builtins import super
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
6
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
7 import os
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
8 import re
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
9 import importlib
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
10 import collections
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
11
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
12 import abc
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
13 import six
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
14
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
15 import sfa.base
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
16 import sfa.algorithms
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
17 import sfa.data
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
18
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
19 from sfa.utils import Singleton
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
20
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
21 __all__ = ["AlgorithmSet", "DataSet"]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
22
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
23 @six.add_metaclass(abc.ABCMeta)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
24 class Container(collections.MutableMapping):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
25 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
26 A simple container class, which handles multiple objects with
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
27 its hashable functionality (using dictionary).
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
28 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
29 def __init__(self, *args, **kwargs):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
30 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
31 _dict: internal data structure, which is hashable.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
32 _dpath: Path of the directory containing algorithms, data, etc.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
33 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
34 self._map = dict()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
35 self._dpath = None
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
36 self._all_keys = None
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
37 self.update(dict(*args, **kwargs))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
38
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
39 def __getitem__(self, key):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
40 return self._map[key]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
41
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
42 def __setitem__(self, key, value):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
43 if isinstance(value, sfa.base.ContainerItem):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
44 self._map[key] = value
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
45 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
46 raise TypeError("Container.__setitem__ only accepts "
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
47 "sfa.base.ContainerItem type object.")
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
48
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
49 def __delitem__(self, key):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
50 del self._map[key]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
51
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
52 def __iter__(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
53 return iter(self._map)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
54
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
55 def __len__(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
56 return len(self._map)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
57
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
58 def __str__(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
59 return str(self._map)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
60
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
61 def keys(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
62 return self._map.keys()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
63
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
64 def values(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
65 return self._map.values()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
66
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
67 def create(self, keys=None):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
68 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
69 Create a single or multiple objects according to keys.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
70 keys: a single string or multiple strings in an iterable object.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
71 All related objects are created if 'keys' is None.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
72 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
73 if keys is not None:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
74 if type(keys) is str:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
75 return self._create_single(keys)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
76 elif hasattr(keys, '__iter__'):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
77 mult = [] # To return multiple elements
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
78 # An iterable object contains multiple keys.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
79 for elem in keys:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
80 mult.append(self._create_single(elem))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
81 return mult
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
82 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
83 self._create_all()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
84 return self
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
85 # end of def create
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
86
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
87 @abc.abstractmethod
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
88 def get_all_keys(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
89 """"""
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
90 # end of def
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
91
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
92 @abc.abstractmethod
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
93 def _create_single(self, key):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
94 """Create a single object"""
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
95 # end of def
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
96
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
97 @abc.abstractmethod
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
98 def _create_all(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
99 """Create all objects"""
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
100 # end of def
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
101
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
102
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
103
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
104 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
105 <References>
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
106
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
107 [Dictionary functionality]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
108 http://stackoverflow.com/questions/3387691/python-how-to-perfectly-override-a-dict
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
109 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
110 # end of def class
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
111
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
112 excluded = ['np.py']
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
113
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
114 @Singleton
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
115 class AlgorithmSet(Container):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
116 _instance = None
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
117 def __new__(cls, *args, **kwargs):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
118 return super().__new__(cls, *args, **kwargs)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
119
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
120 def __init__(self, *args, **kwargs):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
121 super().__init__(*args, **kwargs)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
122 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
123 sfa.algorithms.__file__ represents a directory path
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
124 containing sfa.algorithms's init module (__init__.py).
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
125 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
126 self._dpath = os.path.dirname(sfa.algorithms.__file__)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
127
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
128 # end of def __init__
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
129
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
130 def get_all_keys(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
131 if not self._all_keys:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
132 self._all_keys = []
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
133 for entity in os.listdir(self._dpath):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
134 if re.match(r"[^_]\w+\.py$", entity) \
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
135 and entity not in excluded:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
136 mod_name = entity.split('.')[0] # Module name
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
137 print(mod_name, entity)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
138 key = mod_name.upper()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
139 self._all_keys.append(key)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
140 yield key
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
141 # end of for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
142 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
143 return iter(self._all_keys)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
144
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
145 def _create_single(self, key):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
146 if key in self._map:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
147 return self._map[key]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
148
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
149
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
150 key_low = key.lower()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
151 fstr_module_path = "%s.%s" % (sfa.algorithms.__name__,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
152 key_low)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
153
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
154 _key = key.upper() # We use captital characters for the key.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
155 if _key in self._map: # Avoid redundant importing
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
156 return
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
157
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
158 mod = importlib.import_module(fstr_module_path)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
159 # The following is of test purpose (removable in the future).
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
160 if "this_should_be_imported" in mod.__name__:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
161 return
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
162
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
163 alg = mod.create_algorithm(_key)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
164 self._map[_key] = alg
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
165
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
166 # For testing purpose
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
167 print("%s algorithm has been created." % (_key))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
168 return alg
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
169
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
170 def _create_all(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
171 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
172 Import all algorithms, based on file names
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
173 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
174 for entity in os.listdir(self._dpath):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
175 if re.match(r"[^_]\w+\.py", entity) \
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
176 and entity not in excluded:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
177 mod_name = entity.split('.')[0] # Module name
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
178 self._create_single(mod_name)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
179 # end of for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
180 # end of def _create_all
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
181
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
182 # end of class Algorithms
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
183
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
184 @Singleton
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
185 class DataSet(Container):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
186 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
187 The name of this class is similar to that of 'DataSet' in C#.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
188 The instance of this class handles multiple sfa.base.Data objects.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
189 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
190 _instance = None
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
191 def __new__(cls, *args, **kwargs):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
192 return super().__new__(cls, *args, **kwargs)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
193
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
194 def __init__(self, *args, **kwargs):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
195 super().__init__(*args, **kwargs)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
196 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
197 sfa.data.__file__ represents a directory path
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
198 containing sfa.data's init module (__init__.py).
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
199 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
200 self._dpath = os.path.dirname(sfa.data.__file__)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
201
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
202 # end of def __init__
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
203
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
204 def get_all_keys(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
205 if not self._all_keys:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
206 self._all_keys = []
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
207 for entity in os.listdir(self._dpath):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
208 dpath = os.path.join(self._dpath, entity)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
209 if not entity.startswith('_') and os.path.isdir(dpath):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
210 key = entity.upper()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
211 self._all_keys.append(key)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
212 yield key
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
213 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
214 return iter(self._all_keys)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
215
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
216 def _create_single(self, key):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
217 if key in self._map:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
218 return self._map[key]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
219
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
220 key_items = key.split("_")
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
221 key_1st, key_2nd = key_items[:2]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
222 mod_name = "%s_%s"%(key_1st.lower(), key_2nd.lower())
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
223 fstr_module_path = "%s.%s" % (sfa.data.__name__, mod_name)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
224
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
225 _key = key.upper()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
226 if _key in self._map: # Avoid redundant importing
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
227 return
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
228 elif mod_name.upper() in self._map:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
229 # All data object in this directory has been created before.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
230 return
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
231
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
232 mod = importlib.import_module(fstr_module_path)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
233 if len(key_items) > 2: # Create the specified single data object
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
234 data = mod.create_data(key)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
235 else: # Create all data objects from this directory
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
236 data = mod.create_data()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
237
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
238 if isinstance(data, dict):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
239 self._map[_key] = data
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
240 elif isinstance(data, list):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
241 self._map[_key] = {obj.abbr.upper(): obj for obj in data}
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
242 elif isinstance(data, sfa.base.Data):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
243 _key = data.abbr.upper()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
244 self._map[_key] = data
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
245 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
246 err_msg = "%s.create_data() returns unsupported type."\
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
247 % (fstr_module_path)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
248 raise TypeError(err_msg)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
249 # end of if
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
250
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
251 # For testing purpose
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
252 print("%s data has been created." % (_key))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
253 return self._map[_key]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
254 # end of def _create_single
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
255
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
256 def _create_all(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
257 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
258 Import all data, based on the directory names of data modules
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
259 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
260 for entity in os.listdir(self._dpath):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
261 dpath = os.path.join(self._dpath, entity)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
262 if not entity.startswith('_') and os.path.isdir(dpath):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
263 self._create_single(entity)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
264 # end of for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
265 # end of def _create_all
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
266
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
267 # end of def class DataSet