do same api for property and permissive
This commit is contained in:
parent
290f687f6c
commit
5b5f06a612
9 changed files with 159 additions and 67 deletions
|
@ -191,7 +191,7 @@ def test_iter_on_empty_group():
|
||||||
def test_iter_not_group():
|
def test_iter_not_group():
|
||||||
api = Config(OptionDescription("name", "descr", []))
|
api = Config(OptionDescription("name", "descr", []))
|
||||||
api.property.read_write()
|
api.property.read_write()
|
||||||
raises(TypeError, "list(api.option.list(type='optiondescription', group_type='family'))")
|
raises(AssertionError, "list(api.option.list(type='optiondescription', group_type='family'))")
|
||||||
|
|
||||||
|
|
||||||
def test_groups_with_master():
|
def test_groups_with_master():
|
||||||
|
|
|
@ -140,7 +140,8 @@ def test_optiondescription_list():
|
||||||
assert len(list(api.option('od').list('optiondescription', group_type=groups.notfamily1))) == 1
|
assert len(list(api.option('od').list('optiondescription', group_type=groups.notfamily1))) == 1
|
||||||
assert len(list(api.option('od.od').list('option'))) == 1
|
assert len(list(api.option('od.od').list('option'))) == 1
|
||||||
assert len(list(api.option('od.od2').list('option'))) == 1
|
assert len(list(api.option('od.od2').list('option'))) == 1
|
||||||
raises(APIError, "list(api.option.list('unknown'))")
|
raises(AssertionError, "list(api.option('od').list('unknown'))")
|
||||||
|
raises(AssertionError, "list(api.option('od').list('option', group_type='toto'))")
|
||||||
|
|
||||||
|
|
||||||
def test_optiondescription_group():
|
def test_optiondescription_group():
|
||||||
|
@ -157,7 +158,8 @@ def test_optiondescription_group():
|
||||||
assert len(list(api.option.list('optiondescription'))) == 2
|
assert len(list(api.option.list('optiondescription'))) == 2
|
||||||
assert len(list(api.option.list('optiondescription', group_type=groups.family))) == 1
|
assert len(list(api.option.list('optiondescription', group_type=groups.family))) == 1
|
||||||
assert len(list(api.option.list('optiondescription', group_type=groups.notfamily))) == 1
|
assert len(list(api.option.list('optiondescription', group_type=groups.notfamily))) == 1
|
||||||
raises(APIError, "list(api.option.list('unknown'))")
|
raises(AssertionError, "list(api.option.list('unknown'))")
|
||||||
|
raises(AssertionError, "list(api.option.list('option', group_type='toto'))")
|
||||||
|
|
||||||
|
|
||||||
def test_optiondescription_group_redefined():
|
def test_optiondescription_group_redefined():
|
||||||
|
|
|
@ -421,16 +421,6 @@ def test_reset_properties():
|
||||||
assert api.option('gc.dummy').property.get() == set()
|
assert api.option('gc.dummy').property.get() == set()
|
||||||
|
|
||||||
|
|
||||||
def test_reset_properties_all():
|
|
||||||
descr = make_description()
|
|
||||||
api = Config(descr)
|
|
||||||
assert api.option('gc.dummy').property.get() == set()
|
|
||||||
api.option('gc.dummy').property.add('frozen')
|
|
||||||
assert api.option('gc.dummy').property.get() == {'frozen'}
|
|
||||||
api.property.reset(all=True)
|
|
||||||
assert api.option('gc.dummy').property.get() == set()
|
|
||||||
|
|
||||||
|
|
||||||
def test_properties_cached():
|
def test_properties_cached():
|
||||||
b1 = BoolOption("b1", "", properties=('test',))
|
b1 = BoolOption("b1", "", properties=('test',))
|
||||||
descr = OptionDescription("opt", "", [OptionDescription("sub", "", [b1])])
|
descr = OptionDescription("opt", "", [OptionDescription("sub", "", [b1])])
|
||||||
|
|
|
@ -45,6 +45,72 @@ def test_permissive():
|
||||||
assert set(props) == {'disabled'}
|
assert set(props) == {'disabled'}
|
||||||
|
|
||||||
|
|
||||||
|
def test_permissive_add():
|
||||||
|
descr = make_description()
|
||||||
|
api = Config(descr)
|
||||||
|
api.property.read_write()
|
||||||
|
api.property.read_write()
|
||||||
|
props = frozenset()
|
||||||
|
try:
|
||||||
|
api.option('u1').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
props = err.proptype
|
||||||
|
assert set(props) == {'disabled'}
|
||||||
|
api.unrestraint.permissive.add('disabled')
|
||||||
|
assert api.unrestraint.permissive.get() == frozenset(['hidden', 'disabled'])
|
||||||
|
props = frozenset()
|
||||||
|
try:
|
||||||
|
api.option('u1').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
props = err.proptype
|
||||||
|
assert set(props) == {'disabled'}
|
||||||
|
api.property.add('permissive')
|
||||||
|
api.option('u1').value.get()
|
||||||
|
api.property.pop('permissive')
|
||||||
|
props = frozenset()
|
||||||
|
try:
|
||||||
|
api.option('u1').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
props = err.proptype
|
||||||
|
assert set(props) == {'disabled'}
|
||||||
|
|
||||||
|
|
||||||
|
def test_permissive_pop():
|
||||||
|
descr = make_description()
|
||||||
|
api = Config(descr)
|
||||||
|
api.property.read_write()
|
||||||
|
api.property.read_write()
|
||||||
|
props = frozenset()
|
||||||
|
try:
|
||||||
|
api.forcepermissive.option('u1').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
props = err.proptype
|
||||||
|
assert set(props) == {'disabled'}
|
||||||
|
api.unrestraint.permissive.add('disabled')
|
||||||
|
assert api.unrestraint.permissive.get() == frozenset(['hidden', 'disabled'])
|
||||||
|
api.forcepermissive.option('u1').value.get()
|
||||||
|
api.unrestraint.permissive.pop('disabled')
|
||||||
|
props = frozenset()
|
||||||
|
try:
|
||||||
|
api.forcepermissive.option('u1').value.get()
|
||||||
|
except PropertiesOptionError as err:
|
||||||
|
props = err.proptype
|
||||||
|
assert set(props) == {'disabled'}
|
||||||
|
|
||||||
|
|
||||||
|
def test_permissive_reset():
|
||||||
|
descr = make_description()
|
||||||
|
api = Config(descr)
|
||||||
|
api.property.read_write()
|
||||||
|
assert api.unrestraint.permissive.get() == frozenset(['hidden'])
|
||||||
|
#
|
||||||
|
api.unrestraint.permissive.set(frozenset(['disabled']))
|
||||||
|
assert api.unrestraint.permissive.get() == frozenset(['disabled'])
|
||||||
|
#
|
||||||
|
api.unrestraint.permissive.reset()
|
||||||
|
assert api.unrestraint.permissive.get() == frozenset()
|
||||||
|
|
||||||
|
|
||||||
def test_permissive_mandatory():
|
def test_permissive_mandatory():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
api = Config(descr)
|
api = Config(descr)
|
||||||
|
@ -290,3 +356,18 @@ def test_remove_option_permissive():
|
||||||
api.forcepermissive.option('od1.var1').permissive.set(frozenset())
|
api.forcepermissive.option('od1.var1').permissive.set(frozenset())
|
||||||
assert api.forcepermissive.option('od1.var1').permissive.get() == frozenset()
|
assert api.forcepermissive.option('od1.var1').permissive.get() == frozenset()
|
||||||
raises(PropertiesOptionError, "api.option('od1.var1').value.get()")
|
raises(PropertiesOptionError, "api.option('od1.var1').value.get()")
|
||||||
|
|
||||||
|
|
||||||
|
def test_reset_option_permissive():
|
||||||
|
var1 = UnicodeOption('var1', '', u'value', properties=('hidden',))
|
||||||
|
od1 = OptionDescription('od1', '', [var1])
|
||||||
|
rootod = OptionDescription('rootod', '', [od1])
|
||||||
|
api = Config(rootod)
|
||||||
|
api.property.read_write()
|
||||||
|
raises(PropertiesOptionError, "api.option('od1.var1').value.get()")
|
||||||
|
api.forcepermissive.option('od1.var1').permissive.set(frozenset(['hidden']))
|
||||||
|
assert api.forcepermissive.option('od1.var1').permissive.get() == frozenset(['hidden'])
|
||||||
|
assert api.option('od1.var1').value.get() == 'value'
|
||||||
|
api.forcepermissive.option('od1.var1').permissive.reset()
|
||||||
|
assert api.forcepermissive.option('od1.var1').permissive.get() == frozenset()
|
||||||
|
raises(PropertiesOptionError, "api.option('od1.var1').value.get()")
|
||||||
|
|
|
@ -60,7 +60,7 @@ def test_symlink_addproperties():
|
||||||
api = Config(descr)
|
api = Config(descr)
|
||||||
api.property.read_write()
|
api.property.read_write()
|
||||||
raises(TypeError, "api.option('c').property.add('new')")
|
raises(TypeError, "api.option('c').property.add('new')")
|
||||||
raises(TypeError, "api.option('c').property.reset()")
|
raises(AssertionError, "api.option('c').property.reset()")
|
||||||
|
|
||||||
|
|
||||||
def test_symlink_getpermissive():
|
def test_symlink_getpermissive():
|
||||||
|
@ -80,7 +80,7 @@ def test_symlink_addpermissive():
|
||||||
api = Config(descr)
|
api = Config(descr)
|
||||||
api.property.read_write()
|
api.property.read_write()
|
||||||
raises(TypeError, "api.option('c').permissive.set(frozenset(['new']))")
|
raises(TypeError, "api.option('c').permissive.set(frozenset(['new']))")
|
||||||
raises(TypeError, "api.option('c').permissive.reset()")
|
raises(AssertionError, "api.option('c').permissive.reset()")
|
||||||
|
|
||||||
|
|
||||||
def test_symlink_getproperties():
|
def test_symlink_getproperties():
|
||||||
|
|
|
@ -123,11 +123,10 @@ class CommonTiramisuOption(CommonTiramisu):
|
||||||
|
|
||||||
def _test_slave_index(self) -> None:
|
def _test_slave_index(self) -> None:
|
||||||
option = self._option_bag.option
|
option = self._option_bag.option
|
||||||
if not option.impl_is_optiondescription():
|
if not option.impl_is_optiondescription() and \
|
||||||
if self._option_bag.index is None and option.impl_is_master_slaves('slave'):
|
self._option_bag.index is None and \
|
||||||
|
option.impl_is_master_slaves('slave'):
|
||||||
raise APIError(_('index must be set with the slave option "{}"').format(self._option_bag.path))
|
raise APIError(_('index must be set with the slave option "{}"').format(self._option_bag.path))
|
||||||
elif self._option_bag.index is not None and not option.impl_is_master_slaves('slave'):
|
|
||||||
raise APIError(_('index must be set only with a slave option, not for "{}"').format(self._option_bag.path))
|
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
raise APIError(_('unknown method {}').format(name))
|
raise APIError(_('unknown method {}').format(name))
|
||||||
|
@ -344,7 +343,6 @@ class TiramisuOptionPermissive(CommonTiramisuOption):
|
||||||
_allow_optiondescription = True
|
_allow_optiondescription = True
|
||||||
_slave_need_index = False
|
_slave_need_index = False
|
||||||
|
|
||||||
# FIXME should have same api than property
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
name: str,
|
name: str,
|
||||||
subconfig: Union[KernelConfig, SubConfig],
|
subconfig: Union[KernelConfig, SubConfig],
|
||||||
|
@ -362,13 +360,13 @@ class TiramisuOptionPermissive(CommonTiramisuOption):
|
||||||
|
|
||||||
def set(self, permissives):
|
def set(self, permissives):
|
||||||
"""Set permissives value"""
|
"""Set permissives value"""
|
||||||
option = self._option_bag.option
|
|
||||||
self._settings.setpermissives(self._option_bag,
|
self._settings.setpermissives(self._option_bag,
|
||||||
permissives=permissives)
|
permissives=permissives)
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
"""Reset all personalised permissive"""
|
"""Reset all personalised permissive"""
|
||||||
self.set(frozenset())
|
self._settings.reset_permissives(self._option_bag,
|
||||||
|
self._option_bag.config_bag.context)
|
||||||
|
|
||||||
|
|
||||||
class TiramisuOptionInformation(CommonTiramisuOption):
|
class TiramisuOptionInformation(CommonTiramisuOption):
|
||||||
|
@ -662,11 +660,9 @@ class _TiramisuOptionDescription(_TiramisuOption):
|
||||||
type='option',
|
type='option',
|
||||||
group_type=None):
|
group_type=None):
|
||||||
"""List options in an optiondescription (only for optiondescription)"""
|
"""List options in an optiondescription (only for optiondescription)"""
|
||||||
if type not in ('all', 'option', 'optiondescription'):
|
assert type in ('all', 'option', 'optiondescription'), _('unknown list type {}').format(type)
|
||||||
raise APIError(_('unknown list type {}').format(type))
|
assert group_type is None or isinstance(group_type, groups.GroupType), \
|
||||||
if group_type is not None and not isinstance(group_type,
|
_("unknown group_type: {0}").format(group_type)
|
||||||
groups.GroupType):
|
|
||||||
raise TypeError(_("unknown group_type: {0}").format(group_type))
|
|
||||||
def _filter(opt):
|
def _filter(opt):
|
||||||
if self._config_bag.properties:
|
if self._config_bag.properties:
|
||||||
name = opt.impl_getname()
|
name = opt.impl_getname()
|
||||||
|
@ -888,22 +884,20 @@ class TiramisuContextProperty(TiramisuContext):
|
||||||
|
|
||||||
def add(self, prop):
|
def add(self, prop):
|
||||||
"""Add a config property"""
|
"""Add a config property"""
|
||||||
props = self.get()
|
props = set(self.get())
|
||||||
props.add(prop)
|
props.add(prop)
|
||||||
self.set(frozenset(props))
|
self.set(frozenset(props))
|
||||||
del self._config_bag.properties
|
|
||||||
|
|
||||||
def pop(self, prop):
|
def pop(self, prop):
|
||||||
"""Remove a config property"""
|
"""Remove a config property"""
|
||||||
props = self.get()
|
props = set(self.get())
|
||||||
if prop in props:
|
if prop in props:
|
||||||
props.remove(prop)
|
props.remove(prop)
|
||||||
self.set(frozenset(props))
|
self.set(frozenset(props))
|
||||||
del self._config_bag.properties
|
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
"""Get all config properties"""
|
"""Get all config properties"""
|
||||||
return set(self._config_bag.properties)
|
return self._config_bag.properties
|
||||||
|
|
||||||
def set(self, props):
|
def set(self, props):
|
||||||
"""Personalise config properties"""
|
"""Personalise config properties"""
|
||||||
|
@ -912,13 +906,11 @@ class TiramisuContextProperty(TiramisuContext):
|
||||||
context)
|
context)
|
||||||
del self._config_bag.properties
|
del self._config_bag.properties
|
||||||
|
|
||||||
def reset(self,
|
def reset(self):
|
||||||
all=False):
|
|
||||||
"""Remove config properties"""
|
"""Remove config properties"""
|
||||||
context = self._config_bag.context
|
context = self._config_bag.context
|
||||||
context.cfgimpl_get_settings().reset(None,
|
context.cfgimpl_get_settings().reset(None,
|
||||||
context,
|
context)
|
||||||
all_properties=all)
|
|
||||||
del self._config_bag.properties
|
del self._config_bag.properties
|
||||||
|
|
||||||
def exportation(self):
|
def exportation(self):
|
||||||
|
@ -956,6 +948,26 @@ class TiramisuContextPermissive(TiramisuContext):
|
||||||
None)
|
None)
|
||||||
del self._config_bag.permissives
|
del self._config_bag.permissives
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
"""Remove config permissives"""
|
||||||
|
context = self._config_bag.context
|
||||||
|
context.cfgimpl_get_settings().reset_permissives(None,
|
||||||
|
context)
|
||||||
|
del self._config_bag.properties
|
||||||
|
|
||||||
|
def add(self, prop):
|
||||||
|
"""Add a config permissive"""
|
||||||
|
props = set(self.get())
|
||||||
|
props.add(prop)
|
||||||
|
self.set(frozenset(props))
|
||||||
|
|
||||||
|
def pop(self, prop):
|
||||||
|
"""Remove a config permissive"""
|
||||||
|
props = set(self.get())
|
||||||
|
if prop in props:
|
||||||
|
props.remove(prop)
|
||||||
|
self.set(frozenset(props))
|
||||||
|
|
||||||
|
|
||||||
class TiramisuContextOption(TiramisuContext):
|
class TiramisuContextOption(TiramisuContext):
|
||||||
|
|
||||||
|
@ -1026,12 +1038,9 @@ class TiramisuContextOption(TiramisuContext):
|
||||||
None,
|
None,
|
||||||
subconfig,
|
subconfig,
|
||||||
self._config_bag)
|
self._config_bag)
|
||||||
if type not in ('all', 'option', 'optiondescription'):
|
assert type in ('all', 'option', 'optiondescription'), _('unknown list type {}').format(type)
|
||||||
raise APIError(_('unknown list type {}').format(type))
|
assert group_type is None or isinstance(group_type, groups.GroupType), \
|
||||||
if group_type is not None and not isinstance(group_type,
|
_("unknown group_type: {0}").format(group_type)
|
||||||
groups.GroupType):
|
|
||||||
raise TypeError(_("unknown group_type: {0}").format(group_type))
|
|
||||||
|
|
||||||
option = self._config_bag.context.cfgimpl_get_description()
|
option = self._config_bag.context.cfgimpl_get_description()
|
||||||
for toption in _walk(option):
|
for toption in _walk(option):
|
||||||
yield toption
|
yield toption
|
||||||
|
|
|
@ -659,27 +659,34 @@ class Settings(object):
|
||||||
|
|
||||||
def reset(self,
|
def reset(self,
|
||||||
option_bag,
|
option_bag,
|
||||||
context,
|
context):
|
||||||
all_properties=False):
|
|
||||||
if option_bag is None:
|
if option_bag is None:
|
||||||
opt = None
|
opt = None
|
||||||
|
path = None
|
||||||
else:
|
else:
|
||||||
opt = option_bag.option
|
opt = option_bag.option
|
||||||
assert all_properties is False or option_bag is None, _('opt and all_properties must not be'
|
assert not opt.impl_is_symlinkoption(), _("can't reset properties to "
|
||||||
' set together in reset')
|
"the symlinkoption \"{}\""
|
||||||
if opt and opt.impl_is_symlinkoption():
|
"").format(opt.impl_get_display_name())
|
||||||
raise TypeError(_("can't reset properties to the symlinkoption \"{}\""
|
|
||||||
"").format(opt.impl_get_display_name()))
|
|
||||||
if all_properties:
|
|
||||||
self._p_.reset_all_properties()
|
|
||||||
else:
|
|
||||||
if opt is not None:
|
|
||||||
path = option_bag.path
|
path = option_bag.path
|
||||||
else:
|
|
||||||
path = None
|
|
||||||
self._p_.delproperties(path)
|
self._p_.delproperties(path)
|
||||||
context.cfgimpl_reset_cache(option_bag)
|
context.cfgimpl_reset_cache(option_bag)
|
||||||
|
|
||||||
|
def reset_permissives(self,
|
||||||
|
option_bag,
|
||||||
|
context):
|
||||||
|
if option_bag is None:
|
||||||
|
opt = None
|
||||||
|
path = None
|
||||||
|
else:
|
||||||
|
opt = option_bag.option
|
||||||
|
assert not opt.impl_is_symlinkoption(), _("can't reset permissives to "
|
||||||
|
"the symlinkoption \"{}\""
|
||||||
|
"").format(opt.impl_get_display_name())
|
||||||
|
path = option_bag.path
|
||||||
|
self._pp_.delpermissive(path)
|
||||||
|
context.cfgimpl_reset_cache(option_bag)
|
||||||
|
|
||||||
#____________________________________________________________
|
#____________________________________________________________
|
||||||
# validate properties
|
# validate properties
|
||||||
def calc_raises_properties(self,
|
def calc_raises_properties(self,
|
||||||
|
|
|
@ -44,11 +44,6 @@ class Properties(Cache):
|
||||||
print('getproperties', path, ret)
|
print('getproperties', path, ret)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def reset_all_properties(self):
|
|
||||||
if DEBUG: # pragma: no cover
|
|
||||||
print('reset_all_properties')
|
|
||||||
self._properties.clear()
|
|
||||||
|
|
||||||
def delproperties(self, path):
|
def delproperties(self, path):
|
||||||
if DEBUG: # pragma: no cover
|
if DEBUG: # pragma: no cover
|
||||||
print('delproperties', path)
|
print('delproperties', path)
|
||||||
|
@ -96,3 +91,9 @@ class Permissives(Cache):
|
||||||
|
|
||||||
def importation(self, permissives):
|
def importation(self, permissives):
|
||||||
self._permissives = permissives
|
self._permissives = permissives
|
||||||
|
|
||||||
|
def delpermissive(self, path):
|
||||||
|
if DEBUG: # pragma: no cover
|
||||||
|
print('delpermissive', path)
|
||||||
|
if path in self._permissives:
|
||||||
|
del(self._permissives[path])
|
||||||
|
|
|
@ -48,9 +48,6 @@ class Properties(Sqlite3DB):
|
||||||
else:
|
else:
|
||||||
return set(self._sqlite_decode(value[0]))
|
return set(self._sqlite_decode(value[0]))
|
||||||
|
|
||||||
def reset_all_properties(self):
|
|
||||||
self._storage.execute("DELETE FROM property WHERE session_id = ?", (self._session_id,))
|
|
||||||
|
|
||||||
def delproperties(self, path):
|
def delproperties(self, path):
|
||||||
path = self._sqlite_encode_path(path)
|
path = self._sqlite_encode_path(path)
|
||||||
self._storage.execute("DELETE FROM property WHERE path = ? AND session_id = ?",
|
self._storage.execute("DELETE FROM property WHERE path = ? AND session_id = ?",
|
||||||
|
@ -110,6 +107,11 @@ class Permissives(Sqlite3DB):
|
||||||
print('getpermissive', path, ret, id(self))
|
print('getpermissive', path, ret, id(self))
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
def delpermissive(self, path):
|
||||||
|
path = self._sqlite_encode_path(path)
|
||||||
|
self._storage.execute("DELETE FROM permissive WHERE path = ? AND session_id = ?",
|
||||||
|
(path, self._session_id))
|
||||||
|
|
||||||
def exportation(self):
|
def exportation(self):
|
||||||
"""return all modified permissives in a dictionary
|
"""return all modified permissives in a dictionary
|
||||||
example: {'path1': set(['perm1', 'perm2'])}
|
example: {'path1': set(['perm1', 'perm2'])}
|
||||||
|
|
Loading…
Reference in a new issue