-#!/usr/bin/python
-#
# Copyright (C) 2014 Ipsilon project Contributors, for licensee see COPYING
from ipsilon.util.log import Log
+import json
class Config(Log):
return None
def _str_import_value(self, value):
- if type(value) is not str:
+ if not isinstance(value, str):
raise ValueError('Value must be string')
self._assigned_value = value
def __init__(self, name, description, default_list=None):
super(List, self).__init__(name, description)
if default_list:
- self._default_value = list(default_list)
+ self._default_value = default_list
+ else:
+ self._default_value = []
def set_value(self, value):
self._assigned_value = list(value)
def export_value(self):
if self._assigned_value:
- return ', '.join(self._assigned_value)
+ return ','.join(self._assigned_value)
return None
def import_value(self, value):
- if type(value) is not str:
+ if not isinstance(value, str):
raise ValueError('Value (type: %s) must be string' % type(value))
self._assigned_value = [x.strip() for x in value.split(',')]
+class ComplexList(List):
+
+ def _check_value(self, value):
+ if value is None:
+ return
+ if not isinstance(value, list):
+ raise ValueError('The value type must be a list, not "%s"' %
+ type(value))
+
+ def set_value(self, value):
+ self._check_value(value)
+ self._assigned_value = value
+
+ def export_value(self):
+ if self._assigned_value:
+ return json.dumps(self._assigned_value)
+ return None
+
+ def import_value(self, value):
+ if not isinstance(value, str):
+ raise ValueError('The value type must be a string, not "%s"' %
+ type(value))
+ jsonval = json.loads(value)
+ self.set_value(jsonval)
+
+
+class MappingList(ComplexList):
+
+ def _check_value(self, value):
+ if value is None:
+ return
+ if not isinstance(value, list):
+ raise ValueError('The value type must be a list, not "%s"' %
+ type(value))
+ for v in value:
+ if not isinstance(v, list):
+ raise ValueError('Each element must be a list, not "%s"' %
+ type(v))
+ if len(v) != 2:
+ raise ValueError('Each element must contain 2 values,'
+ ' not %d' % len(v))
+
+ def import_value(self, value):
+ if not isinstance(value, str):
+ raise ValueError('Value (type: %s) must be string' % type(value))
+ jsonval = json.loads(value)
+ self.set_value(jsonval)
+
+
class Choice(Option):
def __init__(self, name, description, allowed=None, default=None):
return '%s=%s' % (self.name, self.get_value())
def set_value(self, value):
- if type(value) is not list:
+ if not isinstance(value, list):
value = [value]
+ self._assigned_value = list()
for val in value:
- if type(val) is not tuple:
- val = (val, True)
- if val[0] not in self._allowed_values:
+ if val not in self._allowed_values:
raise ValueError(
- 'Value "%s" not allowed [%s]' % (val[0],
+ 'Value "%s" not allowed [%s]' % (val,
self._allowed_values))
- if val[1] is True:
- if val[0] not in self._assigned_value:
- self._assigned_value.append(val[0])
- else:
- if val[0] in self._assigned_value:
- self._assigned_value.remove(val[0])
+ self._assigned_value.append(val)
+
+ if not self._assigned_value:
+ self._assigned_value = None
def unset_value(self, value):
- if type(value) is str:
+ if isinstance(value, str):
value = [value]
unset = list()
for val in value:
def import_value(self, value):
enabled = [x.strip() for x in value.split(',')]
+ if enabled:
+ if self._assigned_value is None:
+ self._assigned_value = list()
for val in enabled:
if val not in self._allowed_values:
# We silently ignore invalid options on import for now
continue
- self._assigned_value[val] = True
+ self._assigned_value.append(val)
class Pick(Option):
self._str_import_value(value)
-class Condition(Option):
+class Condition(Pick):
def __init__(self, name, description, default_value=False):
- super(Condition, self).__init__(name, description)
- self._default_value = default_value
+ super(Condition, self).__init__(name, description,
+ [True, False], default_value)
- def set_value(self, value):
- if value is True:
- self._assigned_value = True
- elif value is False:
- self._assigned_value = False
- else:
- raise ValueError('Value must be True or False, got %s' % value)
+ def import_value(self, value):
+ self._assigned_value = value == 'True'
- def export_value(self):
- if self._assigned_value is True:
- return '1'
- elif self._assigned_value is False:
- return '0'
- else:
- return None
- def import_value(self, value):
- if value in ['1', 'YES']:
- self._assigned_value = True
- else:
- self._assigned_value = False
+class ConfigHelper(Log):
+
+ def __init__(self):
+ self._config = None
+
+ def new_config(self, name, *config_args):
+ self._config = Config(name, *config_args)
+
+ def get_config_obj(self):
+ if self._config is None:
+ raise AttributeError('Config not initialized')
+ return self._config
+
+ def import_config(self, config):
+ if not self._config:
+ raise AttributeError('Config not initialized, cannot import')
+
+ for key, value in config.iteritems():
+ if key in self._config:
+ self._config[key].import_value(str(value))
+
+ def export_config(self):
+ config = dict()
+ for name, option in self._config.iteritems():
+ config[name] = option.export_value()
+ return config
+
+ def get_config_value(self, name):
+ if not self._config:
+ raise AttributeError('Config not initialized')
+ return self._config[name].get_value()
+
+ def set_config_value(self, name, value):
+ if not self._config:
+ raise AttributeError('Config not initialized')
+ return self._config[name].set_value(value)