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 self._default_value = []
165 def set_value(self, value):
166 self._assigned_value = list(value)
168 def export_value(self):
169 if self._assigned_value:
170 return ','.join(self._assigned_value)
173 def import_value(self, value):
174 if type(value) is not str:
175 raise ValueError('Value (type: %s) must be string' % type(value))
176 self._assigned_value = [x.strip() for x in value.split(',')]
179 class Choice(Option):
181 def __init__(self, name, description, allowed=None, default=None):
182 super(Choice, self).__init__(name, description)
184 self._allowed_values = list(allowed)
186 self._allowed_values = list()
187 self._default_value = list()
191 if name not in self._allowed_values:
193 'item [%s] is not in allowed [%s]' % (name, allowed))
194 self._default_value.append(name)
197 return "%s: %s {%s}, values = %s d:%s ok:%s" % (self.__class__,
200 self._assigned_value,
202 self._allowed_values)
205 return '%s=%s' % (self.name, self.get_value())
207 def set_value(self, value):
208 if type(value) is not list:
210 self._assigned_value = list()
212 if val not in self._allowed_values:
214 'Value "%s" not allowed [%s]' % (val,
215 self._allowed_values))
216 self._assigned_value.append(val)
218 if not self._assigned_value:
219 self._assigned_value = None
221 def unset_value(self, value):
222 if type(value) is str:
226 unset.append((val, False))
227 self.set_value(unset)
229 def get_allowed(self):
230 return self._allowed_values
232 def export_value(self):
233 enabled = self.get_value()
234 return ', '.join(enabled)
236 def import_value(self, value):
237 enabled = [x.strip() for x in value.split(',')]
239 if self._assigned_value is None:
240 self._assigned_value = list()
242 if val not in self._allowed_values:
243 # We silently ignore invalid options on import for now
245 self._assigned_value.append(val)
250 def __init__(self, name, description, allowed, default_value):
251 super(Pick, self).__init__(name, description)
252 self._allowed_values = list(allowed)
253 if default_value not in self._allowed_values:
254 raise ValueError('The default value is not in the allowed list')
255 self._default_value = default_value
257 def set_value(self, value):
258 if value not in self._allowed_values:
260 'Value "%s" not allowed [%s]' % (value, self._allowed_values))
261 self._assigned_value = value
263 def get_allowed(self):
264 return self._allowed_values
266 def export_value(self):
267 return self._str_export_value()
269 def import_value(self, value):
270 self._str_import_value(value)
273 class Condition(Pick):
275 def __init__(self, name, description, default_value=False):
276 super(Condition, self).__init__(name, description,
277 [True, False], default_value)
279 def import_value(self, value):
280 self._assigned_value = value == 'True'