simplify tiramisu/option/syndynoption.py
This commit is contained in:
parent
5d26762761
commit
184a086bc1
11 changed files with 112 additions and 108 deletions
|
@ -8,7 +8,7 @@ from tiramisu import BoolOption, StrOption, ChoiceOption, IPOption, \
|
|||
NetworkOption, NetmaskOption, IntOption, FloatOption, \
|
||||
UnicodeOption, PortOption, BroadcastOption, DomainnameOption, \
|
||||
EmailOption, URLOption, UsernameOption, FilenameOption, SymLinkOption, \
|
||||
OptionDescription, DynOptionDescription, DynSymLinkOption, submulti, MasterSlaves, \
|
||||
OptionDescription, DynOptionDescription, SynDynOption, submulti, MasterSlaves, \
|
||||
Config, Params, ParamOption, ParamValue
|
||||
from tiramisu.error import PropertiesOptionError, ConfigError, ConflictError
|
||||
from tiramisu.storage import list_sessions
|
||||
|
@ -687,11 +687,11 @@ def test_find_dyndescription_context():
|
|||
api = Config(od2)
|
||||
api.option('od.dodval1.stval1').value.set('yes')
|
||||
assert api.option.find('stval1', first=True).value.get() == "yes"
|
||||
assert isinstance(api.option.find('stval1', first=True).option.get(), DynSymLinkOption)
|
||||
assert isinstance(api.option.find('stval1', first=True).option.get(), SynDynOption)
|
||||
#assert api.option.find(bytype=StrOption, type='path') == ['od.dodval1.stval1', 'od.dodval2.stval2', 'od.val1']
|
||||
#opts = api.option.find(byvalue='yes')
|
||||
#assert len(opts) == 1
|
||||
#assert isinstance(opts[0], DynSymLinkOption)
|
||||
#assert isinstance(opts[0], SynDynOption)
|
||||
#assert opts[0].impl_getname() == 'stval1'
|
||||
raises(AttributeError, "list(api.option.find('strnotexists'))")
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ def manager_callback(callbk: Union[ParamOption, ParamValue],
|
|||
force_settings=get_default_settings_storages())
|
||||
opt = callbk.option
|
||||
if opt.issubdyn():
|
||||
opt = opt.to_dynoption(option._rootpath,
|
||||
opt = opt.to_dynoption(option.rootpath,
|
||||
option.impl_getsuffix())
|
||||
path = opt.impl_getpath()
|
||||
if index is not None and opt.impl_is_master_slaves() and \
|
||||
|
|
|
@ -4,7 +4,7 @@ from .syndynoptiondescription import SynDynOptionDescription, SynDynMasterSlaves
|
|||
from .masterslaves import MasterSlaves
|
||||
from .baseoption import submulti
|
||||
from .symlinkoption import SymLinkOption
|
||||
from .dynsymlinkoption import DynSymLinkOption
|
||||
from .syndynoption import SynDynOption
|
||||
from .option import Option, RegexpOption
|
||||
from .choiceoption import ChoiceOption
|
||||
from .booloption import BoolOption
|
||||
|
@ -27,7 +27,7 @@ from .passwordoption import PasswordOption
|
|||
|
||||
__all__ = ('MasterSlaves', 'OptionDescription', 'DynOptionDescription',
|
||||
'SynDynOptionDescription', 'SynDynMasterSlaves', 'Option', 'SymLinkOption',
|
||||
'DynSymLinkOption', 'ChoiceOption', 'BoolOption', 'DateOption',
|
||||
'SynDynOption', 'ChoiceOption', 'BoolOption', 'DateOption',
|
||||
'IntOption', 'FloatOption', 'StrOption', 'UnicodeOption',
|
||||
'IPOption', 'PortOption', 'NetworkOption', 'NetmaskOption',
|
||||
'BroadcastOption', 'DomainnameOption', 'EmailOption', 'URLOption',
|
||||
|
|
|
@ -29,7 +29,6 @@ from ..i18n import _
|
|||
from ..setting import undefined
|
||||
from ..error import ConfigError, display_list
|
||||
from ..function import Params, ParamContext, ParamOption, ParamIndex
|
||||
from .dynsymlinkoption import DynSymLinkOption
|
||||
|
||||
STATIC_TUPLE = frozenset()
|
||||
|
||||
|
@ -447,13 +446,6 @@ class BaseOption(Base):
|
|||
def impl_is_symlinkoption(self):
|
||||
return False
|
||||
|
||||
def to_dynoption(self,
|
||||
rootpath: str,
|
||||
suffix: str) -> DynSymLinkOption:
|
||||
return DynSymLinkOption(self,
|
||||
rootpath,
|
||||
suffix)
|
||||
|
||||
|
||||
def validate_requires_arg(new_option,
|
||||
multi,
|
||||
|
|
|
@ -51,14 +51,13 @@ class DynOptionDescription(OptionDescription):
|
|||
properties)
|
||||
# check children + set relation to this dynoptiondescription
|
||||
for child in children:
|
||||
if __debug__:
|
||||
if isinstance(child, OptionDescription):
|
||||
if child.impl_get_group_type() != groups.master:
|
||||
if __debug__ and child.impl_get_group_type() != groups.master:
|
||||
raise ConfigError(_('cannot set optiondescription in a '
|
||||
'dynoptiondescription'))
|
||||
for chld in child.get_children(config_bag=undefined):
|
||||
chld._setsubdyn(self)
|
||||
if child.impl_is_symlinkoption():
|
||||
if __debug__ and child.impl_is_symlinkoption():
|
||||
raise ConfigError(_('cannot set symlinkoption in a '
|
||||
'dynoptiondescription'))
|
||||
child._setsubdyn(self)
|
||||
|
|
|
@ -1,77 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Copyright (C) 2018 Team tiramisu (see AUTHORS for all contributors)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
# details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# The original `Config` design model is unproudly borrowed from
|
||||
# the rough pypy's guys: http://codespeak.net/svn/pypy/dist/pypy/config/
|
||||
# the whole pypy projet is under MIT licence
|
||||
# ____________________________________________________________
|
||||
from ..setting import undefined, OptionBag
|
||||
|
||||
|
||||
class DynSymLinkOption(object):
|
||||
__slots__ = ('_rootpath',
|
||||
'_opt',
|
||||
'_suffix')
|
||||
|
||||
def __init__(self,
|
||||
opt,
|
||||
rootpath,
|
||||
suffix) -> None:
|
||||
self._opt = opt
|
||||
self._rootpath = rootpath
|
||||
self._suffix = suffix
|
||||
|
||||
def __getattr__(self,
|
||||
name):
|
||||
return getattr(self._opt, name)
|
||||
|
||||
def __eq__(self, left):
|
||||
if not isinstance(left, DynSymLinkOption):
|
||||
return False
|
||||
return self._opt == left._opt and \
|
||||
self._rootpath == left._rootpath and \
|
||||
self._suffix == left._suffix
|
||||
|
||||
def impl_getname(self):
|
||||
return self._opt.impl_getname() + self._suffix
|
||||
|
||||
def impl_get_display_name(self):
|
||||
return self._opt.impl_get_display_name(dyn_name=self.impl_getname())
|
||||
|
||||
def impl_getsuffix(self):
|
||||
return self._suffix
|
||||
|
||||
def impl_getpath(self):
|
||||
return self._rootpath + '.' + self.impl_getname()
|
||||
|
||||
def impl_validate(self,
|
||||
value,
|
||||
option_bag,
|
||||
check_error=True):
|
||||
context = option_bag.config_bag.context
|
||||
soption_bag = OptionBag()
|
||||
soption_bag.set_option(self._opt,
|
||||
self.impl_getpath(),
|
||||
option_bag.index,
|
||||
option_bag.config_bag)
|
||||
soption_bag.ori_option = option_bag.option
|
||||
soption_bag.fromconsistency = option_bag.fromconsistency.copy()
|
||||
self._opt.impl_validate(value,
|
||||
soption_bag,
|
||||
check_error=check_error)
|
||||
|
||||
def impl_is_dynsymlinkoption(self):
|
||||
return True
|
|
@ -113,7 +113,7 @@ class MasterSlaves(OptionDescription):
|
|||
def is_master(self, opt):
|
||||
master = self._children[0][0]
|
||||
return opt.impl_getname() == master or (opt.impl_is_dynsymlinkoption() and
|
||||
opt._opt.impl_getname() == master)
|
||||
opt.opt.impl_getname() == master)
|
||||
|
||||
def getmaster(self):
|
||||
return self._children[1][0]
|
||||
|
@ -124,7 +124,7 @@ class MasterSlaves(OptionDescription):
|
|||
|
||||
def in_same_group(self, opt):
|
||||
if opt.impl_is_dynsymlinkoption():
|
||||
c_opt = opt._opt
|
||||
c_opt = opt.opt
|
||||
else:
|
||||
c_opt = opt
|
||||
return c_opt in self._children[1]
|
||||
|
|
|
@ -30,6 +30,7 @@ from ..autolib import carry_out_calculation
|
|||
from ..error import (ConfigError, ValueWarning, PropertiesOptionError,
|
||||
ValueOptionError, display_list)
|
||||
from ..function import Params, ParamValue
|
||||
from .syndynoption import SynDynOption
|
||||
ALLOWED_CONST_LIST = ['_cons_not_equal']
|
||||
|
||||
|
||||
|
@ -511,8 +512,8 @@ class Option(BaseOption):
|
|||
if option_bag.ori_option.impl_is_dynsymlinkoption():
|
||||
opts = []
|
||||
for opt in all_cons_opts:
|
||||
opts.append(opt().to_dynoption(option_bag.ori_option._rootpath,
|
||||
option_bag.ori_option._suffix))
|
||||
opts.append(opt().to_dynoption(option_bag.ori_option.rootpath,
|
||||
option_bag.ori_option.suffix))
|
||||
wopt = opts[0]
|
||||
else:
|
||||
opts = all_cons_opts
|
||||
|
@ -714,6 +715,13 @@ class Option(BaseOption):
|
|||
equal_name.append(opt.impl_get_display_name())
|
||||
raise ValueError(msg.format(display_list(list(equal_name))))
|
||||
|
||||
def to_dynoption(self,
|
||||
rootpath: str,
|
||||
suffix: str) -> SynDynOption:
|
||||
return SynDynOption(self,
|
||||
rootpath,
|
||||
suffix)
|
||||
|
||||
|
||||
class RegexpOption(Option):
|
||||
__slots__ = tuple()
|
||||
|
|
82
tiramisu/option/syndynoption.py
Normal file
82
tiramisu/option/syndynoption.py
Normal file
|
@ -0,0 +1,82 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Copyright (C) 2018 Team tiramisu (see AUTHORS for all contributors)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License as published by the
|
||||
# Free Software Foundation, either version 3 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
||||
# details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# The original `Config` design model is unproudly borrowed from
|
||||
# the rough pypy's guys: http://codespeak.net/svn/pypy/dist/pypy/config/
|
||||
# the whole pypy projet is under MIT licence
|
||||
# ____________________________________________________________
|
||||
from typing import Any
|
||||
from ..setting import undefined, OptionBag
|
||||
from .baseoption import BaseOption
|
||||
|
||||
|
||||
class SynDynOption:
|
||||
"""SynDynOption is an Option include un DynOptionDescription with specified prefix
|
||||
"""
|
||||
__slots__ = ('rootpath',
|
||||
'opt',
|
||||
'suffix')
|
||||
|
||||
def __init__(self,
|
||||
opt: BaseOption,
|
||||
rootpath: str,
|
||||
suffix: str) -> None:
|
||||
self.opt = opt
|
||||
self.rootpath = rootpath
|
||||
self.suffix = suffix
|
||||
|
||||
def __getattr__(self,
|
||||
name: str) -> Any:
|
||||
return getattr(self.opt,
|
||||
name)
|
||||
|
||||
def __eq__(self,
|
||||
left: BaseOption) -> bool:
|
||||
if not isinstance(left, SynDynOption):
|
||||
return False
|
||||
return self.opt == left.opt and \
|
||||
self.rootpath == left.rootpath and \
|
||||
self.suffix == left.suffix
|
||||
|
||||
def impl_getname(self) -> str:
|
||||
return self.opt.impl_getname() + self.suffix
|
||||
|
||||
def impl_get_display_name(self) -> str:
|
||||
return self.opt.impl_get_display_name(dyn_name=self.impl_getname())
|
||||
|
||||
def impl_getsuffix(self) -> str:
|
||||
return self.suffix
|
||||
|
||||
def impl_getpath(self) -> str:
|
||||
return self.rootpath + '.' + self.impl_getname()
|
||||
|
||||
def impl_validate(self,
|
||||
value: Any,
|
||||
option_bag: OptionBag,
|
||||
check_error: bool=True) -> None:
|
||||
soption_bag = OptionBag()
|
||||
soption_bag.set_option(self.opt,
|
||||
self.impl_getpath(),
|
||||
option_bag.index,
|
||||
option_bag.config_bag)
|
||||
soption_bag.ori_option = option_bag.option
|
||||
soption_bag.fromconsistency = option_bag.fromconsistency.copy()
|
||||
self.opt.impl_validate(value,
|
||||
soption_bag,
|
||||
check_error=check_error)
|
||||
|
||||
def impl_is_dynsymlinkoption(self) -> bool:
|
||||
return True
|
|
@ -25,7 +25,7 @@ from ..i18n import _
|
|||
from ..setting import ConfigBag, groups, undefined, Settings
|
||||
from ..value import Values
|
||||
from .baseoption import BaseOption
|
||||
from .dynsymlinkoption import DynSymLinkOption
|
||||
from .syndynoption import SynDynOption
|
||||
|
||||
|
||||
class SynDynOptionDescription(object):
|
||||
|
@ -106,11 +106,11 @@ class SynDynOptionDescription(object):
|
|||
|
||||
class SynDynMasterSlaves(SynDynOptionDescription):
|
||||
|
||||
def getmaster(self) -> DynSymLinkOption:
|
||||
def getmaster(self) -> SynDynOption:
|
||||
return self._opt.getmaster().to_dynoption(self.impl_getpath(),
|
||||
self._suffix)
|
||||
|
||||
def getslaves(self) -> Iterator[DynSymLinkOption]:
|
||||
def getslaves(self) -> Iterator[SynDynOption]:
|
||||
subpath = self.impl_getpath()
|
||||
for slave in self._opt.getslaves():
|
||||
yield slave.to_dynoption(subpath,
|
||||
|
|
|
@ -484,7 +484,7 @@ class Settings(object):
|
|||
breaked = False
|
||||
for option, expected in exps:
|
||||
if option.issubdyn():
|
||||
option = option.to_dynoption(option_bag.option._rootpath,
|
||||
option = option.to_dynoption(option_bag.option.rootpath,
|
||||
option_bag.option.impl_getsuffix())
|
||||
reqpath = option.impl_getpath()
|
||||
#FIXME too later!
|
||||
|
|
Loading…
Reference in a new issue