generic properties api
This commit is contained in:
parent
9604fd15ec
commit
934d011847
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
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":
|
||||
|
|
Loading…
Reference in New Issue