api for mandatory
authorgwen <gremond@cadoles.com>
Mon, 10 Sep 2012 09:49:52 +0000 (11:49 +0200)
committergwen <gremond@cadoles.com>
Mon, 10 Sep 2012 09:49:52 +0000 (11:49 +0200)
tiramisu/basetype.py
tiramisu/config.py
tiramisu/option.py

index 22639d9..712fe1b 100644 (file)
 class BaseType(object):
     def has_properties(self):
         return bool(len(self.properties))
-    def has_property(self, propname):\r
-        return propname in self.properties\r
-    def get_properties(self):\r
-        return self.properties\r
-    def add_property(self, propname):\r
-        if not propname in self.properties:\r
-            self.properties.append(propname)\r
-    def del_property(self, propname):\r
-        if not self.has_property(propname):\r
-            raise TypeError("option has no property " + propname)\r
-        self.properties.remove(propname)\r
-
+    def has_property(self, propname):
+        return propname in self.properties
+    def get_properties(self):
+        return self.properties
+    def add_property(self, propname):
+        if not propname in self.properties:
+            self.properties.append(propname)
+    def del_property(self, propname):
+        if not self.has_property(propname):
+            raise TypeError("option has no property " + propname)
+        self.properties.remove(propname)
 class HiddenBaseType(BaseType):
     def hide(self):
-        self.add_property('hidden')\r
+        self.add_property('hidden')
     def show(self):
-        self.del_property('hidden')\r
+        self.del_property('hidden')
     def _is_hidden(self):
         # dangerous method: how an Option() can determine its status by itself ? 
-        return self.has_property('hidden')\r
+        return self.has_property('hidden')
 
 class DisabledBaseType(BaseType):
     def disable(self):
-        self.add_property('disabled')\r
+        self.add_property('disabled')
     def enable(self):
-        self.del_property('disabled')\r
+        self.del_property('disabled')
     def _is_disabled(self):
-        return self.has_property('disabled')\r
+        return self.has_property('disabled')
 
index 12e23bf..e9dcb79 100644 (file)
@@ -178,9 +178,13 @@ class Config(object):
         if name.startswith('_cfgimpl_'):
             self.__dict__[name] = value
             return
-        if self._cfgimpl_frozen and getattr(self, name) != value:
+        if self.is_frozen() and getattr(self, name) != value:
             raise TypeError("trying to change a value in a frozen config"
                                                 ": {0} {1}".format(name, value))
+        if self.is_mandatory() and value == None:
+            raise MandatoryError("trying to reset option: {0} wich lives in a"
+                    " mandatory group: {1}".format(name,
+                        self._cfgimpl_descr._name))
         if type(getattr(self._cfgimpl_descr, name)) != SymLinkOption:
             self._validate(name, getattr(self._cfgimpl_descr, name))
         self.setoption(name, value, self._cfgimpl_owner)
@@ -329,14 +333,6 @@ class Config(object):
                 else:
                     newowner = who 
         if type(child) != SymLinkOption:
-            if child.is_mandatory() and value is None:
-                raise MandatoryError('cannot override value to %s for '
-                  'option %s' % (value, name))
-            if name not in self._cfgimpl_values:
-                raise AttributeError('unknown option %s' % (name,))
-            if child.has_callback() or child.isfrozen():
-                raise ConflictConfigError('cannot override value to %s for '
-                  'option %s' % (value, name))
 #            if oldowner == who:
 #                oldvalue = getattr(self, name)
 #                if oldvalue == value: 
@@ -442,6 +438,10 @@ class Config(object):
         rootconfig = self._cfgimpl_get_toplevel()
         return rootconfig.__dict__['_cfgimpl_frozen']
 
+    def is_mandatory(self):
+        rootconfig = self._cfgimpl_get_toplevel()
+        return rootconfig.__dict__['_cfgimpl_mandatory']
+
     def cfgimpl_read_only(self):
         # hung up on freeze, hidden and disabled concepts 
         self.cfgimpl_freeze()
index 23ddc63..284f830 100644 (file)
@@ -184,8 +184,17 @@ class Option(HiddenBaseType, DisabledBaseType):
     def setoption(self, config, value, who):
         "who is **not necessarily** a owner because it cannot be a list"
         name = self._name
-        if self._frozen:
-            raise TypeError('trying to change a frozen option object: %s' % name)
+
+        if config.is_mandatory() and child.is_mandatory() and \
+                ((self.is_multi() and value == []) or
+                (not self.is_multi() and value is None)):
+            raise MandatoryError('cannot override value to %s for '
+              'option %s' % (value, name))
+        if name not in config._cfgimpl_values:
+            raise AttributeError('unknown option %s' % (name))
+        if config.is_frozen() and (child.has_callback() or child.isfrozen()):
+            raise ConflictConfigError('cannot override value to %s for '
+              'option %s' % (value, name))
         # we want the possibility to reset everything
         if who == "default" and value is None:
             self.default = None