1 # Copyright (C) 2014 Ipsilon project Contributors, for license see COPYING
3 from ipsilon.util.log import Log
9 def __init__(self, name, *args):
14 if not isinstance(item, Option):
15 raise ValueError('Invalid option type for %s' % repr(item))
16 self._list.append(item.name)
17 self._dict[item.name] = item
18 self.debug('Config(%s) %s' % (self.name, self._dict))
21 return '%s: %s' % (self.__class__, ', '.join(self._list))
24 return str(self._list)
27 return len(self._list)
29 def __getitem__(self, key):
30 return self._dict[key]
32 def __setitem__(self, key, value):
33 if not isinstance(value, Option):
34 raise ValueError('Invalid type for %s' % value)
36 raise NameError('Name mismatch, key=%s but value.name=%s' % (
38 if key not in self._list:
39 self._list.append(key)
40 self._dict[key] = value
42 def __delitem__(self, key):
43 self._list.remove(key)
48 while i < len(self._list):
52 def __reversed__(self):
55 yield self._list[i - 1]
58 def __contains__(self, item):
59 return (item in self._dict)
63 while i < len(self._list):
64 yield (self._list[i], self._dict[self._list[i]])
68 return [(k, self._dict[k]) for k in self._list]
73 def __init__(self, name, description):
75 self.description = description
76 self._default_value = None
77 self._assigned_value = None
80 return "%s: %s {%s}, value = %s [def: %s]" % (self.__class__,
87 return '%s=%s' % (self.name, self.get_value())
89 def get_value(self, default=True):
90 if self._assigned_value is not None:
91 return self._assigned_value
93 return self._default_value
97 def set_value(self, value):
98 self._assigned_value = value
100 def export_value(self):
101 raise NotImplementedError
103 def import_value(self, value):
104 raise NotImplementedError
106 def _str_export_value(self):
107 if self._assigned_value:
108 return str(self._assigned_value)
111 def _str_import_value(self, value):
112 if not isinstance(value, str):
113 raise ValueError('Value must be string')
114 self._assigned_value = value
117 class String(Option):
119 def __init__(self, name, description, default_value=None):
120 super(String, self).__init__(name, description)
121 self._default_value = str(default_value)
123 def set_value(self, value):
124 self._assigned_value = str(value)
126 def export_value(self):
127 return self._str_export_value()
129 def import_value(self, value):
130 self._str_import_value(value)
133 class Template(Option):
135 def __init__(self, name, description, default_template=None):
136 super(Template, self).__init__(name, description)
137 self._default_value = str(default_template)
139 def set_value(self, value):
140 self._assigned_value = str(value)
142 def templatize(self, args):
144 raise ValueError('Templatized called w/o arguments')
146 return self.get_value() % args
148 def export_value(self):
149 return self._str_export_value()
151 def import_value(self, value):
152 self._str_import_value(value)
157 def __init__(self, name, description, default_list=None):
158 super(List, self).__init__(name, description)
160 self._default_value = default_list
162 self._default_value = []
164 def set_value(self, value):
165 self._assigned_value = list(value)
167 def export_value(self):
168 if self._assigned_value:
169 return ','.join(self._assigned_value)
172 def import_value(self, value):
173 if not isinstance(value, str):
174 raise ValueError('Value (type: %s) must be string' % type(value))
175 self._assigned_value = [x.strip() for x in value.split(',')]
178 class ComplexList(List):
180 def _check_value(self, value):
183 if not isinstance(value, list):
184 raise ValueError('The value type must be a list, not "%s"' %
187 def set_value(self, value):
188 self._check_value(value)
189 self._assigned_value = value
191 def export_value(self):
192 if self._assigned_value:
193 return json.dumps(self._assigned_value)
196 def import_value(self, value):
197 if not isinstance(value, str):
198 raise ValueError('The value type must be a string, not "%s"' %
200 jsonval = json.loads(value)
201 self.set_value(jsonval)
204 class MappingList(ComplexList):
206 def _check_value(self, value):
209 if not isinstance(value, list):
210 raise ValueError('The value type must be a list, not "%s"' %
213 if not isinstance(v, list):
214 raise ValueError('Each element must be a list, not "%s"' %
217 raise ValueError('Each element must contain 2 values,'
220 def import_value(self, value):
221 if not isinstance(value, str):
222 raise ValueError('Value (type: %s) must be string' % type(value))
223 jsonval = json.loads(value)
224 self.set_value(jsonval)
227 class Choice(Option):
229 def __init__(self, name, description, allowed=None, default=None):
230 super(Choice, self).__init__(name, description)
232 self._allowed_values = list(allowed)
234 self._allowed_values = list()
235 self._default_value = list()
239 if name not in self._allowed_values:
241 'item [%s] is not in allowed [%s]' % (name, allowed))
242 self._default_value.append(name)
245 return "%s: %s {%s}, values = %s d:%s ok:%s" % (self.__class__,
248 self._assigned_value,
250 self._allowed_values)
253 return '%s=%s' % (self.name, self.get_value())
255 def set_value(self, value):
256 if not isinstance(value, list):
258 self._assigned_value = list()
260 if val not in self._allowed_values:
262 'Value "%s" not allowed [%s]' % (val,
263 self._allowed_values))
264 self._assigned_value.append(val)
266 if not self._assigned_value:
267 self._assigned_value = None
269 def unset_value(self, value):
270 if isinstance(value, str):
274 unset.append((val, False))
275 self.set_value(unset)
277 def get_allowed(self):
278 return self._allowed_values
280 def export_value(self):
281 enabled = self.get_value()
282 return ', '.join(enabled)
284 def import_value(self, value):
285 enabled = [x.strip() for x in value.split(',')]
287 if self._assigned_value is None:
288 self._assigned_value = list()
290 if val not in self._allowed_values:
291 # We silently ignore invalid options on import for now
293 self._assigned_value.append(val)
298 def __init__(self, name, description, allowed, default_value):
299 super(Pick, self).__init__(name, description)
300 self._allowed_values = list(allowed)
301 if default_value not in self._allowed_values:
302 raise ValueError('The default value is not in the allowed list')
303 self._default_value = default_value
305 def set_value(self, value):
306 if value not in self._allowed_values:
308 'Value "%s" not allowed [%s]' % (value, self._allowed_values))
309 self._assigned_value = value
311 def get_allowed(self):
312 return self._allowed_values
314 def export_value(self):
315 return self._str_export_value()
317 def import_value(self, value):
318 self._str_import_value(value)
321 class Condition(Pick):
323 def __init__(self, name, description, default_value=False):
324 super(Condition, self).__init__(name, description,
325 [True, False], default_value)
327 def import_value(self, value):
328 self._assigned_value = value == 'True'
331 class ConfigHelper(Log):
336 def new_config(self, name, *config_args):
337 self._config = Config(name, *config_args)
339 def get_config_obj(self):
340 if self._config is None:
341 raise AttributeError('Config not initialized')
344 def import_config(self, config):
346 raise AttributeError('Config not initialized, cannot import')
348 for key, value in config.iteritems():
349 if key in self._config:
350 self._config[key].import_value(str(value))
352 def export_config(self):
354 for name, option in self._config.iteritems():
355 config[name] = option.export_value()
358 def get_config_value(self, name):
360 raise AttributeError('Config not initialized')
361 return self._config[name].get_value()
363 def set_config_value(self, name, value):
365 raise AttributeError('Config not initialized')
366 return self._config[name].set_value(value)