generic properties api
authorgwen <gremond@cadoles.com>
Fri, 14 Sep 2012 09:55:32 +0000 (11:55 +0200)
committergwen <gremond@cadoles.com>
Fri, 14 Sep 2012 09:55:32 +0000 (11:55 +0200)
tiramisu/config.py
tiramisu/option.py

index 14240bf..156bde9 100644 (file)
@@ -27,9 +27,12 @@ from tiramisu.error import (PropertiesOptionError, ConfigError, NotFoundError,
 from tiramisu.option import (OptionDescription, Option, SymLinkOption, 
     group_types, Multi, apply_requires)
 from tiramisu.autolib import carry_out_calculation
+import traceback
+
 # ______________________________________________________________________
 # generic owner. 'default' is the general config owner after init time
 default_owner = 'user'
+DEBUG = False
 # ____________________________________________________________
 class Config(object):
     _cfgimpl_properties = ['hidden', 'disabled']
@@ -145,7 +148,7 @@ class Config(object):
         if self._cfgimpl_parent != None:
             raise MethodCallError("this method root_hide() shall not be"
                                            "used with non-root Config() object") 
-        if propname not in in self._cfgimpl_properties:
+        if propname not in self._cfgimpl_properties:
             self._cfgimpl_properties.append(propname)
     
     def cfgimpl_disable_property(self, propname):
@@ -153,7 +156,7 @@ class Config(object):
             raise MethodCallError("this method root_hide() shall not be"
                                            "used with non-root Config() object") 
         if self._cfgimpl_has_property(propname):
-            self.properties.remove(propname)
+            self._cfgimpl_properties.remove(propname)
 
     def cfgimpl_non_mandatory(self):
         if self._cfgimpl_parent != None:
@@ -184,21 +187,20 @@ class Config(object):
         
     def _validate(self, name, opt_or_descr):
         apply_requires(opt_or_descr, self) 
-        if not type(opt_or_descr) == OptionDescription:
-            if self._cfgimpl_toplevel._cfgimpl_has_properties() and \
-                    opt_or_descr.has_properties():
-                raise PropertiesOptionError("trying to access"
-                        " to an option named: {0} with properties"
-                        " {1}".format(name, opt_or_descr.properties), 
-                        opt_or_descr.properties)
-            if self._cfgimpl_toplevel._cfgimpl_has_properties() and \
-                    self._cfgimpl_descr.has_properties():
-                raise PropertiesOptionError("trying to access"
-                        " to an option's group named: {0}"
-                        " for option named: {1} with properties {2}".format(
-                            self._cfgimpl_descr._name, name,
-                            opt_or_descr.properties), 
-                        self._cfgimpl_descr.properties)
+        if not isinstance(opt_or_descr, Option) and \
+                not isinstance(opt_or_descr, OptionDescription):
+            if DEBUG:
+                traceback.print_exc()
+            raise TypeError('Unexpected object: {0}'.format(repr(opt_or_descr)))
+        properties = opt_or_descr.properties
+        for proper in properties:
+            if not self._cfgimpl_toplevel._cfgimpl_has_property(proper):
+                properties.remove(proper)
+        if properties != []:
+            raise PropertiesOptionError("trying to access"
+                    " to an option named: {0} with properties"
+                    " {1}".format(name, str(properties)), 
+                    properties)
 
     def _is_empty(self, opt):
         if (not opt.is_multi() and self._cfgimpl_values[opt._name] == None) or \
@@ -217,6 +219,9 @@ class Config(object):
         # symlink options 
         if type(opt_or_descr) == SymLinkOption:
             return getattr(self, opt_or_descr.path)
+        if name not in self._cfgimpl_values:
+            raise AttributeError("%s object has no attribute %s" %
+                                 (self.__class__, name))
         self._validate(name, opt_or_descr)
         # special attributes
         if name.startswith('_cfgimpl_'):
@@ -224,11 +229,11 @@ class Config(object):
             return self.__dict__[name]
             raise AttributeError("%s object has no attribute %s" %
                                  (self.__class__, name))
-        if name not in self._cfgimpl_values:
-            raise AttributeError("%s object has no attribute %s" %
-                                 (self.__class__, name))
         if not isinstance(opt_or_descr, OptionDescription):
             # options with callbacks (fill or auto) 
+            if name == 'interface_gw':
+                print "pouet"
+                print opt_or_descr.has_callback()
             if opt_or_descr.has_callback():
                 value = self._cfgimpl_values[name]
                 if (not opt_or_descr.is_frozen() or \
@@ -448,16 +453,16 @@ class Config(object):
         # hung up on freeze, hidden and disabled concepts 
         self.cfgimpl_freeze()
         rootconfig = self._cfgimpl_get_toplevel()
-        rootconfig.cfgimpl_hide()
-        rootconfig.cfgimpl_disable()
+        rootconfig.cfgimpl_disable_property('hidden')
+        rootconfig.cfgimpl_enable_property('disabled')
         rootconfig._cfgimpl_mandatory = True
 
     def cfgimpl_read_write(self):
         # hung up on freeze, hidden and disabled concepts
         self.cfgimpl_unfreeze()
         rootconfig = self._cfgimpl_get_toplevel()
-        rootconfig.cfgimpl_hide()
-        rootconfig.cfgimpl_disable() 
+        rootconfig.cfgimpl_enable_property('hidden')
+        rootconfig.cfgimpl_disable_property('disabled')
         rootconfig._cfgimpl_mandatory = False
     # ____________________________________________________________
     def getkey(self):
index c8823e2..25f02b8 100644 (file)
@@ -190,11 +190,12 @@ 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
-        # the value cannot be changed if a callback is defined
-        if self.has_callback():
-            raise TypeError("trying to change an option with callback: %s" % name)
+
         # we want the possibility to reset everything
-        if not (who == "default" and value is None) and not self.validate(value):
+        if not (who == "default" and value is None) and not self.validate(value):      
+            self.default = None
+            return
+        if not self.validate(value):
             raise ConfigError('invalid value %s for option %s' % (value, name))
         if self.is_mandatory():
             # value shall not be '' for a mandatory option
@@ -207,12 +208,9 @@ class Option(HiddenBaseType, DisabledBaseType):
                 (not self.is_multi() and value is None)):
                 raise MandatoryError('cannot override value to %s for '
               'option %s' % (value, name))
-        if who == "default" and value is None:
-            self.default = None
-            return
         if name not in config._cfgimpl_values:
             raise AttributeError('unknown option %s' % (name))
-        if config.is_frozen() and (self.has_callback() or self.isfrozen()):
+        if config.is_frozen() and self.isfrozen():
             raise ConflictConfigError('cannot override value to %s for '
               'option %s' % (value, name))
         if who == "default":