tests on frozen and None value
This commit is contained in:
parent
f50935523f
commit
b2e97573bd
|
@ -72,13 +72,15 @@ def test_has_callback():
|
||||||
config = Config(descr, bool=False)
|
config = Config(descr, bool=False)
|
||||||
# because dummy has a callback
|
# because dummy has a callback
|
||||||
dummy = config.unwrap_from_path('gc.dummy')
|
dummy = config.unwrap_from_path('gc.dummy')
|
||||||
|
config.cfgimpl_freeze()
|
||||||
dummy.freeze()
|
dummy.freeze()
|
||||||
raises(TypeError, "config.gc.dummy = True")
|
raises(TypeError, "config.gc.dummy = True")
|
||||||
|
|
||||||
#____________________________________________________________
|
#____________________________________________________________
|
||||||
def test_has_callback_with_setoption():
|
def test_freeze_and_has_callback_with_setoption():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr, bool=False)
|
config = Config(descr, bool=False)
|
||||||
|
config.cfgimpl_freeze()
|
||||||
dummy = config.unwrap_from_path('gc.dummy')
|
dummy = config.unwrap_from_path('gc.dummy')
|
||||||
dummy.freeze()
|
dummy.freeze()
|
||||||
raises(TypeError, "config.gc.setoption('dummy', True, 'gen_config')")
|
raises(TypeError, "config.gc.setoption('dummy', True, 'gen_config')")
|
||||||
|
|
|
@ -74,6 +74,7 @@ def test_frozen_value():
|
||||||
s = StrOption("string", "", default="string")
|
s = StrOption("string", "", default="string")
|
||||||
descr = OptionDescription("options", "", [s])
|
descr = OptionDescription("options", "", [s])
|
||||||
config = Config(descr)
|
config = Config(descr)
|
||||||
|
config.cfgimpl_freeze()
|
||||||
s.freeze()
|
s.freeze()
|
||||||
raises(TypeError, 'config.string = "egg"')
|
raises(TypeError, 'config.string = "egg"')
|
||||||
|
|
||||||
|
@ -82,7 +83,9 @@ def test_freeze():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
conf = Config(descr)
|
conf = Config(descr)
|
||||||
conf.cfgimpl_freeze()
|
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():
|
def test_is_hidden():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
|
|
|
@ -27,17 +27,15 @@ from tiramisu.error import (PropertiesOptionError, ConfigError, NotFoundError,
|
||||||
from tiramisu.option import (OptionDescription, Option, SymLinkOption,
|
from tiramisu.option import (OptionDescription, Option, SymLinkOption,
|
||||||
group_types, Multi, apply_requires)
|
group_types, Multi, apply_requires)
|
||||||
from tiramisu.autolib import carry_out_calculation
|
from tiramisu.autolib import carry_out_calculation
|
||||||
import traceback
|
|
||||||
|
|
||||||
# ______________________________________________________________________
|
# ______________________________________________________________________
|
||||||
# generic owner. 'default' is the general config owner after init time
|
# generic owner. 'default' is the general config owner after init time
|
||||||
default_owner = 'user'
|
default_owner = 'user'
|
||||||
DEBUG = False
|
|
||||||
# ____________________________________________________________
|
# ____________________________________________________________
|
||||||
class Config(object):
|
class Config(object):
|
||||||
_cfgimpl_properties = ['hidden', 'disabled']
|
_cfgimpl_properties = ['hidden', 'disabled']
|
||||||
_cfgimpl_mandatory = True
|
_cfgimpl_mandatory = True
|
||||||
_cfgimpl_frozen = False
|
_cfgimpl_frozen = True
|
||||||
_cfgimpl_owner = default_owner
|
_cfgimpl_owner = default_owner
|
||||||
_cfgimpl_toplevel = None
|
_cfgimpl_toplevel = None
|
||||||
# TODO implement unicity by name
|
# TODO implement unicity by name
|
||||||
|
@ -167,20 +165,12 @@ class Config(object):
|
||||||
|
|
||||||
# ____________________________________________________________
|
# ____________________________________________________________
|
||||||
def __setattr__(self, name, value):
|
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_'):
|
if name.startswith('_cfgimpl_'):
|
||||||
self.__dict__[name] = value
|
self.__dict__[name] = value
|
||||||
return
|
return
|
||||||
if self.is_frozen() and getattr(self, name) != value:
|
if '.' in name:
|
||||||
raise TypeError("trying to change a value in a frozen config"
|
homeconfig, name = self._cfgimpl_get_home_by_path(name)
|
||||||
": {0} {1}".format(name, value))
|
return setattr(homeconfig, 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:
|
if type(getattr(self._cfgimpl_descr, name)) != SymLinkOption:
|
||||||
self._validate(name, getattr(self._cfgimpl_descr, name))
|
self._validate(name, getattr(self._cfgimpl_descr, name))
|
||||||
self.setoption(name, value, self._cfgimpl_owner)
|
self.setoption(name, value, self._cfgimpl_owner)
|
||||||
|
@ -189,8 +179,6 @@ class Config(object):
|
||||||
apply_requires(opt_or_descr, self)
|
apply_requires(opt_or_descr, self)
|
||||||
if not isinstance(opt_or_descr, Option) and \
|
if not isinstance(opt_or_descr, Option) and \
|
||||||
not isinstance(opt_or_descr, OptionDescription):
|
not isinstance(opt_or_descr, OptionDescription):
|
||||||
if DEBUG:
|
|
||||||
traceback.print_exc()
|
|
||||||
raise TypeError('Unexpected object: {0}'.format(repr(opt_or_descr)))
|
raise TypeError('Unexpected object: {0}'.format(repr(opt_or_descr)))
|
||||||
properties = opt_or_descr.properties
|
properties = opt_or_descr.properties
|
||||||
for proper in properties:
|
for proper in properties:
|
||||||
|
@ -340,10 +328,6 @@ class Config(object):
|
||||||
if child.has_callback() and who=='default':
|
if child.has_callback() and who=='default':
|
||||||
raise TypeError("trying to set a value to an option "
|
raise TypeError("trying to set a value to an option "
|
||||||
"wich has a callback: {0}".format(name))
|
"wich has a callback: {0}".format(name))
|
||||||
# if oldowner == who:
|
|
||||||
# oldvalue = getattr(self, name)
|
|
||||||
# if oldvalue == value:
|
|
||||||
# return
|
|
||||||
child.setoption(self, value, who)
|
child.setoption(self, value, who)
|
||||||
if (value is None and who != 'default' and not child.is_multi()):
|
if (value is None and who != 'default' and not child.is_multi()):
|
||||||
child.setowner(self, 'default')
|
child.setowner(self, 'default')
|
||||||
|
@ -484,7 +468,7 @@ class Config(object):
|
||||||
try:
|
try:
|
||||||
yield child._name, getattr(self, child._name)
|
yield child._name, getattr(self, child._name)
|
||||||
except:
|
except:
|
||||||
pass # hidden, disabled option group
|
pass # option with properties
|
||||||
|
|
||||||
def iter_groups(self, group_type=None):
|
def iter_groups(self, group_type=None):
|
||||||
"iteration on OptionDescriptions"
|
"iteration on OptionDescriptions"
|
||||||
|
|
|
@ -157,9 +157,6 @@ class Option(HiddenBaseType, DisabledBaseType):
|
||||||
def is_forced_on_freeze(self):
|
def is_forced_on_freeze(self):
|
||||||
return self._frozen and self._force_default_on_freeze
|
return self._frozen and self._force_default_on_freeze
|
||||||
|
|
||||||
def is_frozen(self):
|
|
||||||
return self._frozen
|
|
||||||
|
|
||||||
def getdoc(self):
|
def getdoc(self):
|
||||||
return self.doc
|
return self.doc
|
||||||
|
|
||||||
|
@ -179,12 +176,10 @@ class Option(HiddenBaseType, DisabledBaseType):
|
||||||
# config *must* be only the **parent** config (not the toplevel config)
|
# config *must* be only the **parent** config (not the toplevel config)
|
||||||
# owner is a **real* owner, a list is actually allowable here
|
# owner is a **real* owner, a list is actually allowable here
|
||||||
name = self._name
|
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 self.is_multi():
|
||||||
if not type(owner) == list:
|
if not type(owner) == list:
|
||||||
raise ConfigError("invalid owner for multi "
|
raise ConfigError("invalid owner for multi "
|
||||||
"option: {0}".format(self._name))
|
"option: {0}".format(name))
|
||||||
config._cfgimpl_value_owners[name] = owner
|
config._cfgimpl_value_owners[name] = owner
|
||||||
|
|
||||||
def getowner(self, config):
|
def getowner(self, config):
|
||||||
|
@ -194,11 +189,6 @@ class Option(HiddenBaseType, DisabledBaseType):
|
||||||
def setoption(self, config, value, who):
|
def setoption(self, config, value, who):
|
||||||
"who is **not necessarily** a owner because it cannot be a list"
|
"who is **not necessarily** a owner because it cannot be a list"
|
||||||
name = self._name
|
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):
|
if not self.validate(value):
|
||||||
raise ConfigError('invalid value %s for option %s' % (value, name))
|
raise ConfigError('invalid value %s for option %s' % (value, name))
|
||||||
if self.is_mandatory():
|
if self.is_mandatory():
|
||||||
|
@ -210,13 +200,14 @@ class Option(HiddenBaseType, DisabledBaseType):
|
||||||
value = Multi([{'': None}.get(i, i) for i in value], config, self)
|
value = Multi([{'': None}.get(i, i) for i in value], config, self)
|
||||||
if config.is_mandatory() and ((self.is_multi() and value == []) or \
|
if config.is_mandatory() and ((self.is_multi() and value == []) or \
|
||||||
(not self.is_multi() and value is None)):
|
(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))
|
'option %s' % (value, name))
|
||||||
if name not in config._cfgimpl_values:
|
if name not in config._cfgimpl_values:
|
||||||
raise AttributeError('unknown option %s' % (name))
|
raise AttributeError('unknown option %s' % (name))
|
||||||
if config.is_frozen() and self.isfrozen():
|
|
||||||
raise ConflictConfigError('cannot override value to %s for '
|
if config.is_frozen() and self.is_frozen():
|
||||||
'option %s' % (value, name))
|
raise TypeError('cannot change the value to %s for '
|
||||||
|
'option %s' % (str(value), name))
|
||||||
if who == "default":
|
if who == "default":
|
||||||
# changes the default value (and therefore resets the previous value)
|
# changes the default value (and therefore resets the previous value)
|
||||||
if self._validate(value):
|
if self._validate(value):
|
||||||
|
@ -280,10 +271,6 @@ class ChoiceOption(Option):
|
||||||
callback=callback, callback_params=callback_params,
|
callback=callback, callback_params=callback_params,
|
||||||
requires=requires, multi=multi, mandatory=mandatory)
|
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):
|
def _validate(self, value):
|
||||||
if not self.open_values:
|
if not self.open_values:
|
||||||
return value is None or value in self.values
|
return value is None or value in self.values
|
||||||
|
@ -308,33 +295,13 @@ class IntOption(Option):
|
||||||
opt_type = 'int'
|
opt_type = 'int'
|
||||||
|
|
||||||
def _validate(self, value):
|
def _validate(self, value):
|
||||||
try:
|
return isinstance(value, int)
|
||||||
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)
|
|
||||||
|
|
||||||
class FloatOption(Option):
|
class FloatOption(Option):
|
||||||
opt_type = 'float'
|
opt_type = 'float'
|
||||||
|
|
||||||
def _validate(self, value):
|
def _validate(self, value):
|
||||||
try:
|
return isinstance(value, float)
|
||||||
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)
|
|
||||||
|
|
||||||
class StrOption(Option):
|
class StrOption(Option):
|
||||||
opt_type = 'string'
|
opt_type = 'string'
|
||||||
|
@ -342,12 +309,6 @@ class StrOption(Option):
|
||||||
def _validate(self, value):
|
def _validate(self, value):
|
||||||
return isinstance(value, str)
|
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):
|
class SymLinkOption(object):
|
||||||
opt_type = 'symlink'
|
opt_type = 'symlink'
|
||||||
|
|
||||||
|
@ -356,10 +317,7 @@ class SymLinkOption(object):
|
||||||
self.path = path
|
self.path = path
|
||||||
|
|
||||||
def setoption(self, config, value, who):
|
def setoption(self, config, value, who):
|
||||||
try:
|
setattr(config, self.path, value) # .setoption(self.path, value, who)
|
||||||
setattr(config, self.path, value) # .setoption(self.path, value, who)
|
|
||||||
except TypeError, e:
|
|
||||||
raise ConfigError(*e.args)
|
|
||||||
|
|
||||||
class IPOption(Option):
|
class IPOption(Option):
|
||||||
opt_type = 'ip'
|
opt_type = 'ip'
|
||||||
|
@ -368,12 +326,6 @@ class IPOption(Option):
|
||||||
# by now the validation is nothing but a string, use IPy instead
|
# by now the validation is nothing but a string, use IPy instead
|
||||||
return isinstance(value, str)
|
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):
|
class NetmaskOption(Option):
|
||||||
opt_type = 'netmask'
|
opt_type = 'netmask'
|
||||||
|
|
||||||
|
@ -381,12 +333,6 @@ class NetmaskOption(Option):
|
||||||
# by now the validation is nothing but a string, use IPy instead
|
# by now the validation is nothing but a string, use IPy instead
|
||||||
return isinstance(value, str)
|
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):
|
class ArbitraryOption(Option):
|
||||||
def __init__(self, name, doc, default=None, defaultfactory=None,
|
def __init__(self, name, doc, default=None, defaultfactory=None,
|
||||||
requires=None, multi=False, mandatory=False):
|
requires=None, multi=False, mandatory=False):
|
||||||
|
|
Loading…
Reference in New Issue