1 # Copyright (C) 2014 Ipsilon project Contributors, for licensee see COPYING
3 from ipsilon.util.log import Log
8 def __init__(self, name, *args):
13 if not isinstance(item, Option):
14 raise ValueError('Invalid option type for %s' % repr(item))
15 self._list.append(item.name)
16 self._dict[item.name] = item
17 self.debug('Config(%s) %s' % (self.name, self._dict))
20 return '%s: %s' % (self.__class__, ', '.join(self._list))
23 return str(self._list)
26 return len(self._list)
28 def __getitem__(self, key):
29 return self._dict[key]
31 def __setitem__(self, key, value):
32 if not isinstance(value, Option):
33 raise ValueError('Invalid type for %s' % value)
35 raise NameError('Name mismatch, key=%s but value.name=%s' % (
37 if key not in self._list:
38 self._list.append(key)
39 self._dict[key] = value
41 def __delitem__(self, key):
42 self._list.remove(key)
47 while i < len(self._list):
51 def __reversed__(self):
54 yield self._list[i - 1]
57 def __contains__(self, item):
58 return (item in self._dict)
62 while i < len(self._list):
63 yield (self._list[i], self._dict[self._list[i]])
67 return [(k, self._dict[k]) for k in self._list]
72 def __init__(self, name, description):
74 self.description = description
75 self._default_value = None
76 self._assigned_value = None
79 return "%s: %s {%s}, value = %s [def: %s]" % (self.__class__,
86 return '%s=%s' % (self.name, self.get_value())
88 def get_value(self, default=True):
89 if self._assigned_value is not None:
90 return self._assigned_value
92 return self._default_value
96 def set_value(self, value):
97 self._assigned_value = value
99 def export_value(self):
100 raise NotImplementedError
102 def import_value(self, value):
103 raise NotImplementedError
105 def _str_export_value(self):
106 if self._assigned_value:
107 return str(self._assigned_value)
110 def _str_import_value(self, value):
111 if type(value) is not str:
112 raise ValueError('Value must be string')
113 self._assigned_value = value
116 class String(Option):
118 def __init__(self, name, description, default_value=None):
119 super(String, self).__init__(name, description)
120 self._default_value = str(default_value)
122 def set_value(self, value):
123 self._assigned_value = str(value)
125 def export_value(self):
126 return self._str_export_value()
128 def import_value(self, value):
129 self._str_import_value(value)
132 class Template(Option):
134 def __init__(self, name, description, default_template=None):
135 super(Template, self).__init__(name, description)
136 self._default_value = str(default_template)
138 def set_value(self, value):
139 self._assigned_value = str(value)
141 def templatize(self, args):
143 raise ValueError('Templatized called w/o arguments')
145 return self.get_value() % args
147 def export_value(self):
148 return self._str_export_value()
150 def import_value(self, value):
151 self._str_import_value(value)
156 def __init__(self, name, description, default_list=None):
157 super(List, self).__init__(name, description)
159 self._default_value = list(default_list)
161 self._default_value = []
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:
208 self._assigned_value = list()
210 if val not in self._allowed_values:
212 'Value "%s" not allowed [%s]' % (val,
213 self._allowed_values))
214 self._assigned_value.append(val)
216 if not self._assigned_value:
217 self._assigned_value = None
219 def unset_value(self, value):
220 if type(value) is str:
224 unset.append((val, False))
225 self.set_value(unset)
227 def get_allowed(self):
228 return self._allowed_values
230 def export_value(self):
231 enabled = self.get_value()
232 return ', '.join(enabled)
234 def import_value(self, value):
235 enabled = [x.strip() for x in value.split(',')]
237 if self._assigned_value is None:
238 self._assigned_value = list()
240 if val not in self._allowed_values:
241 # We silently ignore invalid options on import for now
243 self._assigned_value.append(val)
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(Pick):
273 def __init__(self, name, description, default_value=False):
274 super(Condition, self).__init__(name, description,
275 [True, False], default_value)
277 def import_value(self, value):
278 self._assigned_value = value == 'True'