diff --git a/test/test_cache.py b/test/test_cache.py index cb1c8fc..13d44e3 100644 --- a/test/test_cache.py +++ b/test/test_cache.py @@ -421,7 +421,7 @@ def test_cache_master_and_slaves_master(): cfg = Config(maconfig) cfg.property.read_write() cfg.value.dict() - global_props = ['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings'] + global_props = ['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings', 'force_store_value'] val1_props = [] val1_val1_props = ['empty'] val1_val2_props = [] @@ -450,7 +450,7 @@ def test_cache_master_and_slaves_master(): compare(cfg._config_bag.context.cfgimpl_get_values()._p_.get_cached(), {'val1.val1': {None: ([], None)}}) # cfg.option('val1.val1').value.set([undefined]) - compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)}}) + compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(global_props), None)}}) assert cfg._config_bag.context.cfgimpl_get_values()._p_.get_cached() == {} cfg.value.dict() if TIRAMISU_VERSION == 2: @@ -470,7 +470,7 @@ def test_cache_master_and_slaves_master(): cfg.option('val1.val1').value.set([undefined, undefined]) cfg.value.dict() cfg.option('val1.val2', 1).value.set('oui') - compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)}}) + compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings', 'force_store_value']), None)}}) assert cfg._config_bag.context.cfgimpl_get_values()._p_.get_cached() == {} if TIRAMISU_VERSION == 2: val1_val2_props = {None: (set([]), None), 0: (set([]), None), 1: (set([]), None)} @@ -497,7 +497,7 @@ def test_cache_master_callback(): cfg = Config(maconfig) cfg.property.read_write() cfg.value.dict() - global_props = ['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings'] + global_props = ['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings', 'force_store_value'] val1_props = [] val1_val1_props = ['empty'] val1_val2_props = [] @@ -522,7 +522,7 @@ def test_cache_master_callback(): 'val1.val2': {None: (val1_val2_props, None)}}) compare(cfg._config_bag.context.cfgimpl_get_values()._p_.get_cached(), {'val1.val1': {None: ([], None)}}) cfg.option('val1.val1').value.set([undefined]) - compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)}}) + compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(global_props), None)}}) assert cfg._config_bag.context.cfgimpl_get_values()._p_.get_cached() == {} cfg.value.dict() @@ -544,7 +544,7 @@ def test_cache_requires(): cfg.property.pop('expire') assert cfg._config_bag.context.cfgimpl_get_values()._p_.get_cached() == {} assert cfg.option('ip_address_service').value.get() == None - compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)}, + compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings', 'force_store_value']), None)}, 'activate_service': {None: (set([]), None)}, 'ip_address_service': {None: (set([]), None)}}) @@ -554,30 +554,30 @@ def test_cache_requires(): compare(cfg._config_bag.context.cfgimpl_get_values()._p_.get_cached(), {'ip_address_service': {None: (None, None)}, 'activate_service': {None: (True, None)}}) cfg.value.dict() - compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)}, + compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings', 'force_store_value']), None)}, 'activate_service': {None: (set([]), None)}, 'ip_address_service': {None: (set([]), None)}}) compare(cfg._config_bag.context.cfgimpl_get_values()._p_.get_cached(), {'ip_address_service': {None: (None, None)}, 'activate_service': {None: (True, None)}}) cfg.option('ip_address_service').value.set('1.1.1.1') - compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)}, + compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings', 'force_store_value']), None)}, 'activate_service': {None: (set([]), None)}}) compare(cfg._config_bag.context.cfgimpl_get_values()._p_.get_cached(), {'activate_service': {None: (True, None)}}) cfg.value.dict() - compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)}, + compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings', 'force_store_value']), None)}, 'activate_service': {None: (set([]), None)}, 'ip_address_service': {None: (set([]), None)}}) compare(cfg._config_bag.context.cfgimpl_get_values()._p_.get_cached(), {'ip_address_service': {None: ('1.1.1.1', None)}, 'activate_service': {None: (True, None)}}) cfg.option('activate_service').value.set(False) - compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)}}) + compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings', 'force_store_value']), None)}}) assert cfg._config_bag.context.cfgimpl_get_values()._p_.get_cached() == {} cfg.value.dict() - compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)}, + compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings', 'force_store_value']), None)}, 'activate_service': {None: (set([]), None)}, 'ip_address_service': {None: (set(['disabled']), None)}}) @@ -593,7 +593,7 @@ def test_cache_global_properties(): cfg.property.read_write() assert cfg._config_bag.context.cfgimpl_get_values()._p_.get_cached() == {} assert cfg.option('ip_address_service').value.get() == None - compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings']), None)}, + compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'disabled', 'frozen', 'hidden', 'validator', 'warnings', 'force_store_value']), None)}, 'activate_service': {None: (set([]), None)}, 'ip_address_service': {None: (set([]), None)}}) @@ -604,12 +604,12 @@ def test_cache_global_properties(): 'activate_service': {None: (True, None)}}) cfg.property.pop('disabled') assert cfg.option('ip_address_service').value.get() == None - compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'frozen', 'hidden', 'validator', 'warnings']), None)}, + compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'frozen', 'hidden', 'validator', 'warnings', 'force_store_value']), None)}, 'activate_service': {None: (set([]), None)}, 'ip_address_service': {None: (set([]), None)}}) cfg.property.add('test') assert cfg.option('ip_address_service').value.get() == None - compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'frozen', 'hidden', 'validator', 'warnings', 'test']), None)}, + compare(cfg._config_bag.context.cfgimpl_get_settings()._p_.get_cached(), {None: {None: (set(['cache', 'frozen', 'hidden', 'validator', 'warnings', 'test', 'force_store_value']), None)}, 'activate_service': {None: (set([]), None)}, 'ip_address_service': {None: (set([]), None)}}) diff --git a/test/test_duplicate_config.py b/test/test_duplicate_config.py index 7721f1c..82c7bf8 100644 --- a/test/test_duplicate_config.py +++ b/test/test_duplicate_config.py @@ -72,8 +72,17 @@ def test_copy_force_store_value(): descr = make_description() conf = Config(descr) conf2 = Config(descr) + assert to_tuple(conf.value.exportation()) == ((), (), (), ()) + assert to_tuple(conf2.value.exportation()) == ((), (), (), ()) + # + conf.property.read_write() + assert to_tuple(conf.value.exportation()) == (('creole.general.wantref',), (None,), (False,), ('forced',)) + assert to_tuple(conf2.value.exportation()) == ((), (), (), ()) + # + conf2.property.read_only() assert to_tuple(conf.value.exportation()) == (('creole.general.wantref',), (None,), (False,), ('forced',)) assert to_tuple(conf2.value.exportation()) == (('creole.general.wantref',), (None,), (False,), ('forced',)) + # conf.option('creole.general.wantref').value.set(True) assert to_tuple(conf.value.exportation()) == (('creole.general.wantref',), (None,), (True,), ('user',)) assert to_tuple(conf2.value.exportation()) == (('creole.general.wantref',), (None,), (False,), ('forced',)) @@ -82,9 +91,9 @@ def test_copy_force_store_value(): def test_copy_force_store_value_metaconfig(): descr = make_description() meta = MetaConfig([], optiondescription=descr) - meta.property.read_only() conf = meta.config.new(session_id='conf') assert meta.property.get() == conf.property.get() assert meta.permissive.get() == conf.permissive.get() + conf.property.read_write() assert to_tuple(conf.value.exportation()) == (('creole.general.wantref',), (None,), (False,), ('forced',)) - assert to_tuple(meta.value.exportation()) == (('creole.general.wantref',), (None,), (False,), ('forced',)) + assert to_tuple(meta.value.exportation()) == ((), (), (), ()) diff --git a/tiramisu/api.py b/tiramisu/api.py index e90201d..d2df680 100644 --- a/tiramisu/api.py +++ b/tiramisu/api.py @@ -906,12 +906,17 @@ class TiramisuContextProperty(TiramisuContext): def read_only(self): """Set config to read only mode""" + old_props = self._config_bag.properties settings = self._config_bag.context.cfgimpl_get_settings() settings.read_only(self._config_bag.context) del self._config_bag.properties + if 'force_store_value' not in old_props and \ + 'force_store_value' in self._config_bag.properties: + self._force_store_value() def read_write(self): """Set config to read and write mode""" + old_props = self._config_bag.properties settings = self._config_bag.context.cfgimpl_get_settings() settings.read_write(self._config_bag.context) #FIXME ? @@ -919,6 +924,9 @@ class TiramisuContextProperty(TiramisuContext): settings.set_context_permissives(permissives) #/FIXME ? del self._config_bag.properties + if 'force_store_value' not in old_props and \ + 'force_store_value' in self._config_bag.properties: + self._force_store_value() def add(self, prop): """Add a config property""" @@ -939,10 +947,16 @@ class TiramisuContextProperty(TiramisuContext): def set(self, props): """Personalise config properties""" + if 'force_store_value' in props: + force_store_value = 'force_store_value' not in self._config_bag.properties + else: + force_store_value = False context = self._config_bag.context context.cfgimpl_get_settings().set_context_properties(props, context) del self._config_bag.properties + if force_store_value: + self._force_store_value() def reset(self): """Remove config properties""" @@ -957,10 +971,20 @@ class TiramisuContextProperty(TiramisuContext): def importation(self, properties): """Import config properties""" + if 'force_store_value' in properties: + force_store_value = 'force_store_value' not in self._config_bag.properties + else: + force_store_value = False self._config_bag.context.cfgimpl_get_settings()._p_.importation(properties) self._config_bag.context.cfgimpl_reset_cache(None, None) del self._config_bag.properties + if force_store_value: + self._force_store_value() + + def _force_store_value(self): + descr = self._config_bag.context.cfgimpl_get_description() + descr.impl_build_force_store_values(self._config_bag) class TiramisuContextPermissive(TiramisuContext): @@ -1150,8 +1174,8 @@ class _TiramisuContextConfig(TiramisuContext, _TiramisuContextConfigReset): persistent=False, storage=None): return Config(self._config_bag.context.duplicate(session_id, - persistent=persistent, - storage=storage)) + persistent=persistent, + storage=storage)) def deepcopy(self, session_id=None, diff --git a/tiramisu/config.py b/tiramisu/config.py index b63dcbf..5de588f 100644 --- a/tiramisu/config.py +++ b/tiramisu/config.py @@ -682,8 +682,8 @@ class _CommonConfig(SubConfig): persistent=persistent, storage=storage) duplicated_config.cfgimpl_get_values()._p_.importation(self.cfgimpl_get_values()._p_.exportation()) - duplicated_config.cfgimpl_get_settings()._p_.importation(self.cfgimpl_get_settings( - )._p_.exportation()) + properties = self.cfgimpl_get_settings()._p_.exportation() + duplicated_config.cfgimpl_get_settings()._p_.importation(properties) duplicated_config.cfgimpl_get_settings()._pp_.importation(self.cfgimpl_get_settings( )._pp_.exportation()) if child is not None: diff --git a/tiramisu/option/optiondescription.py b/tiramisu/option/optiondescription.py index 9784591..1203a1d 100644 --- a/tiramisu/option/optiondescription.py +++ b/tiramisu/option/optiondescription.py @@ -170,10 +170,12 @@ class CacheOptionDescription(BaseOption): def impl_build_force_store_values(self, config_bag: ConfigBag) -> None: - commit = False if not hasattr(self, '_cache_force_store_values'): raise ConfigError(_('option description seems to be part of an other ' 'config')) + if 'force_store_value' not in config_bag.properties: + return + commit = False values = config_bag.context.cfgimpl_get_values() for subpath, option in self._cache_force_store_values: if not values._p_.hasvalue(subpath): diff --git a/tiramisu/setting.py b/tiramisu/setting.py index 4701c7b..955a4d6 100644 --- a/tiramisu/setting.py +++ b/tiramisu/setting.py @@ -102,14 +102,16 @@ read_write you can set all variables not frozen """ ro_append = set(['frozen', 'disabled', 'validator', 'everything_frozen', - 'mandatory', 'empty']) + 'mandatory', 'empty', 'force_store_value']) ro_remove = set(['permissive', 'hidden']) -rw_append = set(['frozen', 'disabled', 'validator', 'hidden']) +rw_append = set(['frozen', 'disabled', 'validator', 'hidden', + 'force_store_value']) rw_remove = set(['permissive', 'everything_frozen', 'mandatory', 'empty']) FORBIDDEN_SET_PROPERTIES = frozenset(['force_store_value']) -FORBIDDEN_SET_PERMISSIVES = frozenset(['force_default_on_freeze', 'force_default_on_freeze']) +FORBIDDEN_SET_PERMISSIVES = frozenset(['force_default_on_freeze', + 'force_store_value']) log = getLogger('tiramisu') @@ -711,7 +713,8 @@ class Settings(object): config_permissives): properties = option_properties & config_properties - {'frozen', 'mandatory', - 'empty'} + 'empty', + 'force_store_value'} # remove global permissive properties if properties and ('permissive' in config_properties): properties -= config_permissives diff --git a/tiramisu/storage/dictionary/setting.py b/tiramisu/storage/dictionary/setting.py index 27df542..6bd9642 100644 --- a/tiramisu/storage/dictionary/setting.py +++ b/tiramisu/storage/dictionary/setting.py @@ -57,6 +57,7 @@ class Properties(Cache): return copy(self._properties) def importation(self, properties): + self.reset_all_cache() self._properties = properties