pylint 1.4.3 version fixes
[cascardo/ipsilon.git] / ipsilon / util / config.py
old mode 100755 (executable)
new mode 100644 (file)
index 304c630..a20c87c
@@ -1,8 +1,7 @@
-#!/usr/bin/python
-#
 # Copyright (C) 2014  Ipsilon project Contributors, for licensee see COPYING
 
 from ipsilon.util.log import Log
+import json
 
 
 class Config(Log):
@@ -110,7 +109,7 @@ class Option(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
 
@@ -158,22 +157,73 @@ class List(Option):
     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):
@@ -203,24 +253,21 @@ class Choice(Option):
         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:
@@ -236,11 +283,14 @@ class Choice(Option):
 
     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):
@@ -268,30 +318,49 @@ 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)