if slave has a callback with a slave that has a callback with a default_multi's slave...
authorEmmanuel Garette <egarette@cadoles.com>
Wed, 2 Apr 2014 10:04:50 +0000 (12:04 +0200)
committerEmmanuel Garette <egarette@cadoles.com>
Wed, 2 Apr 2014 10:04:50 +0000 (12:04 +0200)
test/test_option_calculation.py
tiramisu/autolib.py
tiramisu/value.py

index ad1b54f..de9c282 100644 (file)
@@ -444,6 +444,22 @@ def test_callback_master_and_slaves_master():
     assert cfg.val1.val2 == [None, None]
 
 
+def test_callback_master_and_slaves_master2():
+    val1 = StrOption('val1', "", multi=True)
+    val2 = StrOption('val2', "", multi=True, default_multi='val2')
+    val3 = StrOption('val3', "", multi=True, callback=return_value, callback_params={'': ((val2, False),)})
+    val4 = StrOption('val4', "", multi=True, callback=return_value, callback_params={'': ((val3, False),)})
+    interface1 = OptionDescription('val1', '', [val1, val2, val3, val4])
+    interface1.impl_set_group_type(groups.master)
+    maconfig = OptionDescription('rootconfig', '', [interface1])
+    cfg = Config(maconfig)
+    cfg.read_write()
+    cfg.val1.val1.append('val')
+    assert cfg.val1.val4 == ['val2']
+    assert cfg.val1.val3 == ['val2']
+    assert cfg.val1.val2 == ['val2']
+
+
 def test_callback_master_and_slaves_master_list():
     val1 = StrOption('val1', "", multi=True, callback=return_list)
     val2 = StrOption('val2', "", multi=True)
@@ -499,6 +515,16 @@ def test_callback_master_and_slaves_slave():
     assert cfg.val1.val2 == ['val2', 'val2', 'val']
 
 
+def test_callback_master_and_slaves():
+    val1 = StrOption('val1', "", multi=True)
+    val2 = StrOption('val2', "", multi=True, callback=return_val)
+    interface1 = OptionDescription('val1', '', [val1, val2])
+    interface1.impl_set_group_type(groups.master)
+    maconfig = OptionDescription('rootconfig', '', [interface1])
+    cfg = Config(maconfig)
+    cfg.read_write()
+
+
 def test_callback_master_and_slaves_slave_cal():
     val3 = StrOption('val3', "", multi=True)
     val1 = StrOption('val1', "", multi=True, callback=return_value, callback_params={'': ((val3, False),)})
index 26a39e4..92b86c5 100644 (file)
@@ -154,8 +154,15 @@ def carry_out_calculation(option, config, callback, callback_params,
                     ).impl_get_path_by_opt(opt)
                     # get value
                     try:
+                        if option.impl_is_multi() and \
+                                (option.impl_get_multitype() == multitypes.master or
+                                 (option.impl_get_multitype() == multitypes.slave and
+                                  option.impl_get_master_slaves() != opt)):
+                            validate = True
+                        else:
+                            validate = False
                         value = config.getattr(path, force_permissive=True,
-                                               validate=False)
+                                               validate=validate)
                         # convert to list, not modifie this multi
                         if value.__class__.__name__ == 'Multi':
                             value = list(value)
@@ -192,7 +199,7 @@ def carry_out_calculation(option, config, callback, callback_params,
     # if no index, return a list
     if one_is_multi:
         ret = []
-        if index:
+        if index is not None:
             range_ = [index]
         else:
             range_ = range(len_multi)
@@ -211,7 +218,7 @@ def carry_out_calculation(option, config, callback, callback_params,
                     else:
                         kwargs[key] = val
             calc = calculate(callback, args, kwargs)
-            if index:
+            if index is not None:
                 ret = calc
             else:
                 ret.append(calc)
@@ -234,7 +241,7 @@ def carry_out_calculation(option, config, callback, callback_params,
                 ret = ret[:max_len]
                 if len(ret) < max_len:
                     ret = ret + [None] * (max_len - len(ret))
-            if isinstance(ret, list) and index:
+            if isinstance(ret, list) and index is not None:
                 if len(ret) < index + 1:
                     ret = None
                 else:
index 348f3ed..a584f9e 100644 (file)
@@ -203,7 +203,7 @@ class Values(object):
             if (opt.impl_is_multi() and
                     opt.impl_get_multitype() == multitypes.slave):
                 masterp = self._get_opt_path(opt.impl_get_master_slaves())
-                mastervalue = context.getattr(masterp, validate=validate)
+                mastervalue = context.getattr(masterp, validate=False)
                 lenmaster = len(mastervalue)
                 if lenmaster == 0:
                     value = []