api: unify walk option
This commit is contained in:
parent
9731769694
commit
026e665ab0
1 changed files with 112 additions and 75 deletions
185
tiramisu/api.py
185
tiramisu/api.py
|
@ -145,6 +145,83 @@ class CommonTiramisuOption(CommonTiramisu):
|
||||||
raise APIError(_('unknown method "{}" in "{}"').format(name, self.__class__.__name__))
|
raise APIError(_('unknown method "{}" in "{}"').format(name, self.__class__.__name__))
|
||||||
|
|
||||||
|
|
||||||
|
class _TiramisuOptionWalk:
|
||||||
|
async def _filter(self,
|
||||||
|
opt,
|
||||||
|
subconfig,
|
||||||
|
config_bag,
|
||||||
|
):
|
||||||
|
option_bag = OptionBag()
|
||||||
|
option_bag.set_option(opt,
|
||||||
|
None,
|
||||||
|
config_bag)
|
||||||
|
settings = config_bag.context.cfgimpl_get_settings()
|
||||||
|
option_bag.properties = await settings.getproperties(option_bag)
|
||||||
|
if opt.impl_is_optiondescription():
|
||||||
|
await settings.validate_properties(option_bag)
|
||||||
|
return await subconfig.get_subconfig(option_bag)
|
||||||
|
await subconfig.getattr(opt.impl_getname(),
|
||||||
|
option_bag)
|
||||||
|
|
||||||
|
async def _walk(self,
|
||||||
|
option,
|
||||||
|
recursive,
|
||||||
|
type_,
|
||||||
|
group_type,
|
||||||
|
config_bag,
|
||||||
|
subconfig,
|
||||||
|
):
|
||||||
|
options = []
|
||||||
|
for opt in await option.get_children(config_bag):
|
||||||
|
try:
|
||||||
|
subsubconfig = await self._filter(opt,
|
||||||
|
subconfig,
|
||||||
|
config_bag)
|
||||||
|
except PropertiesOptionError:
|
||||||
|
continue
|
||||||
|
if opt.impl_is_optiondescription():
|
||||||
|
if recursive:
|
||||||
|
options.extend(await self._walk(opt,
|
||||||
|
recursive,
|
||||||
|
type_,
|
||||||
|
group_type,
|
||||||
|
config_bag,
|
||||||
|
subsubconfig))
|
||||||
|
if type_ == 'option' or (type_ == 'optiondescription' and \
|
||||||
|
group_type and opt.impl_get_group_type() != group_type):
|
||||||
|
continue
|
||||||
|
elif type_ == 'optiondescription':
|
||||||
|
continue
|
||||||
|
options.append(TiramisuOption(opt.impl_getpath(),
|
||||||
|
None,
|
||||||
|
config_bag,
|
||||||
|
))
|
||||||
|
return options
|
||||||
|
|
||||||
|
async def _list(self,
|
||||||
|
type,
|
||||||
|
group_type,
|
||||||
|
recursive,
|
||||||
|
root_option,
|
||||||
|
config_bag,
|
||||||
|
):
|
||||||
|
assert type in ('all', 'option', 'optiondescription'), _('unknown list type {}').format(type)
|
||||||
|
assert group_type is None or isinstance(group_type, groups.GroupType), \
|
||||||
|
_("unknown group_type: {0}").format(group_type)
|
||||||
|
if config_bag.properties and 'warnings' in config_bag.properties:
|
||||||
|
config_bag = config_bag.copy()
|
||||||
|
config_bag.remove_warnings()
|
||||||
|
options = []
|
||||||
|
for opt in await self._walk(root_option,
|
||||||
|
recursive,
|
||||||
|
type,
|
||||||
|
group_type,
|
||||||
|
config_bag,
|
||||||
|
config_bag.context):
|
||||||
|
options.append(opt)
|
||||||
|
return options
|
||||||
|
|
||||||
|
|
||||||
def option_and_connection(func):
|
def option_and_connection(func):
|
||||||
async def wrapped(self, *args, **kwargs):
|
async def wrapped(self, *args, **kwargs):
|
||||||
config_bag = self._option_bag.config_bag
|
config_bag = self._option_bag.config_bag
|
||||||
|
@ -157,7 +234,7 @@ def option_and_connection(func):
|
||||||
return wrapped
|
return wrapped
|
||||||
|
|
||||||
|
|
||||||
class _TiramisuOptionOptionDescription(CommonTiramisuOption):
|
class _TiramisuOptionOptionDescription(CommonTiramisuOption, _TiramisuOptionWalk):
|
||||||
"""Manage option"""
|
"""Manage option"""
|
||||||
_allow_optiondescription = True
|
_allow_optiondescription = True
|
||||||
_follower_need_index = False
|
_follower_need_index = False
|
||||||
|
@ -341,6 +418,19 @@ class TiramisuOptionOption(_TiramisuOptionOptionDescription):
|
||||||
#FIXME only from 0.0.0.0 to 255.255.255.255
|
#FIXME only from 0.0.0.0 to 255.255.255.255
|
||||||
return r'^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
|
return r'^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
|
||||||
|
|
||||||
|
@option_and_connection
|
||||||
|
async def list(self,
|
||||||
|
type='option',
|
||||||
|
group_type=None,
|
||||||
|
recursive=False,
|
||||||
|
):
|
||||||
|
return await self._list(type,
|
||||||
|
group_type,
|
||||||
|
recursive,
|
||||||
|
self._option_bag.option,
|
||||||
|
self._option_bag.config_bag,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TiramisuOptionOwner(CommonTiramisuOption):
|
class TiramisuOptionOwner(CommonTiramisuOption):
|
||||||
#FIXME optiondescription must not have Owner!
|
#FIXME optiondescription must not have Owner!
|
||||||
|
@ -808,7 +898,8 @@ class TiramisuOption(CommonTiramisu, TiramisuConfig):
|
||||||
async def _filter(self,
|
async def _filter(self,
|
||||||
opt,
|
opt,
|
||||||
subconfig,
|
subconfig,
|
||||||
config_bag):
|
config_bag,
|
||||||
|
):
|
||||||
settings = config_bag.context.cfgimpl_get_settings()
|
settings = config_bag.context.cfgimpl_get_settings()
|
||||||
option_bag = OptionBag()
|
option_bag = OptionBag()
|
||||||
option_bag.set_option(opt,
|
option_bag.set_option(opt,
|
||||||
|
@ -844,7 +935,8 @@ class TiramisuOption(CommonTiramisu, TiramisuConfig):
|
||||||
try:
|
try:
|
||||||
await self._filter(opt,
|
await self._filter(opt,
|
||||||
subconfig,
|
subconfig,
|
||||||
config_bag)
|
config_bag,
|
||||||
|
)
|
||||||
except PropertiesOptionError:
|
except PropertiesOptionError:
|
||||||
continue
|
continue
|
||||||
if opt.impl_is_optiondescription():
|
if opt.impl_is_optiondescription():
|
||||||
|
@ -1299,7 +1391,7 @@ class TiramisuContextPermissive(TiramisuConfig):
|
||||||
await self._set(frozenset(props))
|
await self._set(frozenset(props))
|
||||||
|
|
||||||
|
|
||||||
class TiramisuContextOption(TiramisuConfig):
|
class TiramisuContextOption(TiramisuConfig, _TiramisuOptionWalk):
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
*args,
|
*args,
|
||||||
**kwargs) -> None:
|
**kwargs) -> None:
|
||||||
|
@ -1327,78 +1419,19 @@ class TiramisuContextOption(TiramisuConfig):
|
||||||
options.append(option)
|
options.append(option)
|
||||||
return options
|
return options
|
||||||
|
|
||||||
async def _filter(self,
|
|
||||||
opt,
|
|
||||||
subconfig,
|
|
||||||
config_bag):
|
|
||||||
option_bag = OptionBag()
|
|
||||||
option_bag.set_option(opt,
|
|
||||||
None,
|
|
||||||
config_bag)
|
|
||||||
settings = config_bag.context.cfgimpl_get_settings()
|
|
||||||
option_bag.properties = await settings.getproperties(option_bag)
|
|
||||||
if opt.impl_is_optiondescription():
|
|
||||||
await settings.validate_properties(option_bag)
|
|
||||||
return await subconfig.get_subconfig(option_bag)
|
|
||||||
await subconfig.getattr(opt.impl_getname(),
|
|
||||||
option_bag)
|
|
||||||
|
|
||||||
async def _walk(self,
|
|
||||||
option,
|
|
||||||
recursive,
|
|
||||||
type_,
|
|
||||||
group_type,
|
|
||||||
config_bag,
|
|
||||||
subconfig):
|
|
||||||
options = []
|
|
||||||
for opt in await option.get_children(config_bag):
|
|
||||||
try:
|
|
||||||
subsubconfig = await self._filter(opt,
|
|
||||||
subconfig,
|
|
||||||
config_bag)
|
|
||||||
except PropertiesOptionError:
|
|
||||||
continue
|
|
||||||
if opt.impl_is_optiondescription():
|
|
||||||
if recursive:
|
|
||||||
options.extend(await self._walk(opt,
|
|
||||||
recursive,
|
|
||||||
type_,
|
|
||||||
group_type,
|
|
||||||
config_bag,
|
|
||||||
subsubconfig))
|
|
||||||
if type_ == 'option' or (type_ == 'optiondescription' and \
|
|
||||||
group_type and opt.impl_get_group_type() != group_type):
|
|
||||||
continue
|
|
||||||
elif type_ == 'optiondescription':
|
|
||||||
continue
|
|
||||||
options.append(TiramisuOption(opt.impl_getpath(),
|
|
||||||
None,
|
|
||||||
self._config_bag))
|
|
||||||
return options
|
|
||||||
|
|
||||||
@connection
|
@connection
|
||||||
async def list(self,
|
async def list(self,
|
||||||
type='option',
|
type='option',
|
||||||
group_type=None,
|
group_type=None,
|
||||||
recursive=False):
|
recursive=False,
|
||||||
|
):
|
||||||
"""List options (by default list only option)"""
|
"""List options (by default list only option)"""
|
||||||
assert type in ('all', 'option', 'optiondescription'), _('unknown list type {}').format(type)
|
return await self._list(type,
|
||||||
assert group_type is None or isinstance(group_type, groups.GroupType), \
|
|
||||||
_("unknown group_type: {0}").format(group_type)
|
|
||||||
config_bag = self._config_bag
|
|
||||||
if config_bag.properties and 'warnings' in config_bag.properties:
|
|
||||||
config_bag = config_bag.copy()
|
|
||||||
config_bag.remove_warnings()
|
|
||||||
option = config_bag.context.cfgimpl_get_description()
|
|
||||||
options = []
|
|
||||||
for opt in await self._walk(option,
|
|
||||||
recursive,
|
|
||||||
type,
|
|
||||||
group_type,
|
group_type,
|
||||||
config_bag,
|
recursive,
|
||||||
config_bag.context):
|
self._config_bag.context.cfgimpl_get_description(),
|
||||||
options.append(opt)
|
self._config_bag,
|
||||||
return options
|
)
|
||||||
|
|
||||||
async def _load_dict(self,
|
async def _load_dict(self,
|
||||||
clearable="all",
|
clearable="all",
|
||||||
|
@ -1750,7 +1783,8 @@ class Config(TiramisuAPI):
|
||||||
session_id: str=None,
|
session_id: str=None,
|
||||||
delete_old_session: bool=False,
|
delete_old_session: bool=False,
|
||||||
storage=None,
|
storage=None,
|
||||||
display_name=None) -> None:
|
display_name=None,
|
||||||
|
) -> None:
|
||||||
if storage is None:
|
if storage is None:
|
||||||
storage = default_storage
|
storage = default_storage
|
||||||
storage_obj = await storage.get()
|
storage_obj = await storage.get()
|
||||||
|
@ -1763,14 +1797,17 @@ class Config(TiramisuAPI):
|
||||||
session_id=session_id,
|
session_id=session_id,
|
||||||
delete_old_session=delete_old_session,
|
delete_old_session=delete_old_session,
|
||||||
storage=storage,
|
storage=storage,
|
||||||
display_name=display_name)
|
display_name=display_name,
|
||||||
|
)
|
||||||
settings = config.cfgimpl_get_settings()
|
settings = config.cfgimpl_get_settings()
|
||||||
properties = await settings.get_context_properties(connection,
|
properties = await settings.get_context_properties(connection,
|
||||||
config._impl_properties_cache)
|
config._impl_properties_cache,
|
||||||
|
)
|
||||||
permissives = await settings.get_context_permissives(connection)
|
permissives = await settings.get_context_permissives(connection)
|
||||||
config_bag = ConfigBag(config,
|
config_bag = ConfigBag(config,
|
||||||
properties=properties,
|
properties=properties,
|
||||||
permissives=permissives)
|
permissives=permissives,
|
||||||
|
)
|
||||||
super().__init__(config_bag)
|
super().__init__(config_bag)
|
||||||
|
|
||||||
async def __aenter__(self):
|
async def __aenter__(self):
|
||||||
|
|
Loading…
Reference in a new issue