multi defaults value addition cinematics
authorgwen <gremond@cadoles.com>
Thu, 10 Jan 2013 11:03:59 +0000 (12:03 +0100)
committergwen <gremond@cadoles.com>
Thu, 10 Jan 2013 11:03:59 +0000 (12:03 +0100)
tiramisu/config.py
tiramisu/option.py

index 548ef94..553e9b7 100644 (file)
@@ -70,11 +70,16 @@ class Config(object):
         - settles various default values for options
         """
         self._validate_duplicates(self._cfgimpl_descr._children)
+        #max len for a master/slave group
+        max_len_child = 0
         for child in self._cfgimpl_descr._children:
             if isinstance(child, Option):
                 if child.is_multi():
+                    #force_append to load values without append value to
+                    #child/master
                     childdef = Multi(copy(child.getdefault()), config=self,
-                                     opt=child)
+                                     opt=child, force_append=False)
+                    max_len_child = max(max_len_child, len(childdef))
                     self._cfgimpl_values[child._name] = childdef
                     self._cfgimpl_previous_values[child._name] = list(childdef)
                 else:
@@ -85,7 +90,25 @@ class Config(object):
             elif isinstance(child, OptionDescription):
                 self._validate_duplicates(child._children)
                 self._cfgimpl_values[child._name] = Config(child, parent=self)
-#        self.override(overrides)
+
+        try:
+            master = self._cfgimpl_descr.get_master_name()
+        except TypeError:
+            pass
+        else:
+            #if master/slave group, add default_multi value if length of valu
+            #if inferior to group length
+            for child in self._cfgimpl_descr._children:
+                value = self._cfgimpl_values[child._name]
+                if value is None:
+                    len_child = 0
+                    value = Multi([], config=self, opt=child, force_append=False)
+                else:
+                    len_child = len(value)
+                if len_child < max_len_child:
+                    for num in range(len_child, max_len_child):
+                        value._append_default()
+
 
     def cfgimpl_update(self):
         """dynamically adds `Option()` or `OptionDescription()`
index acb9620..a552d7f 100644 (file)
@@ -42,15 +42,17 @@ for act1, act2 in requires_actions:
 class Multi(list):
     """multi options values container
     that support item notation for the values of multi options"""
-    def __init__(self, lst, config, opt):
+    def __init__(self, lst, config, opt, force_append=True):
         """
-        :lst: the Multi wraps a list value
+        :param lst: the Multi wraps a list value
         :param config: the parent config
         :param opt: the option object that have this Multi value
+        :param force_append: - True to append child value with master's one
+                             - False to force lst value
         """
         self.config = config
         self.opt = opt
-        if self.opt.is_master(config):
+        if force_append and self.opt.is_master(config):
             # we pass the list at the list type's init
             # because a normal init cannot return anything
             super(Multi, self).__init__(lst)
@@ -61,7 +63,8 @@ class Multi(list):
                 except Exception, err:
                     print err
         else:
-            self.config._valid_len(self.opt._name, lst)
+            if force_append:
+                self.config._valid_len(self.opt._name, lst)
             super(Multi, self).__init__(lst)
 
     def __setitem__(self, key, value):
@@ -90,10 +93,13 @@ class Multi(list):
                 else:
                     ret = value
             else:
-                default_value = multi.opt.getdefault_multi()
-                multi._setvalue(default_value)
+                multi._append_default()
         return ret
 
+    def _append_default(self):
+        default_value = self.opt.getdefault_multi()
+        self._setvalue(default_value)
+
     def _setvalue(self, value, key=None, who=None):
         if value != None:
             if not self.opt._validate(value):