3 # Copyright (C) 2014 Ipsilon project Contributors, for licensee see COPYING
5 from ipsilon.util.log import Log
10 def __init__(self, name, *args):
15 if not isinstance(item, Option):
16 raise ValueError('Invalid option type for %s' % repr(item))
17 self._list.append(item.name)
18 self._dict[item.name] = item
19 self.debug('Config(%s) %s' % (self.name, self._dict))
22 return '%s: %s' % (self.__class__, ', '.join(self._list))
25 return str(self._list)
28 return len(self._list)
30 def __getitem__(self, key):
31 return self._dict[key]
33 def __setitem__(self, key, value):
34 if not isinstance(value, Option):
35 raise ValueError('Invalid type for %s' % value)
37 raise NameError('Name mismatch, key=%s but value.name=%s' % (
39 if key not in self._list:
40 self._list.append(key)
41 self._dict[key] = value
43 def __delitem__(self, key):
44 self._list.remove(key)
49 while i < len(self._list):
53 def __reversed__(self):
56 yield self._list[i - 1]
59 def __contains__(self, item):
60 return (item in self._dict)
64 while i < len(self._list):
65 yield (self._list[i], self._dict[self._list[i]])
69 return [(k, self._dict[k]) for k in self._list]
74 def __init__(self, name, description):
76 self.description = description
77 self._default_value = None
78 self._assigned_value = None
81 return "%s: %s {%s}, value = %s [def: %s]" % (self.__class__,
88 return '%s=%s' % (self.name, self.get_value())
90 def get_value(self, default=True):
91 if self._assigned_value is not None:
92 return self._assigned_value
94 return self._default_value
98 def set_value(self, value):
99 self._assigned_value = value
101 def export_value(self):
102 raise NotImplementedError
104 def import_value(self, value):
105 raise NotImplementedError
107 def _str_export_value(self):
108 if self._assigned_value:
109 return str(self._assigned_value)
112 def _str_import_value(self, value):
113 if type(value) is not str:
114 raise ValueError('Value must be string')
115 self._assigned_value = value
118 class String(Option):
120 def __init__(self, name, description, default_value=None):
121 super(String, self).__init__(name, description)
122 self._default_value = str(default_value)
124 def set_value(self, value):
125 self._assigned_value = str(value)
127 def export_value(self):
128 return self._str_export_value()
130 def import_value(self, value):
131 self._str_import_value(value)
134 class Template(Option):
136 def __init__(self, name, description, default_template=None):
137 super(Template, self).__init__(name, description)
138 self._default_value = str(default_template)
140 def set_value(self, value):
141 self._assigned_value = str(value)
143 def templatize(self, args):
145 raise ValueError('Templatized called w/o arguments')
147 return self.get_value() % args
149 def export_value(self):
150 return self._str_export_value()
152 def import_value(self, value):
153 self._str_import_value(value)
158 def __init__(self, name, description, default_list=None):
159 super(List, self).__init__(name, description)
161 self._default_value = list(default_list)
163 def set_value(self, value):
164 self._assigned_value = list(value)
166 def export_value(self):
167 if self._assigned_value:
168 return ', '.join(self._assigned_value)
171 def import_value(self, value):
172 if type(value) is not str:
173 raise ValueError('Value (type: %s) must be string' % type(value))
174 self._assigned_value = [x.strip() for x in value.split(',')]
177 class Choice(Option):
179 def __init__(self, name, description, allowed=None, default=None):
180 super(Choice, self).__init__(name, description)
182 self._allowed_values = list(allowed)
184 self._allowed_values = list()
185 self._default_value = list()
189 if name not in self._allowed_values:
191 'item [%s] is not in allowed [%s]' % (name, allowed))
192 self._default_value.append(name)
195 return "%s: %s {%s}, values = %s d:%s ok:%s" % (self.__class__,
198 self._assigned_value,
200 self._allowed_values)
203 return '%s=%s' % (self.name, self.get_value())
205 def set_value(self, value):
206 if type(value) is not list:
209 if type(val) is not tuple:
211 if val[0] not in self._allowed_values:
213 'Value "%s" not allowed [%s]' % (val[0],
214 self._allowed_values))
216 if val[0] not in self._assigned_value:
217 self._assigned_value.append(val[0])
219 if val[0] in self._assigned_value:
220 self._assigned_value.remove(val[0])
222 def unset_value(self, value):
223 if type(value) is str:
227 unset.append((val, False))
228 self.set_value(unset)
230 def get_allowed(self):
231 return self._allowed_values
233 def export_value(self):
234 enabled = self.get_value()
235 return ', '.join(enabled)
237 def import_value(self, value):
238 enabled = [x.strip() for x in value.split(',')]
240 if val not in self._allowed_values:
241 # We silently ignore invalid options on import for now
243 self._assigned_value[val] = True
248 def __init__(self, name, description, allowed, default_value):
249 super(Pick, self).__init__(name, description)
250 self._allowed_values = list(allowed)
251 if default_value not in self._allowed_values:
252 raise ValueError('The default value is not in the allowed list')
253 self._default_value = default_value
255 def set_value(self, value):
256 if value not in self._allowed_values:
258 'Value "%s" not allowed [%s]' % (value, self._allowed_values))
259 self._assigned_value = value
261 def get_allowed(self):
262 return self._allowed_values
264 def export_value(self):
265 return self._str_export_value()
267 def import_value(self, value):
268 self._str_import_value(value)
271 class Condition(Option):
273 def __init__(self, name, description, default_value=False):
274 super(Condition, self).__init__(name, description)
275 self._default_value = default_value
277 def set_value(self, value):
279 self._assigned_value = True
281 self._assigned_value = False
283 raise ValueError('Value must be True or False, got %s' % value)
285 def export_value(self):
286 if self._assigned_value is True:
288 elif self._assigned_value is False:
293 def import_value(self, value):
294 if value in ['1', 'YES']:
295 self._assigned_value = True
297 self._assigned_value = False