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, readonly=False):
75 self.description = description
76 self._default_value = None
77 self._assigned_value = None
78 self._readonly = readonly
81 return "%s: %s {%s}, value = %s [def: %s] readonly=%s" % (
90 return '%s=%s' % (self.name, self.get_value())
92 def get_value(self, default=True):
93 if self._assigned_value is not None:
94 return self._assigned_value
96 return self._default_value
100 def set_value(self, value):
101 self._assigned_value = value
103 def export_value(self):
104 raise NotImplementedError
106 def import_value(self, value):
107 raise NotImplementedError
109 def _str_export_value(self):
110 if self._assigned_value:
111 return str(self._assigned_value)
114 def _str_import_value(self, value):
115 if not isinstance(value, str):
116 raise ValueError('Value must be string')
117 self._assigned_value = value
119 def is_readonly(self):
120 return self._readonly
123 class String(Option):
125 def __init__(self, name, description, default_value=None, readonly=False):
126 super(String, self).__init__(name, description, readonly=readonly)
127 self._default_value = str(default_value)
129 def set_value(self, value):
130 self._assigned_value = str(value)
132 def export_value(self):
133 return self._str_export_value()
135 def import_value(self, value):
136 self._str_import_value(value)
139 class Template(Option):
141 def __init__(self, name, description, default_template=None,
143 super(Template, self).__init__(name, description, readonly=readonly)
144 self._default_value = str(default_template)
146 def set_value(self, value):
147 self._assigned_value = str(value)
149 def templatize(self, args):
151 raise ValueError('Templatized called w/o arguments')
153 return self.get_value() % args
155 def export_value(self):
156 return self._str_export_value()
158 def import_value(self, value):
159 self._str_import_value(value)
164 def __init__(self, name, description, default_list=None, readonly=False):
165 super(List, self).__init__(name, description, readonly=readonly)
167 self._default_value = default_list
169 self._default_value = []
171 def set_value(self, value):
172 self._assigned_value = list(value)
174 def export_value(self):
175 if self._assigned_value:
176 return ','.join(self._assigned_value)
179 def import_value(self, value):
180 if not isinstance(value, str):
181 raise ValueError('Value (type: %s) must be string' % type(value))
182 self._assigned_value = [x.strip() for x in value.split(',')]
185 class ComplexList(List):
187 def _check_value(self, value):
190 if not isinstance(value, list):
191 raise ValueError('The value type must be a list, not "%s"' %
194 def set_value(self, value):
195 self._check_value(value)
196 self._assigned_value = value
198 def export_value(self):
199 if self._assigned_value:
200 return json.dumps(self._assigned_value)
203 def import_value(self, value):
204 if not isinstance(value, str):
205 raise ValueError('The value type must be a string, not "%s"' %
207 jsonval = json.loads(value)
208 self.set_value(jsonval)
211 class MappingList(ComplexList):
213 def _check_value(self, value):
216 if not isinstance(value, list):
217 raise ValueError('The value type must be a list, not "%s"' %
220 if not isinstance(v, list):
221 raise ValueError('Each element must be a list, not "%s"' %
224 raise ValueError('Each element must contain 2 values,'
227 def import_value(self, value):
228 if not isinstance(value, str):
229 raise ValueError('Value (type: %s) must be string' % type(value))
230 jsonval = json.loads(value)
231 self.set_value(jsonval)
234 class Choice(Option):
236 def __init__(self, name, description, allowed=None, default=None,
238 super(Choice, self).__init__(name, description, readonly=readonly)
240 self._allowed_values = list(allowed)
242 self._allowed_values = list()
243 self._default_value = list()
247 if name not in self._allowed_values:
249 'item [%s] is not in allowed [%s]' % (name, allowed))
250 self._default_value.append(name)
253 return "%s: %s {%s}, values = %s d:%s ok:%s" % (self.__class__,
256 self._assigned_value,
258 self._allowed_values)
261 return '%s=%s' % (self.name, self.get_value())
263 def set_value(self, value):
264 if not isinstance(value, list):
266 self._assigned_value = list()
268 if val not in self._allowed_values:
270 'Value "%s" not allowed [%s]' % (val,
271 self._allowed_values))
272 self._assigned_value.append(val)
274 if not self._assigned_value:
275 self._assigned_value = None
277 def unset_value(self, value):
278 if isinstance(value, str):
282 unset.append((val, False))
283 self.set_value(unset)
285 def get_allowed(self):
286 return self._allowed_values
288 def export_value(self):
289 enabled = self.get_value()
290 return ', '.join(enabled)
292 def import_value(self, value):
293 enabled = [x.strip() for x in value.split(',')]
295 if self._assigned_value is None:
296 self._assigned_value = list()
298 if val not in self._allowed_values:
299 # We silently ignore invalid options on import for now
301 self._assigned_value.append(val)
306 def __init__(self, name, description, allowed, default_value,
308 super(Pick, self).__init__(name, description, readonly=readonly)
309 self._allowed_values = list(allowed)
310 if default_value not in self._allowed_values:
311 raise ValueError('The default value is not in the allowed list')
312 self._default_value = default_value
314 def set_value(self, value):
315 if value not in self._allowed_values:
317 'Value "%s" not allowed [%s]' % (value, self._allowed_values))
318 self._assigned_value = value
320 def get_allowed(self):
321 return self._allowed_values
323 def export_value(self):
324 return self._str_export_value()
326 def import_value(self, value):
327 self._str_import_value(value)
330 class Condition(Pick):
332 def __init__(self, name, description, default_value=False,
334 super(Condition, self).__init__(name, description,
335 [True, False], default_value,
338 def import_value(self, value):
339 self._assigned_value = value == 'True'
342 class ConfigHelper(Log):
347 def new_config(self, name, *config_args):
348 self._config = Config(name, *config_args)
350 def get_config_obj(self):
351 if self._config is None:
352 raise AttributeError('Config not initialized')
355 def import_config(self, config):
357 raise AttributeError('Config not initialized, cannot import')
359 for key, value in config.iteritems():
360 if key in self._config:
361 self._config[key].import_value(str(value))
363 def export_config(self):
365 for name, option in self._config.iteritems():
366 config[name] = option.export_value()
369 def get_config_value(self, name):
371 raise AttributeError('Config not initialized')
372 return self._config[name].get_value()
374 def set_config_value(self, name, value):
376 raise AttributeError('Config not initialized')
377 return self._config[name].set_value(value)