can set owner for a slave
authorEmmanuel Garette <egarette@cadoles.com>
Mon, 25 Jan 2016 15:22:28 +0000 (16:22 +0100)
committerEmmanuel Garette <egarette@cadoles.com>
Mon, 25 Jan 2016 15:22:28 +0000 (16:22 +0100)
test/test_option_owner.py
tiramisu/storage/dictionary/value.py
tiramisu/value.py

index 6065051..b0b3359 100644 (file)
@@ -3,7 +3,7 @@ do_autopath()
 
 from py.test import raises
 
-from tiramisu.setting import owners
+from tiramisu.setting import owners, groups
 from tiramisu.config import Config
 from tiramisu.option import ChoiceOption, BoolOption, IntOption, FloatOption, \
     StrOption, OptionDescription, SymLinkOption
@@ -131,6 +131,7 @@ def test_setowner_optiondescription():
     descr1 = OptionDescription('tiramisu', '', [gcdummy])
     descr = OptionDescription('tiramisu', '', [descr1])
     cfg = Config(descr)
+    cfg
     raises(ConfigError, 'cfg.cfgimpl_get_values().getowner(descr1)')
     raises(ConfigError, 'cfg.cfgimpl_get_values().setowner(descr1, owners.user)')
 
@@ -145,3 +146,18 @@ def test_setowner_symlinkoption():
     cfg.tiramisu.dummy = True
     assert cfg.cfgimpl_get_values().getowner(s) == owners.user
     raises(ConfigError, 'cfg.cfgimpl_get_values().setowner(s, owners.user)')
+
+
+def test_owner_masterslaves():
+    b = IntOption('int', 'Test int option', default=[0], multi=True)
+    c = StrOption('str', 'Test string option', multi=True)
+    descr = OptionDescription("int", "", [b, c])
+    descr.impl_set_group_type(groups.master)
+    cfg = Config(descr)
+    raises(ConfigError, 'cfg.cfgimpl_get_values().setowner(c, owners.user)')
+
+    cfg.int.append(1)
+    cfg.str[0] = 'yes'
+    assert cfg.cfgimpl_get_values().getowner(c, 0) == owners.user
+    cfg.cfgimpl_get_values().setowner(c, owners.user, 0)
+    assert cfg.cfgimpl_get_values().getowner(c, 0) == owners.user
index 97085dc..ef4ad19 100644 (file)
@@ -115,10 +115,12 @@ class Values(Cache):
         idx = self._values[0].index(path)
         if isinstance(self._values[3][idx], list):
             if index is None:
-                raise ValueError('list but no index')
-            owner = list(self._values[3][idx])[index] = owner
+                raise ValueError('Slave need index to set owner')
+            towner = list(self._values[3][idx])
+            towner[index] = owner
+            owner = towner
         elif index is not None:
-            raise ValueError('index set but not a list')
+            raise ValueError('Only slave option needs index to set owner')
         lst = list(self._values[3])
         lst[idx] = owner
         values = list(self._values)
index 0f5d283..9740a44 100644 (file)
@@ -506,7 +506,7 @@ class Values(object):
                                                             only_default=only_default, index=index)
         return owner
 
-    def setowner(self, opt, owner):
+    def setowner(self, opt, owner, index=None):
         """
         sets a owner to an option
 
@@ -523,10 +523,11 @@ class Values(object):
         props = self._getcontext().cfgimpl_get_settings().validate_properties(opt,
                                                                               False,
                                                                               True,
-                                                                              path)
+                                                                              path,
+                                                                              index=index)
         if props:
             raise props
-        self._p_.setowner(path, owner)
+        self._p_.setowner(path, owner, index=index)
 
     def is_default_owner(self, opt, validate_properties=True,
                          validate_meta=True, index=None):
@@ -752,7 +753,8 @@ class Multi(list):
                                            True, False, True,
                                            index=index)
 
-    def append(self, value=undefined, force=False, setitem=True, validate=True):
+    def append(self, value=undefined, force=False, setitem=True, validate=True,
+               force_permissive=False):
         """the list value can be updated (appened)
         only if the option is a master
         """
@@ -769,7 +771,8 @@ class Multi(list):
             if 'validator' in setting_properties:
                 fake_context = context._gen_fake_values()
                 fake_multi = fake_context.cfgimpl_get_values()._get_cached_value(
-                    self.opt, path=self.path, validate=False)
+                    self.opt, path=self.path, validate=False,
+                    force_permissive=force_permissive)
                 fake_multi.append(value, validate=False, force=True)
                 self._validate(value, fake_context, index, True)
         if not '_index' in self.__slots__ and self.opt.impl_is_submulti():