force_metaconfig_on_freeze in option (not in config)

This commit is contained in:
Emmanuel Garette 2019-02-24 08:34:50 +01:00
parent b5497ab517
commit 9812975aa7
2 changed files with 62 additions and 7 deletions

View File

@ -14,6 +14,7 @@ def teardown_function(function):
assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__)
owners.addowner('config')
owners.addowner('meta1')
owners.addowner('meta2')
@ -975,10 +976,49 @@ def test_meta_properties_meta_set_value():
def test_metaconfig_force_metaconfig_on_freeze():
dummy1 = StrOption('dummy1', 'doc dummy', default='default', properties=('force_metaconfig_on_freeze',))
group = OptionDescription('group', '', [dummy1])
config = Config(group, session_id='config')
config.owner.set(owners.config)
meta1 = MetaConfig([config], session_id='meta1')
meta1.owner.set(owners.meta1)
meta2 = MetaConfig([meta1], session_id='meta2')
meta2.owner.set(owners.meta2)
config.property.read_write()
config.option('dummy1').property.add('frozen')
#
assert config.option('dummy1').value.get() == 'default'
assert config.option('dummy1').owner.get() == 'default'
#
meta2.option('dummy1').value.set('meta2')
#
assert config.option('dummy1').value.get() == 'meta2'
assert config.option('dummy1').owner.get() == 'meta2'
#
config.option('dummy1').property.pop('frozen')
config.option('dummy1').value.set('config')
config.option('dummy1').property.add('frozen')
#
assert config.option('dummy1').value.get() == 'meta2'
assert config.option('dummy1').owner.get() == 'meta2'
#
meta1.option('dummy1').value.set('meta1')
#
assert config.option('dummy1').value.get() == 'meta1'
assert config.option('dummy1').owner.get() == 'meta1'
#
config.option('dummy1').property.pop('frozen')
assert config.option('dummy1').value.get() == 'config'
assert config.option('dummy1').owner.get() == 'config'
def test_metaconfig_force_metaconfig_on_freeze_option():
dummy1 = StrOption('dummy1', 'doc dummy', default='default')
dummy2 = StrOption('dummy2', 'doc dummy', default='default', properties=('force_default_on_freeze',))
group = OptionDescription('group', '', [dummy1, dummy2])
config = Config(group)
config = Config(group, session_id='config')
config.owner.set(owners.config)
meta1 = MetaConfig([config], session_id='meta1')
meta1.owner.set(owners.meta1)
meta2 = MetaConfig([meta1], session_id='meta2')
@ -1033,3 +1073,7 @@ def test_metaconfig_force_metaconfig_on_freeze():
meta1.option('dummy1').property.pop('force_metaconfig_on_freeze')
assert config.option('dummy1').value.get() == 'meta1'
assert config.option('dummy1').owner.get() == 'meta1'
#
config.option('dummy1').property.pop('frozen')
assert config.option('dummy1').value.get() == 'config'
assert config.option('dummy1').owner.get() == 'config'

View File

@ -93,6 +93,20 @@ class Values(object):
# and return it
return value
def force_to_metaconfig(self, option_bag):
# force_metaconfig_on_freeze in config => to metaconfig
# force_metaconfig_on_freeze in option + config is kernelconfig => to metaconfig
settings = option_bag.config_bag.context.cfgimpl_get_settings()
if 'force_metaconfig_on_freeze' in option_bag.properties:
settings = option_bag.config_bag.context.cfgimpl_get_settings()
if 'force_metaconfig_on_freeze' in option_bag.option.impl_getproperties() and \
not settings._p_.getproperties(option_bag.path, frozenset()):
# if force_metaconfig_on_freeze is only in option (not in config)
return option_bag.config_bag.context.impl_type == 'config'
else:
return True
return False
def getvalue(self,
option_bag):
"""actually retrieves the value
@ -116,10 +130,7 @@ class Values(object):
with_value=True)
if owner != owners.default and \
not ('frozen' in option_bag.properties and 'force_default_on_freeze' in option_bag.properties) and \
not ('frozen' in option_bag.properties and 'force_metaconfig_on_freeze' in option_bag.properties):
# if a value is store in storage, check if not frozen + force_default_on_freeze
# if frozen + force_default_on_freeze => force default value
# if frozen + force_metaconfig_on_freeze => force value of metaconfig
not ('frozen' in option_bag.properties and self.force_to_metaconfig(option_bag)):
return value
return self.getdefaultvalue(option_bag)
@ -333,7 +344,7 @@ class Values(object):
# hasn't force_metaconfig_on_freeze properties
ori_properties = doption_bag.properties
del doption_bag.properties
if 'force_metaconfig_on_freeze' not in doption_bag.properties:
if not self.force_to_metaconfig(doption_bag):
doption_bag.properties = ori_properties - {'force_metaconfig_on_freeze'}
else:
doption_bag.properties = ori_properties
@ -390,7 +401,7 @@ class Values(object):
owners.default,
index=option_bag.index)
if validate_meta is not False and (owner is owners.default or \
'force_metaconfig_on_freeze' in option_bag.properties):
'frozen' in option_bag.properties and 'force_metaconfig_on_freeze' in option_bag.properties):
moption_bag = self._get_meta(option_bag)
if moption_bag:
owner = moption_bag.config_bag.context.cfgimpl_get_values().getowner(moption_bag,