consistencies now a list
authorEmmanuel Garette <egarette@cadoles.com>
Sun, 14 Apr 2013 08:14:06 +0000 (10:14 +0200)
committerEmmanuel Garette <egarette@cadoles.com>
Sun, 14 Apr 2013 08:14:06 +0000 (10:14 +0200)
tiramisu/option.py

index 8f0f0cc..8090a4e 100644 (file)
@@ -79,7 +79,7 @@ class Option(BaseInformation):
     """
     __slots__ = ('_name', '_requires', '_multi', '_validator', '_default_multi',
                  '_default', '_properties', '_callback', '_multitype',
-                 '_master_slaves', '_consistency')
+                 '_master_slaves', '_consistencies')
 
     def __init__(self, name, doc, default=None, default_multi=None,
                  requires=None, multi=False, callback=None,
@@ -111,7 +111,7 @@ class Option(BaseInformation):
         validate_requires_arg(requires, self._name)
         self._requires = requires
         self._multi = multi
-        self._consistency = None
+        self._consistencies = None
         if validator is not None:
             if type(validator) != FunctionType:
                 raise TypeError(_("validator must be a function"))
@@ -254,11 +254,22 @@ class Option(BaseInformation):
             if opt_ is not opt:
                 path = descr.get_path_by_opt(opt_)
                 val = context._getattr(path, validate=False)
-                if val in values:
-                    return False
-                values.append(val)
+                if val is not None:
+                    if val in values:
+                        return False
+                    values.append(val)
         return True
 
+    def add_consistency(self, func, opts):
+        pass
+        if self._consistencies is None:
+            self._consistencies = []
+        if self not in opts:
+            opts = list(opts)
+            opts.append(self)
+            opts = tuple(opts)
+        self._consistencies.append(('cons_{}'.format(func), opts))
+
 
 class ChoiceOption(Option):
     __slots__ = ('_values', '_open_values', 'opt_type')
@@ -333,9 +344,9 @@ class UnicodeOption(Option):
 
 
 class SymLinkOption(object):
-    __slots__ = ('_name', 'opt', '_consistency')
+    __slots__ = ('_name', 'opt', '_consistencies')
     opt_type = 'symlink'
-    _consistency = None
+    _consistencies = None
 
     def __init__(self, name, path, opt):
         self._name = name
@@ -408,9 +419,9 @@ class NetmaskOption(Option):
         if opt_ip is None:
             pass
         elif isinstance(opt_ip, IPOption):
-            self._consistency = ('cons_ip_netmask', (self, opt_ip))
+            self._consistencies = [('cons_ip_netmask', (self, opt_ip))]
         elif isinstance(opt_ip, NetworkOption):
-            self._consistency = ('cons_network_netmask', (self, opt_ip))
+            self._consistencies = [('cons_network_netmask', (self, opt_ip))]
         else:
             raise ValueError(_('unknown type for opt_ip'))
 
@@ -547,12 +558,13 @@ class OptionDescription(BaseInformation):
             cache_option.append(option)
             cache_path.append(str('.'.join(_currpath + [attr])))
             if not isinstance(option, OptionDescription):
-                if option._consistency is not None:
-                    func, opts = option._consistency
-                    for opt in opts:
-                        if opt in _consistencies:
-                            raise ValueError(_('opt {} already in consistency').format(opt._name))
-                        _consistencies[opt] = (func, opts)
+                if option._consistencies is not None:
+                    for consistency in option._consistencies:
+                        func, opts = consistency
+                        for opt in opts:
+                            if opt in _consistencies:
+                                raise ValueError(_('opt {} already in consistency').format(opt._name))
+                            _consistencies.setdefault(opt, []).append((func, opts))
             else:
                 _currpath.append(attr)
                 option.build_cache(cache_path, cache_option, _currpath, _consistencies)
@@ -632,10 +644,13 @@ class OptionDescription(BaseInformation):
         return self._group_type
 
     def valid_consistency(self, opt, value, context, index):
-        cons = self._consistencies.get(opt)
-        if cons is not None:
-            func, opts = cons
-            return getattr(opts[0], func)(opt, value, context, index, opts)
+        consistencies = self._consistencies.get(opt)
+        if consistencies is not None:
+            for consistency in consistencies:
+                func, opts = consistency
+                ret = getattr(opts[0], func)(opt, value, context, index, opts)
+                if ret is False:
+                    return False
         return True