add requires test

This commit is contained in:
2017-12-29 11:38:41 +01:00
parent a40adea1d9
commit cfb4db2559
4 changed files with 916 additions and 28 deletions

View File

@ -288,15 +288,6 @@ class TiramisuOptionProperty(CommonTiramisuOption):
properties = properties.get()
return set(properties)
@count
def set(self, properties):
"""set properties for a specified option"""
self.get_option()
properties = frozenset(properties)
self.settings.setproperties(path=self.path,
properties=properties,
config_bag=self.config_bag)
@count
def add(self, prop):
self.get_option()
@ -308,7 +299,9 @@ class TiramisuOptionProperty(CommonTiramisuOption):
def pop(self, prop):
props = self.get()
props.remove(prop)
self.set(props)
self.settings.setproperties(path=self.path,
properties=frozenset(props),
config_bag=self.config_bag)
@count
def reset(self):

View File

@ -149,19 +149,20 @@ class Base(object):
calc_properties = frozenset()
requires = undefined
if properties is None:
properties = tuple()
properties = frozenset()
if isinstance(properties, tuple):
properties = frozenset(properties)
if is_multi and 'empty' not in properties:
properties = tuple(list(properties) + ['empty'])
if not isinstance(properties, tuple):
properties = properties | {'empty'}
if not isinstance(properties, frozenset):
raise TypeError(_('invalid properties type {0} for {1},'
' must be a tuple').format(type(properties),
' must be a frozenset').format(type(properties),
name))
if calc_properties != frozenset([]) and properties is not tuple():
set_forbidden_properties = calc_properties & set(properties)
if calc_properties != frozenset([]) and properties:
set_forbidden_properties = calc_properties & properties
if set_forbidden_properties != frozenset():
raise ValueError('conflict: properties already set in '
'requirement {0}'.format(
list(set_forbidden_properties)))
raise ValueError(_('conflict: properties already set in '
'requirement {0}').format(list(set_forbidden_properties)))
_setattr = object.__setattr__
_setattr(self, '_name', name)
_setattr(self, '_informations', {'doc': doc})

View File

@ -474,20 +474,23 @@ class Settings(object):
"imbrication detected for option:"
" '{0}' with requirement on: "
"'{1}'").format(path, reqpath))
if option.impl_is_multi():
if index is None:
# multi is allowed only for slaves
# so do not calculated requires if no index
continue
if not option.impl_is_multi():
idx = None
is_indexed = False
elif option.impl_is_master_slaves('slave'):
idx = index
is_indexed = False
else:
idx = None
is_indexed = True
sconfig_bag = config_bag.copy('nooption')
sconfig_bag.option = option
try:
value = context.getattr(reqpath,
idx,
sconfig_bag)
if is_indexed:
value = value[index]
except PropertiesOptionError as err:
if not transitive:
if all_properties is None:
@ -508,7 +511,7 @@ class Settings(object):
'').format(opt.impl_get_display_name(),
option.impl_get_display_name(),
prop_msg,
display_list(properties)))
display_list(list(properties))))
orig_value = err
# transitive action, force expected
value = expected[0]
@ -562,6 +565,19 @@ class Settings(object):
"""
if self._getcontext().cfgimpl_get_meta() is not None:
raise ConfigError(_('cannot change property with metaconfig'))
if path is not None and config_bag.option.impl_getrequires() is not None:
not_allowed_props = properties & getattr(config_bag.option, '_calc_properties', static_set)
if not_allowed_props:
if len(not_allowed_props) == 1:
prop_msg = _('property')
calc_msg = _('this property is calculated')
else:
prop_msg = _('properties')
calc_msg = _('those properties are calculated')
raise ValueError(_('cannot set {} {} for option {} {}'
'').format(prop_msg, display_list(list(not_allowed_props), add_quote=True),
config_bag.option.impl_getname(),
calc_msg))
if config_bag is None:
opt = None
else:
@ -590,9 +606,7 @@ class Settings(object):
raise ConfigError(_('cannot add this property: "{0}"').format(
' '.join(property_)))
props = self.getproperties(path,
None,
config_bag)
props = config_bag.option.impl_getproperties()
self.setproperties(path,
props | {property_},
config_bag,