diff --git a/test/test_dyn_optiondescription.py b/test/test_dyn_optiondescription.py
index 5eb95bc..f29426d 100644
--- a/test/test_dyn_optiondescription.py
+++ b/test/test_dyn_optiondescription.py
@@ -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'))")
diff --git a/tiramisu/autolib.py b/tiramisu/autolib.py
index ea0ce09..95ab4b1 100644
--- a/tiramisu/autolib.py
+++ b/tiramisu/autolib.py
@@ -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 \
diff --git a/tiramisu/option/__init__.py b/tiramisu/option/__init__.py
index 50437eb..909f1e6 100644
--- a/tiramisu/option/__init__.py
+++ b/tiramisu/option/__init__.py
@@ -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',
diff --git a/tiramisu/option/baseoption.py b/tiramisu/option/baseoption.py
index c8b2a2a..dd87783 100644
--- a/tiramisu/option/baseoption.py
+++ b/tiramisu/option/baseoption.py
@@ -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,
diff --git a/tiramisu/option/dynoptiondescription.py b/tiramisu/option/dynoptiondescription.py
index a1aa3c7..be06799 100644
--- a/tiramisu/option/dynoptiondescription.py
+++ b/tiramisu/option/dynoptiondescription.py
@@ -51,16 +51,15 @@ 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:
- 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():
- raise ConfigError(_('cannot set symlinkoption in a '
+ if isinstance(child, OptionDescription):
+ 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 __debug__ and child.impl_is_symlinkoption():
+ raise ConfigError(_('cannot set symlinkoption in a '
+ 'dynoptiondescription'))
child._setsubdyn(self)
# add callback
self._impl_set_callback(callback,
diff --git a/tiramisu/option/dynsymlinkoption.py b/tiramisu/option/dynsymlinkoption.py
deleted file mode 100644
index d2ae0c7..0000000
--- a/tiramisu/option/dynsymlinkoption.py
+++ /dev/null
@@ -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 .
-#
-# 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
diff --git a/tiramisu/option/masterslaves.py b/tiramisu/option/masterslaves.py
index 79645d2..347725c 100644
--- a/tiramisu/option/masterslaves.py
+++ b/tiramisu/option/masterslaves.py
@@ -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]
diff --git a/tiramisu/option/option.py b/tiramisu/option/option.py
index a28d553..6e8bb04 100644
--- a/tiramisu/option/option.py
+++ b/tiramisu/option/option.py
@@ -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()
diff --git a/tiramisu/option/syndynoption.py b/tiramisu/option/syndynoption.py
new file mode 100644
index 0000000..5dc82e2
--- /dev/null
+++ b/tiramisu/option/syndynoption.py
@@ -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 .
+#
+# 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
diff --git a/tiramisu/option/syndynoptiondescription.py b/tiramisu/option/syndynoptiondescription.py
index 5a6484a..0e6aaf8 100644
--- a/tiramisu/option/syndynoptiondescription.py
+++ b/tiramisu/option/syndynoptiondescription.py
@@ -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,
diff --git a/tiramisu/setting.py b/tiramisu/setting.py
index a4295a8..5a05ee6 100644
--- a/tiramisu/setting.py
+++ b/tiramisu/setting.py
@@ -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!