Remove 'build_actions' in 'apply_requires', now 'validate_requires_arg' build require...
authorEmmanuel Garette <egarette@cadoles.com>
Mon, 1 Jul 2013 09:55:32 +0000 (11:55 +0200)
committerEmmanuel Garette <egarette@cadoles.com>
Mon, 1 Jul 2013 09:55:32 +0000 (11:55 +0200)
New _requires format:
- requirement (like old format)
- tuple of requirements, each items are a tuple of requirement with same action

tiramisu/option.py
tiramisu/setting.py

index 50ba42a..d82e771 100644 (file)
@@ -813,11 +813,13 @@ class OptionDescription(BaseInformation):
 
 def validate_requires_arg(requires, name):
     """check malformed requirements
-    and tranform dict to tuple"""
+    and tranform dict to internal tuple
+    """
     if requires is None:
         return None
-    ret_requires = []
+    ret_requires = {}
     config_action = {}
+
     for require in requires:
         if not type(require) == dict:
             raise ValueError(_("malformed requirements type for option:"
@@ -868,7 +870,7 @@ def validate_requires_arg(requires, name):
         else:
             config_action[action] = inverse
 
-        ret_requires.append((option, expected, action, inverse, transitive,
-                             same_action))
+        ret_requires.setdefault(action, []).append((option, expected, action,
+                                                    inverse, transitive, same_action))
 
-    return tuple(ret_requires)
+    return tuple(tuple(ret) for ret in ret_requires.values())
index a109006..f2210e0 100644 (file)
@@ -214,7 +214,7 @@ class Setting(object):
                 if exp < created:
                     return props
             if is_apply_req:
-                apply_requires(opt, self.context)
+                self.apply_requires(opt)
             props = self._properties.get(opt, opt._properties)
             self._set_cache(opt, props, exp)
         return props
@@ -331,55 +331,44 @@ class Setting(object):
         else:
             self._cache.clear()
 
-
-def apply_requires(opt, config):
-    "carries out the jit (just in time requirements between options"
-    if opt._requires is None:
-        return
-
-    def build_actions(requires):
-        "action are hide, show, enable, disable..."
-        trigger_actions = {}
-        for require in requires:
-            action = require[2]
-            trigger_actions.setdefault(action, []).append(require)
-        return trigger_actions
-
-    # filters the callbacks
-    settings = config.cfgimpl_get_settings()
-    setting = Property(settings, settings._get_properties(opt, False), opt)
-    trigger_actions = build_actions(opt._requires)
-    descr = config.cfgimpl_get_context().cfgimpl_get_description()
-    optpath = descr.impl_get_path_by_opt(opt)
-    for requires in trigger_actions.values():
-        matches = False
-        for require in requires:
-            option, expected, action, inverse, transitive, same_action = require
-            path = descr.impl_get_path_by_opt(option)
-            if path == optpath or path.startswith(optpath + '.'):
-                raise RequirementError(_("malformed requirements "
-                                         "imbrication detected for option: '{0}' "
-                                         "with requirement on: '{1}'").format(optpath, path))
-            try:
-                value = config.cfgimpl_get_context()._getattr(path, force_permissive=True)
-            except PropertiesOptionError, err:
-                if not transitive:
-                    continue
-                properties = err.proptype
-                if same_action and action not in properties:
-                    raise RequirementError(_("option '{0}' has requirement's property error: "
-                                             "{1} {2}").format(opt._name, path, properties))
-                #transitive action, force expected
-                value = expected
-                inverse = False
-            except AttributeError:
-                raise AttributeError(_("required option not found: "
-                                       "{0}").format(path))
-            if not inverse and value == expected or inverse and value != expected:
-                matches = True
-                setting.append(action)
-                ## the calculation cannot be carried out
-                break
-        # no requirement has been triggered, then just reverse the action
-        if not matches:
-            setting.remove(action)
+    def apply_requires(self, opt):
+        "carries out the jit (just in time requirements between options"
+        if opt._requires is None:
+            return
+
+        # filters the callbacks
+        setting = Property(self, self._get_properties(opt, False), opt)
+        descr = self.context.cfgimpl_get_description()
+        optpath = descr.impl_get_path_by_opt(opt)
+        for requires in opt._requires:
+            matches = False
+            for require in requires:
+                option, expected, action, inverse, transitive, same_action = require
+                path = descr.impl_get_path_by_opt(option)
+                if path == optpath or path.startswith(optpath + '.'):
+                    raise RequirementError(_("malformed requirements "
+                                             "imbrication detected for option: '{0}' "
+                                             "with requirement on: '{1}'").format(optpath, path))
+                try:
+                    value = self.context._getattr(path, force_permissive=True)
+                except PropertiesOptionError, err:
+                    if not transitive:
+                        continue
+                    properties = err.proptype
+                    if same_action and action not in properties:
+                        raise RequirementError(_("option '{0}' has requirement's property error: "
+                                                 "{1} {2}").format(opt._name, path, properties))
+                    #transitive action, force expected
+                    value = expected
+                    inverse = False
+                except AttributeError:
+                    raise AttributeError(_("required option not found: "
+                                           "{0}").format(path))
+                if not inverse and value == expected or inverse and value != expected:
+                    matches = True
+                    setting.append(action)
+                    ## the calculation cannot be carried out
+                    break
+            # no requirement has been triggered, then just reverse the action
+            if not matches:
+                setting.remove(action)