This commit is contained in:
2019-06-12 08:45:56 +02:00
parent 4df36a5548
commit 620e8bbf2e
10 changed files with 231 additions and 219 deletions

View File

@ -121,6 +121,7 @@ class OptionBag:
'config_bag',
'ori_option', # original option (for example useful for symlinkoption)
'properties', # properties of current option
'properties_setted',
'apply_requires', # apply requires or not for this option
'fromconsistency' # history for consistency
)
@ -151,8 +152,15 @@ class OptionBag:
return self.option
elif key == 'apply_requires':
return True
elif key == 'properties_setted':
return False
raise KeyError('unknown key {} for OptionBag'.format(key)) # pragma: no cover
def __setattr__(self, key, val):
super().__setattr__(key, val)
if key == 'properties':
self.properties_setted = True
def __delattr__(self, key):
if key in ['properties', 'permissives']:
try:
@ -379,12 +387,12 @@ class Settings(object):
# get properties and permissive methods
def get_context_properties(self):
is_cached, props = self._p_.getcache(None,
None,
None,
{},
{},
'context_props')
is_cached, props, validated = self._p_.getcache(None,
None,
None,
{},
{},
'context_props')
if not is_cached:
props = self._p_.getproperties(None,
self.default_properties)
@ -392,7 +400,8 @@ class Settings(object):
None,
props,
{},
props)
props,
True)
return props
def getproperties(self,
@ -410,12 +419,12 @@ class Settings(object):
if apply_requires:
props = config_bag.properties
is_cached, props = self._p_.getcache(path,
config_bag.expiration_time,
index,
props,
{},
'self_props')
is_cached, props, validated = self._p_.getcache(path,
config_bag.expiration_time,
index,
props,
{},
'self_props')
else:
is_cached = False
if not is_cached:
@ -431,7 +440,8 @@ class Settings(object):
index,
props,
props,
config_bag.properties)
config_bag.properties,
True)
return props
def get_context_permissives(self):
@ -744,13 +754,18 @@ class Settings(object):
#____________________________________________________________
# validate properties
def calc_raises_properties(self,
option_properties,
config_properties,
config_permissives):
properties = option_properties & config_properties - SPECIAL_PROPERTIES
option_bag,
apply_requires=True):
raises_properties = option_bag.config_bag.properties - SPECIAL_PROPERTIES
# remove global permissive properties
if properties and ('permissive' in config_properties):
properties -= config_permissives
if raises_properties and ('permissive' in raises_properties):
raises_properties -= option_bag.config_bag.permissives
if apply_requires and option_bag.properties_setted:
option_properties = option_bag.properties
else:
option_properties = self.getproperties(option_bag,
apply_requires=apply_requires)
properties = option_properties & raises_properties
# at this point an option should not remain in properties
return properties
@ -764,11 +779,9 @@ class Settings(object):
was present
"""
config_bag = option_bag.config_bag
if not config_bag.properties: # pragma: no cover
if not config_bag.properties or config_bag.properties == frozenset(['cache']): # pragma: no cover
return
properties = self.calc_raises_properties(option_bag.properties,
config_bag.properties,
config_bag.permissives)
properties = self.calc_raises_properties(option_bag)
if properties != frozenset():
raise PropertiesOptionError(option_bag,
properties,