can remove all data in options (value, properties and permissives) with new function in API: c.config.reset()

This commit is contained in:
Emmanuel Garette 2018-09-09 13:50:38 +02:00
parent 6110a37cc7
commit 657b401124
6 changed files with 94 additions and 44 deletions

View file

@ -342,3 +342,23 @@ def test_help():
od2 = OptionDescription('o', '', [od1])
cfg = Config(od2)
cfg.help(_display=False, _valid=True)
def test_config_reset():
descr = make_description()
c = Config(descr)
assert not c.option('gc.gc2.bool').value.get()
assert not c.option('boolop').property.get()
assert not c.option('boolop').permissive.get()
#
c.option('gc.gc2.bool').value.set(True)
c.option('boolop').property.add('test')
c.option('float').permissive.set(frozenset(['test']))
assert c.option('gc.gc2.bool').value.get()
assert c.option('boolop').property.get()
assert c.option('float').permissive.get()
#
c.config.reset()
assert not c.option('gc.gc2.bool').value.get()
assert not c.option('boolop').property.get()
assert not c.option('float').permissive.get()

View file

@ -686,7 +686,7 @@ def test_meta_reset():
assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1']
assert meta.config('conf1').option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.2']
assert meta.config('conf2').option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1']
meta.value.reset('ip_admin_eth0.ip_admin_eth0')
meta.option('ip_admin_eth0.ip_admin_eth0').value.reset(children=True)
assert meta.option('ip_admin_eth0.ip_admin_eth0').value.get() == []
assert meta.config('conf1').option('ip_admin_eth0.ip_admin_eth0').value.get() == []
assert meta.config('conf2').option('ip_admin_eth0.ip_admin_eth0').value.get() == []

View file

