1 # Copyright (C) 2014 Ipsilon project Contributors, for licensee 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 type(value) is not 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 type(value) is not 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):
181 if type(value) is not list:
182 raise ValueError('The value type must be a list, not "%s"' %
185 def set_value(self, value):
186 self._check_value(value)
187 self._assigned_value = value
189 def export_value(self):
190 if self._assigned_value:
191 return json.dumps(self._assigned_value)
194 def import_value(self, value):
195 if type(value) is not str:
196 raise ValueError('The value type must be a string, not "%s"' %
198 jsonval = json.loads(value)
199 self.set_value(jsonval)
202 class MappingList(ComplexList):
204 def _check_value(self, value):
205 if type(value) is not list:
206 raise ValueError('The value type must be a list, not "%s"' %
209 if type(v) is not list:
210 raise ValueError('Each element must be a list, not "%s"' %
213 raise ValueError('Each element must contain 2 values,'
216 def import_value(self, value):
217 if type(value) is not str:
218 raise ValueError('Value (type: %s) must be string' % type(value))
219 jsonval = json.loads(value)
220 self.set_value(jsonval)
223 class Choice(Option):
225 def __init__(self, name, description, allowed=None, default=None):
226 super(Choice, self).__init__(name, description)
228 self._allowed_values = list(allowed)
230 self._allowed_values = list()
231 self._default_value = list()
235 if name not in self._allowed_values:
237 'item [%s] is not in allowed [%s]' % (name, allowed))
238 self._default_value.append(name)
241 return "%s: %s {%s}, values = %s d:%s ok:%s" % (self.__class__,
244 self._assigned_value,
246 self._allowed_values)
249 return '%s=%s' % (self.name, self.get_value())
251 def set_value(self, value):
252 if type(value) is not list:
254 self._assigned_value = list()
256 if val not in self._allowed_values:
258 'Value "%s" not allowed [%s]' % (val,
259 self._allowed_values))
260 self._assigned_value.append(val)
262 if not self._assigned_value:
263 self._assigned_value = None
265 def unset_value(self, value):
266 if type(value) is str:
270 unset.append((val, False))
271 self.set_value(unset)
273 def get_allowed(self):
274 return self._allowed_values
276 def export_value(self):
277 enabled = self.get_value()
278 return ', '.join(enabled)
280 def import_value(self, value):
281 enabled = [x.strip() for x in value.split(',')]
283 if self._assigned_value is None:
284 self._assigned_value = list()
286 if val not in self._allowed_values:
287 # We silently ignore invalid options on import for now
289 self._assigned_value.append(val)
294 def __init__(self, name, description, allowed, default_value):
295 super(Pick, self).__init__(name, description)
296 self._allowed_values = list(allowed)
297 if default_value not in self._allowed_values:
298 raise ValueError('The default value is not in the allowed list')
299 self._default_value = default_value
301 def set_value(self, value):
302 if value not in self._allowed_values:
304 'Value "%s" not allowed [%s]' % (value, self._allowed_values))
305 self._assigned_value = value
307 def get_allowed(self):
308 return self._allowed_values
310 def export_value(self):
311 return self._str_export_value()
313 def import_value(self, value):
314 self._str_import_value(value)
317 class Condition(Pick):
319 def __init__(self, name, description, default_value=False):
320 super(Condition, self).__init__(name, description,
321 [True, False], default_value)
323 def import_value(self, value):
324 self._assigned_value = value == 'True'
327 class ConfigHelper(Log):
332 def new_config(self, name, *config_args):
333 self._config = Config(name, *config_args)
335 def get_config_obj(self):
336 if self._config is None:
337 raise AttributeError('Config not initialized')
340 def import_config(self, config):
342 raise AttributeError('Config not initialized, cannot import')
344 for key, value in config.iteritems():
345 if key in self._config:
346 self._config[key].import_value(str(value))
348 def export_config(self):
350 for name, option in self._config.iteritems():
351 config[name] = option.export_value()
354 def get_config_value(self, name):
356 raise AttributeError('Config not initialized')
357 return self._config[name].get_value()
359 def set_config_value(self, name, value):
361 raise AttributeError('Config not initialized')
362 return self._config[name].set_value(value)