if option with requires has a property, calculated properties are store in storage
authorEmmanuel Garette <egarette@cadoles.com>
Tue, 4 Feb 2014 20:40:07 +0000 (21:40 +0100)
committerDaniel Dehennin <daniel.dehennin@ac-dijon.fr>
Wed, 5 Feb 2014 09:37:39 +0000 (10:37 +0100)
test/test_requires.py
tiramisu/setting.py

index 4cf9372..ff9c2a6 100644 (file)
@@ -24,6 +24,28 @@ def test_requires():
     except PropertiesOptionError as err:
         props = err.proptype
     assert props == ['disabled']
+    c.activate_service = True
+    c.ip_address_service
+
+
+def test_requires_with_requires():
+    a = BoolOption('activate_service', '', True)
+    b = IPOption('ip_address_service', '',
+                 requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
+    od = OptionDescription('service', '', [a, b])
+    c = Config(od)
+    c.read_write()
+    c.cfgimpl_get_settings()[b].append('test')
+    c.ip_address_service
+    c.activate_service = False
+    props = []
+    try:
+        c.ip_address_service
+    except PropertiesOptionError as err:
+        props = err.proptype
+    assert props == ['disabled']
+    c.activate_service = True
+    c.ip_address_service
 
 
 def test_requires_invalid():
index 99347f1..4092ae6 100644 (file)
@@ -361,7 +361,7 @@ class Settings(object):
 
     def _getproperties(self, opt=None, path=None, is_apply_req=True):
         if opt is None:
-            props = self._p_.getproperties(path, default_properties)
+            props = copy(self._p_.getproperties(path, default_properties))
         else:
             if path is None:
                 raise ValueError(_('if opt is not None, path should not be'
@@ -372,8 +372,8 @@ class Settings(object):
                     ntime = int(time())
                 is_cached, props = self._p_.getcache(path, ntime)
                 if is_cached:
-                    return props
-            props = self._p_.getproperties(path, opt._properties)
+                    return copy(props)
+            props = copy(self._p_.getproperties(path, opt._properties))
             if is_apply_req:
                 props |= self.apply_requires(opt, path)
             if 'cache' in self:
@@ -435,8 +435,8 @@ class Settings(object):
                          (typically with the `frozen` property)
         """
         # opt properties
-        properties = copy(self._getproperties(opt_or_descr, path))
-        self_properties = copy(self._getproperties())
+        properties = self._getproperties(opt_or_descr, path)
+        self_properties = self._getproperties()
         # remove opt permissive
         # permissive affect option's permission with or without permissive
         # global property