@ -392,13 +392,12 @@ class TiramisuOptionInformation(CommonTiramisuOption):
def set(self, name, value):
"""set information for a key name"""
#FIXME ?
self.config_bag.context.impl_set_information(name, value)
option = self.option_bag.option
self.option_bag.option.impl_set_information(name, value)
def reset(self, name):
"""remove information for a key name"""
#FIXME ?
self.config_bag.context.impl_del_information(name)
self.option_bag.option.impl_del_information(name)
class TiramisuOptionValue(CommonTiramisuOption):
@ -446,6 +445,28 @@ class TiramisuOptionValue(CommonTiramisuOption):
self._test_slave_index()
self.subconfig.delattr(self.option_bag)
def _g_reset(self,
itself=None,
children=None):
"""reset value for a GroupConfig or a MetaConfig"""
config_bag = self.option_bag.config_bag
if isinstance(config_bag.context, KernelMetaConfig):
if children is None:
children = False
if itself is None:
itself = True
else:
if children is None:
children = True
if itself is True:
raise APIError(_('cannot remove value in a GroupConfig'))
itself = False
if children:
config_bag.context.reset(self.option_bag.path,
config_bag)
if itself:
self._o_reset()
def _m_len_master(self):
"""length of master option (only for slave option)"""
option = self.option_bag.option
@ -462,26 +483,6 @@ class TiramisuOptionValue(CommonTiramisuOption):
self._length = self.subconfig.cfgimpl_get_length_slave(self.option_bag)
return self._length
def __getattr__(self, name: str) -> Callable:
option = self.option_bag.option
if name.startswith('_'):
# not a valid function
pass
elif name == 'list' and isinstance(option, ChoiceOption):
return self._c_list
elif name == 'pop' and option.impl_is_master_slaves('master'):
return self._m_pop
elif name == 'len':
if option.impl_is_master_slaves('slave'):
return self._s_len_slave
if option.impl_is_master_slaves('master'):
return self._m_len_master
elif name == 'dict' and option.impl_is_optiondescription():
return self._od_dict
elif not option.impl_is_optiondescription():
return getattr(self, '_o_' + name)
raise APIError(_('{} is unknown').format(name))
def _c_list(self):
"""all values available for an option (only for choiceoption)"""
option = self.option_bag.option
@ -507,6 +508,28 @@ class TiramisuOptionValue(CommonTiramisuOption):
withoption=withoption,
withvalue=withvalue)
def __getattr__(self, name: str) -> Callable:
option = self.option_bag.option
if name.startswith('_'):
# not a valid function
pass
elif name == 'list' and isinstance(option, ChoiceOption):
return self._c_list
elif name == 'pop' and option.impl_is_master_slaves('master'):
return self._m_pop
elif name == 'len':
if option.impl_is_master_slaves('slave'):
return self._s_len_slave
if option.impl_is_master_slaves('master'):
return self._m_len_master
elif name == 'dict' and option.impl_is_optiondescription():
return self._od_dict
elif not option.impl_is_optiondescription():
if name == 'reset' and isinstance(self.option_bag.config_bag.context, KernelGroupConfig):
return getattr(self, '_g_' + name)
return getattr(self, '_o_' + name)
raise APIError(_('{} is unknown').format(name))
def registers(registers: Dict[str, type], prefix: str) -> None:
for module_name in globals().keys():
@ -717,12 +740,6 @@ class TiramisuContextValue(TiramisuContext):
self.config_bag,
**kwargs)
def reset(self,
path):
"""reset value for a GroupConfig or a MetaConfig"""
self.config_bag.context.reset(path,
self.config_bag)
def dict(self,
flatten=False,
withvalue=undefined,
@ -884,16 +901,6 @@ class TiramisuContextOption(TiramisuContext):
ret.append(t_option)
return ret
def get(self, name):
option = self.config_bag.context.cfgimpl_get_description().impl_getchild(name,
self.config_bag,
self.config_bag.context)
return TiramisuOption(name,
name,
None,
self.config_bag.context,
self.config_bag)
def list(self,
type='all',
group_type=None,
@ -976,6 +983,9 @@ class TiramisuContextConfig(TiramisuContext):
def _c_meta(self):
return Config(self.config_bag.context.cfgimpl_get_meta())
def _c_reset(self):
pass
def _m_new(self, name):
return Config(self.config_bag.context.new_config(name))
@ -986,6 +996,19 @@ class TiramisuContextConfig(TiramisuContext):
for child in self.config_bag.context.cfgimpl_get_children():
yield Config(child)
def _m_reset(self):
self._c_reset()
def _c_reset(self):
# Option's values
self.config_bag.context.cfgimpl_get_values()._p_.importation((tuple(), tuple(), tuple(), tuple()))
# Option's properties
self.config_bag.context.cfgimpl_get_settings()._p_.importation({})
# Option's permissives
self.config_bag.context.cfgimpl_get_settings()._pp_.importation({})
# Remove cache
self.config_bag.context.cfgimpl_reset_cache(None, None)
def __getattr__(self,
name: str) -> Callable:
if not name.startswith('_'):

View file

@ -1116,8 +1116,6 @@ class KernelMetaConfig(KernelGroupConfig):
option_bag.config_bag.context = child
child.cfgimpl_get_values().reset(option_bag,
_commit=False)
option_bag.config_bag.context = self
self.cfgimpl_get_values().reset(option_bag)
def new_config(self,
session_id,

View file

@ -25,7 +25,9 @@ DEBUG = False
class Values(Cache):
__slots__ = ('_values', '_informations', '__weakref__')
__slots__ = ('_values',
'_informations',
'__weakref__')
def __init__(self, storage):
"""init plugin means create values storage
@ -286,6 +288,9 @@ class Values(Cache):
if raises:
raise ValueError(_("information's item not found {0}").format(key))
def del_informations(self):
self._informations = {}
def exportation(self):
return self._values

View file

@ -227,6 +227,10 @@ class Values(Sqlite3DB):
self._storage.execute("DELETE FROM information WHERE key = ? AND session_id = ?",
(key, self._session_id))
def del_informations(self):
self._storage.execute("DELETE FROM information WHERE session_id = ?",
(self._session_id,))
def exportation(self):
if DEBUG:
print('exportation')