test mandatory

This commit is contained in:
gwen 2012-11-06 15:19:36 +01:00
parent 3bd9d2c45b
commit bfb5045753
2 changed files with 39 additions and 20 deletions

View File

@ -9,7 +9,7 @@ def make_description():
nombre_interfaces = IntOption('nombre_interfaces', "nombre d'interfaces à activer", nombre_interfaces = IntOption('nombre_interfaces', "nombre d'interfaces à activer",
default=1) default=1)
activer_proxy_client = BoolOption('activer_proxy_client', "utiliser un proxy", activer_proxy_client = BoolOption('activer_proxy_client', "utiliser un proxy",
default=False) default=False)
mode_conteneur_actif = BoolOption('mode_conteneur_actif', "le serveur est en mode conteneur", mode_conteneur_actif = BoolOption('mode_conteneur_actif', "le serveur est en mode conteneur",
default=False) default=False)
# hidden (variable cachée) # hidden (variable cachée)
@ -25,9 +25,9 @@ def make_description():
interface1 = OptionDescription('interface1', '', [master]) interface1 = OptionDescription('interface1', '', [master])
interface1.set_group_type('group') interface1.set_group_type('group')
general = OptionDescription('general', '', [numero_etab, nom_machine, general = OptionDescription('general', '', [numero_etab, nom_machine,
nombre_interfaces, activer_proxy_client, nombre_interfaces, activer_proxy_client,
mode_conteneur_actif, adresse_serveur_ntp, mode_conteneur_actif, adresse_serveur_ntp,
time_zone]) time_zone])
general.set_group_type('family') general.set_group_type('family')
creole = OptionDescription('creole', 'first tiramisu configuration', [general, interface1]) creole = OptionDescription('creole', 'first tiramisu configuration', [general, interface1])
@ -39,7 +39,7 @@ def test_base_config():
config = Config(descr) config = Config(descr)
assert config.creole.general.activer_proxy_client == False assert config.creole.general.activer_proxy_client == False
assert config.creole.general.nom_machine == "eoleng" assert config.creole.general.nom_machine == "eoleng"
assert config.get('nom_machine') == "eoleng" assert config.get('nom_machine') == "eoleng"
result = {'general.numero_etab': None, 'general.nombre_interfaces': 1, result = {'general.numero_etab': None, 'general.nombre_interfaces': 1,
'general.serveur_ntp': [], 'interface1.ip_admin_eth0.ip_admin_eth0': None, 'general.serveur_ntp': [], 'interface1.ip_admin_eth0.ip_admin_eth0': None,
'general.mode_conteneur_actif': False, 'general.time_zone': 'Paris', 'general.mode_conteneur_actif': False, 'general.time_zone': 'Paris',
@ -67,4 +67,13 @@ def test_iter_on_groups():
result = list(config.creole.iter_groups()) result = list(config.creole.iter_groups())
group_names = [res[0] for res in result] group_names = [res[0] for res in result]
assert group_names == ['general', 'interface1'] assert group_names == ['general', 'interface1']
def test_iter_on_empty_group():
config = Config(OptionDescription("name", "descr", [] ))
result = list(config.iter_groups())
assert result == []
for i in config.iter_groups():
pass
for i in config:
pass
assert [] == list(config)

View File

@ -209,6 +209,16 @@ class Config(object):
return True return True
return False return False
def _test_mandatory(self, path, opt):
# mandatory options
homeconfig = self._cfgimpl_get_toplevel()
mandatory = homeconfig._cfgimpl_mandatory
if opt.is_mandatory() and mandatory:
if self._is_empty(opt) and \
opt.is_empty_by_default():
raise MandatoryError("option: {0} is mandatory "
"and shall have a value".format(path))
def __getattr__(self, name): def __getattr__(self, name):
return self._getattr(name) return self._getattr(name)
@ -299,15 +309,7 @@ class Config(object):
raise ConfigError('invalid calculated value returned' raise ConfigError('invalid calculated value returned'
' for option {0}'.format(name)) ' for option {0}'.format(name))
self._cfgimpl_values[name] = _result self._cfgimpl_values[name] = _result
self._test_mandatory(name, opt_or_descr)
# mandatory options
homeconfig = self._cfgimpl_get_toplevel()
mandatory = homeconfig._cfgimpl_mandatory
if opt_or_descr.is_mandatory() and mandatory:
if self._is_empty(opt_or_descr) and \
opt_or_descr.is_empty_by_default():
raise MandatoryError("option: {0} is mandatory "
"and shall have a value".format(name))
# frozen and force default # frozen and force default
if not opt_or_descr.has_callback() and opt_or_descr.is_forced_on_freeze(): if not opt_or_descr.has_callback() and opt_or_descr.is_forced_on_freeze():
return opt_or_descr.getdefault() return opt_or_descr.getdefault()
@ -577,11 +579,11 @@ class Config(object):
groups = [group_type] groups = [group_type]
for child in self._cfgimpl_descr._children: for child in self._cfgimpl_descr._children:
if isinstance(child, OptionDescription): if isinstance(child, OptionDescription):
try: try:
if child.get_group_type() in groups: if child.get_group_type() in groups:
yield child._name, getattr(self, child._name) yield child._name, getattr(self, child._name)
except: except:
pass # hidden, disabled option pass # hidden, disabled option
# ______________________________________________________________________ # ______________________________________________________________________
def __str__(self, indent=""): def __str__(self, indent=""):
"Config's string representation" "Config's string representation"
@ -742,7 +744,15 @@ def mandatory_warnings(config):
config._cfgimpl_get_toplevel()._cfgimpl_mandatory = True config._cfgimpl_get_toplevel()._cfgimpl_mandatory = True
for path in config._cfgimpl_descr.getpaths(include_groups=True): for path in config._cfgimpl_descr.getpaths(include_groups=True):
try: try:
value = getattr(config, path) if '.' in path:
homeconfig, path = config._cfgimpl_get_home_by_path(path)
else:
homeconfig = config
opt = getattr(homeconfig._cfgimpl_descr, path)
#for PropertiesOptionError
homeconfig._validate(path, opt)
if not isinstance(opt, OptionDescription):
homeconfig._test_mandatory(path, opt)
except MandatoryError: except MandatoryError:
yield path yield path
except PropertiesOptionError: except PropertiesOptionError: