requirements: calculate all requirements for an option

This commit is contained in:
Emmanuel Garette 2013-09-02 17:13:07 +02:00
parent 52a6705fbf
commit 4636a977cc
3 changed files with 35 additions and 8 deletions

View File

@ -88,6 +88,30 @@ def test_multiple_requires():
c.ip_address_service c.ip_address_service
def test_multiple_requires_cumulative():
a = StrOption('activate_service', '')
b = IPOption('ip_address_service', '',
requires=[{'option': a, 'expected': 'yes', 'action': 'disabled'},
{'option': a, 'expected': 'yes', 'action': 'hidden'}])
od = OptionDescription('service', '', [a, b])
c = Config(od)
c.read_write()
c.ip_address_service
c.activate_service = 'yes'
props = []
try:
c.ip_address_service
except PropertiesOptionError as err:
props = err.proptype
assert set(props) == set(['hidden', 'disabled'])
c.activate_service = 'ok'
c.ip_address_service
c.activate_service = 'no'
c.ip_address_service
def test_multiple_requires_inverse(): def test_multiple_requires_inverse():
a = StrOption('activate_service', '') a = StrOption('activate_service', '')
b = IPOption('ip_address_service', '', b = IPOption('ip_address_service', '',

View File

@ -1045,6 +1045,8 @@ def validate_requires_arg(requires, name):
ret_requires = {} ret_requires = {}
config_action = {} config_action = {}
# start parsing all requires given by user (has dict)
# transforme it to a tuple
for require in requires: for require in requires:
if not type(require) == dict: if not type(require) == dict:
raise ValueError(_("malformed requirements type for option:" raise ValueError(_("malformed requirements type for option:"
@ -1058,6 +1060,7 @@ def validate_requires_arg(requires, name):
'{2}'.format(name, '{2}'.format(name,
unknown_keys, unknown_keys,
valid_keys)) valid_keys))
# prepare all attributes
try: try:
option = require['option'] option = require['option']
expected = require['expected'] expected = require['expected']
@ -1106,12 +1109,12 @@ def validate_requires_arg(requires, name):
inverse, transitive, same_action) inverse, transitive, same_action)
else: else:
ret_requires[action][option][1].append(expected) ret_requires[action][option][1].append(expected)
# transform dict to tuple
ret = [] ret = []
for opt_requires in ret_requires.values(): for opt_requires in ret_requires.values():
ret_action = [] ret_action = []
for require in opt_requires.values(): for require in opt_requires.values():
req = (require[0], tuple(require[1]), require[2], require[3], ret_action.append((require[0], tuple(require[1]), require[2],
require[4], require[5]) require[3], require[4], require[5]))
ret_action.append(req)
ret.append(tuple(ret_action)) ret.append(tuple(ret_action))
return frozenset(config_action.keys()), tuple(ret) return frozenset(config_action.keys()), tuple(ret)

View File

@ -402,11 +402,11 @@ class Settings(object):
def setpermissive(self, permissive, opt=None, path=None): def setpermissive(self, permissive, opt=None, path=None):
""" """
enables us to put the permissives in the storage enables us to put the permissives in the storage
:param path: the option's path :param path: the option's path
:param type: str :param type: str
:param opt: if an option object is set, the path is extracted. :param opt: if an option object is set, the path is extracted.
it is better (faster) to set the path parameter it is better (faster) to set the path parameter
instead of passing a :class:`tiramisu.option.Option()` object. instead of passing a :class:`tiramisu.option.Option()` object.
""" """
if opt is not None and path is None: if opt is not None and path is None:
@ -527,7 +527,7 @@ class Settings(object):
calc_properties.add(action) calc_properties.add(action)
# the calculation cannot be carried out # the calculation cannot be carried out
break break
return calc_properties return calc_properties
def _get_opt_path(self, opt): def _get_opt_path(self, opt):
return self.context().cfgimpl_get_description().impl_get_path_by_opt(opt) return self.context().cfgimpl_get_description().impl_get_path_by_opt(opt)