transitive in apply_requires should only by apply if properties are same has testing...
authorEmmanuel Garette <egarette@cadoles.com>
Wed, 12 Oct 2016 20:17:04 +0000 (22:17 +0200)
committerEmmanuel Garette <egarette@cadoles.com>
Wed, 12 Oct 2016 20:17:04 +0000 (22:17 +0200)
ChangeLog
test/test_requires.py
tiramisu/setting.py

index a76a26c..3c2e8af 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,8 @@
 Wed Oct 12 21:55:53 2016 +0200 Emmanuel Garette <egarette@cadoles.com>
        * consistency is now check "not_equal" if one option has
        PropertiesOptionError
+       * transitive in apply_requires should only by apply if properties are
+       same has testing action
 
 Mon Oct 10 21:39:04 2016 +0200 Emmanuel Garette <egarette@cadoles.com>
        * consistency with default value for all values now works
index 5395160..b428f28 100644 (file)
@@ -349,6 +349,31 @@ def test_requires_not_transitive():
     c.ip_address_service_web
 
 
+def test_requires_not_transitive_not_same_action():
+    a = BoolOption('activate_service', '', True)
+    b = BoolOption('activate_service_web', '', True,
+                   requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
+    d = IPOption('ip_address_service_web', '',
+                 requires=[{'option': b, 'expected': False,
+                            'action': 'hidden', 'transitive': False}])
+    od = OptionDescription('service', '', [a, b, d])
+    c = Config(od)
+    c.read_write()
+    c.activate_service
+    c.activate_service_web
+    c.ip_address_service_web
+    c.activate_service = False
+    #
+    props = []
+    try:
+        c.activate_service_web
+    except PropertiesOptionError as err:
+        props = err.proptype
+    assert props == ['disabled']
+    #
+    raises(RequirementError, "c.ip_address_service_web")
+
+
 def test_requires_None():
     a = BoolOption('activate_service', '')
     b = IPOption('ip_address_service', '',
index 04b5b3b..3427ee5 100644 (file)
@@ -633,6 +633,7 @@ class Settings(object):
         else:
             calc_properties = set()
         context = self._getcontext()
+        all_properties = None
         for requires in opt.impl_getrequires():
             for require in requires:
                 option, expected, action, inverse, \
@@ -653,7 +654,13 @@ class Settings(object):
                 if isinstance(value, Exception):
                     if isinstance(value, PropertiesOptionError):
                         if not transitive:
-                            continue
+                            if all_properties is None:
+                                all_properties = []
+                                for requires in opt.impl_getrequires():
+                                    for require in requires:
+                                        all_properties.append(require[2])
+                            if not set(value.proptype) - set(all_properties):
+                                continue
                         properties = value.proptype
                         if same_action and action not in properties:  # pragma: optional cover
                             raise RequirementError(_("option '{0}' has "