Add config option to load mapping lists
authorSimo Sorce <simo@redhat.com>
Mon, 16 Feb 2015 15:14:33 +0000 (10:14 -0500)
committerPatrick Uiterwijk <puiterwijk@redhat.com>
Tue, 24 Feb 2015 15:37:45 +0000 (16:37 +0100)
This requires careful handling, and should be used sparingly

Signed-off-by: Simo Sorce <simo@redhat.com>
Reviewed-by: Patrick Uiterwijk <puiterwijk@redhat.com>
ipsilon/util/config.py

index ee5c39c..947c697 100644 (file)
@@ -1,6 +1,7 @@
 # Copyright (C) 2014  Ipsilon project Contributors, for licensee see COPYING
 
 from ipsilon.util.log import Log
 # Copyright (C) 2014  Ipsilon project Contributors, for licensee see COPYING
 
 from ipsilon.util.log import Log
+import json
 
 
 class Config(Log):
 
 
 class Config(Log):
@@ -156,7 +157,7 @@ class List(Option):
     def __init__(self, name, description, default_list=None):
         super(List, self).__init__(name, description)
         if default_list:
     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 = []
 
         else:
             self._default_value = []
 
@@ -174,6 +175,51 @@ class List(Option):
         self._assigned_value = [x.strip() for x in value.split(',')]
 
 
         self._assigned_value = [x.strip() for x in value.split(',')]
 
 
+class ComplexList(List):
+
+    def _check_value(self, value):
+        if type(value) is not 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 type(value) is not 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 type(value) is not list:
+            raise ValueError('The value type must be a list, not "%s"' %
+                             type(value))
+        for v in value:
+            if type(v) is not 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 type(value) is not 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):
 class Choice(Option):
 
     def __init__(self, name, description, allowed=None, default=None):