add requires test
This commit is contained in:
@ -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):
|
||||
|
@ -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})
|
||||
|
@ -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,
|
||||
|
Reference in New Issue
Block a user