tests on frozen and None value

This commit is contained in:
gwen 2012-09-19 09:31:02 +02:00
parent f50935523f
commit b2e97573bd
4 changed files with 21 additions and 86 deletions

View File

@ -72,13 +72,15 @@ def test_has_callback():
config = Config(descr, bool=False)
# because dummy has a callback
dummy = config.unwrap_from_path('gc.dummy')
config.cfgimpl_freeze()
dummy.freeze()
raises(TypeError, "config.gc.dummy = True")
#____________________________________________________________
def test_has_callback_with_setoption():
def test_freeze_and_has_callback_with_setoption():
descr = make_description()
config = Config(descr, bool=False)
config.cfgimpl_freeze()
dummy = config.unwrap_from_path('gc.dummy')
dummy.freeze()
raises(TypeError, "config.gc.setoption('dummy', True, 'gen_config')")

View File

@ -74,6 +74,7 @@ def test_frozen_value():
s = StrOption("string", "", default="string")
descr = OptionDescription("options", "", [s])
config = Config(descr)
config.cfgimpl_freeze()
s.freeze()
raises(TypeError, 'config.string = "egg"')
@ -82,7 +83,9 @@ def test_freeze():
descr = make_description()
conf = Config(descr)
conf.cfgimpl_freeze()
raises(TypeError, "conf.gc.name = 'try to modify'")
name = conf.unwrap_from_path("gc.name")
name.freeze()
raises(TypeError, "conf.gc.name = 'framework'")
# ____________________________________________________________
def test_is_hidden():
descr = make_description()

View File

@ -27,17 +27,15 @@ 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']
_cfgimpl_mandatory = True
_cfgimpl_frozen = False
_cfgimpl_frozen = True
_cfgimpl_owner = default_owner
_cfgimpl_toplevel = None
# TODO implement unicity by name
@ -167,20 +165,12 @@ class Config(object):
# ____________________________________________________________
def __setattr__(self, name, value):
if '.' in name:
homeconfig, name = self._cfgimpl_get_home_by_path(name)
return setattr(homeconfig, name, value)
if name.startswith('_cfgimpl_'):
self.__dict__[name] = value
return
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 '.' in name:
homeconfig, name = self._cfgimpl_get_home_by_path(name)
return setattr(homeconfig, name, value)
if type(getattr(self._cfgimpl_descr, name)) != SymLinkOption:
self._validate(name, getattr(self._cfgimpl_descr, name))
self.setoption(name, value, self._cfgimpl_owner)
@ -189,8 +179,6 @@ class Config(object):
apply_requires(opt_or_descr, self)
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:
@ -340,10 +328,6 @@ class Config(object):
if child.has_callback() and who=='default':
raise TypeError("trying to set a value to an option "
"wich has a callback: {0}".format(name))
# if oldowner == who:
# oldvalue = getattr(self, name)
# if oldvalue == value:
# return
child.setoption(self, value, who)
if (value is None and who != 'default' and not child.is_multi()):
child.setowner(self, 'default')
@ -484,7 +468,7 @@ class Config(object):
try:
yield child._name, getattr(self, child._name)
except:
pass # hidden, disabled option group
pass # option with properties
def iter_groups(self, group_type=None):
"iteration on OptionDescriptions"

View File

@ -157,9 +157,6 @@ class Option(HiddenBaseType, DisabledBaseType):
def is_forced_on_freeze(self):
return self._frozen and self._force_default_on_freeze
def is_frozen(self):
return self._frozen
def getdoc(self):
return self.doc
@ -179,12 +176,10 @@ class Option(HiddenBaseType, DisabledBaseType):
# config *must* be only the **parent** config (not the toplevel config)
# owner is a **real* owner, a list is actually allowable here
name = self._name
if self.is_frozen() and config.is_frozen():
raise TypeError("trying to change a frozen option's owner: %s" % name)
if self.is_multi():
if not type(owner) == list:
raise ConfigError("invalid owner for multi "
"option: {0}".format(self._name))
"option: {0}".format(name))
config._cfgimpl_value_owners[name] = owner
def getowner(self, config):
@ -194,11 +189,6 @@ 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
# we want the possibility to reset everything
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():
@ -210,13 +200,14 @@ class Option(HiddenBaseType, DisabledBaseType):
value = Multi([{'': None}.get(i, i) for i in value], config, self)
if config.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 '
raise MandatoryError('cannot change the 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 self.isfrozen():
raise ConflictConfigError('cannot override value to %s for '
'option %s' % (value, name))
if config.is_frozen() and self.is_frozen():
raise TypeError('cannot change the value to %s for '
'option %s' % (str(value), name))
if who == "default":
# changes the default value (and therefore resets the previous value)
if self._validate(value):
@ -280,10 +271,6 @@ class ChoiceOption(Option):
callback=callback, callback_params=callback_params,
requires=requires, multi=multi, mandatory=mandatory)
def setoption(self, config, value, who):
name = self._name
super(ChoiceOption, self).setoption(config, value, who)
def _validate(self, value):
if not self.open_values:
return value is None or value in self.values
@ -308,33 +295,13 @@ class IntOption(Option):
opt_type = 'int'
def _validate(self, value):
try:
int(value)
except TypeError:
return False
return True
def setoption(self, config, value, who):
try:
super(IntOption, self).setoption(config, value, who)
except TypeError, e:
raise ConfigError(*e.args)
return isinstance(value, int)
class FloatOption(Option):
opt_type = 'float'
def _validate(self, value):
try:
float(value)
except TypeError:
return False
return True
def setoption(self, config, value, who):
try:
super(FloatOption, self).setoption(config, float(value), who)
except TypeError, e:
raise ConfigError(*e.args)
return isinstance(value, float)
class StrOption(Option):
opt_type = 'string'
@ -342,12 +309,6 @@ class StrOption(Option):
def _validate(self, value):
return isinstance(value, str)
def setoption(self, config, value, who):
try:
super(StrOption, self).setoption(config, value, who)
except TypeError, e:
raise ConfigError(*e.args)
class SymLinkOption(object):
opt_type = 'symlink'
@ -356,10 +317,7 @@ class SymLinkOption(object):
self.path = path
def setoption(self, config, value, who):
try:
setattr(config, self.path, value) # .setoption(self.path, value, who)
except TypeError, e:
raise ConfigError(*e.args)
setattr(config, self.path, value) # .setoption(self.path, value, who)
class IPOption(Option):
opt_type = 'ip'
@ -368,12 +326,6 @@ class IPOption(Option):
# by now the validation is nothing but a string, use IPy instead
return isinstance(value, str)
def setoption(self, config, value, who):
try:
super(IPOption, self).setoption(config, value, who)
except TypeError, e:
raise ConfigError(*e.args)
class NetmaskOption(Option):
opt_type = 'netmask'
@ -381,12 +333,6 @@ class NetmaskOption(Option):
# by now the validation is nothing but a string, use IPy instead
return isinstance(value, str)
def setoption(self, config, value, who):
try:
super(NetmaskOption, self).setoption(config, value, who)
except TypeError, e:
raise ConfigError(*e.args)
class ArbitraryOption(Option):
def __init__(self, name, doc, default=None, defaultfactory=None,
requires=None, multi=False, mandatory=False):