diff --git a/tiramisu/config.py b/tiramisu/config.py index 14240bf..156bde9 100644 --- a/tiramisu/config.py +++ b/tiramisu/config.py @@ -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): diff --git a/tiramisu/option.py b/tiramisu/option.py index c8823e2..25f02b8 100644 --- a/tiramisu/option.py +++ b/tiramisu/option.py @@ -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":