diff --git a/tiramisu/option/__init__.py b/tiramisu/option/__init__.py index 909f1e6..78a6734 100644 --- a/tiramisu/option/__init__.py +++ b/tiramisu/option/__init__.py @@ -5,12 +5,12 @@ from .masterslaves import MasterSlaves from .baseoption import submulti from .symlinkoption import SymLinkOption from .syndynoption import SynDynOption -from .option import Option, RegexpOption +from .option import Option from .choiceoption import ChoiceOption from .booloption import BoolOption from .intoption import IntOption from .floatoption import FloatOption -from .stroption import StrOption, UnicodeOption +from .stroption import StrOption, UnicodeOption, RegexpOption from .ipoption import IPOption from .portoption import PortOption from .networkoption import NetworkOption diff --git a/tiramisu/option/domainnameoption.py b/tiramisu/option/domainnameoption.py index 8854a46..83c3488 100644 --- a/tiramisu/option/domainnameoption.py +++ b/tiramisu/option/domainnameoption.py @@ -24,9 +24,10 @@ from IPy import IP from ..setting import undefined, Undefined, OptionBag from ..i18n import _ from .option import Option +from .stroption import StrOption -class DomainnameOption(Option): +class DomainnameOption(StrOption): """represents the choice of a domain name netbios: for MS domain hostname: to identify the device diff --git a/tiramisu/option/emailoption.py b/tiramisu/option/emailoption.py index 1d4886a..89432cb 100644 --- a/tiramisu/option/emailoption.py +++ b/tiramisu/option/emailoption.py @@ -21,7 +21,7 @@ import re from ..i18n import _ -from .option import RegexpOption +from .stroption import RegexpOption class EmailOption(RegexpOption): diff --git a/tiramisu/option/filenameoption.py b/tiramisu/option/filenameoption.py index 1142a34..ef4ea69 100644 --- a/tiramisu/option/filenameoption.py +++ b/tiramisu/option/filenameoption.py @@ -21,7 +21,7 @@ import re from ..i18n import _ -from .option import RegexpOption +from .stroption import RegexpOption class FilenameOption(RegexpOption): diff --git a/tiramisu/option/ipoption.py b/tiramisu/option/ipoption.py index 3eab8a8..e417c1f 100644 --- a/tiramisu/option/ipoption.py +++ b/tiramisu/option/ipoption.py @@ -24,9 +24,10 @@ from ..error import ConfigError from ..setting import undefined, Undefined, OptionBag from ..i18n import _ from .option import Option +from .stroption import StrOption -class IPOption(Option): +class IPOption(StrOption): "represents the choice of an ip" __slots__ = tuple() _display_name = _('IP') diff --git a/tiramisu/option/netmaskoption.py b/tiramisu/option/netmaskoption.py index 80a2a5d..0d33112 100644 --- a/tiramisu/option/netmaskoption.py +++ b/tiramisu/option/netmaskoption.py @@ -24,9 +24,10 @@ from ..error import ConfigError from ..setting import undefined, OptionBag, Undefined from ..i18n import _ from .option import Option +from .stroption import StrOption -class NetmaskOption(Option): +class NetmaskOption(StrOption): "represents the choice of a netmask" __slots__ = tuple() _display_name = _('netmask address') diff --git a/tiramisu/option/passwordoption.py b/tiramisu/option/passwordoption.py index bab8225..8366757 100644 --- a/tiramisu/option/passwordoption.py +++ b/tiramisu/option/passwordoption.py @@ -22,9 +22,10 @@ from ..setting import undefined, Undefined, OptionBag from ..i18n import _ from .option import Option +from .stroption import StrOption -class PasswordOption(Option): +class PasswordOption(StrOption): "represents the choice of a password" __slots__ = tuple() _display_name = _('password') diff --git a/tiramisu/option/portoption.py b/tiramisu/option/portoption.py index 5a39861..4a6ea56 100644 --- a/tiramisu/option/portoption.py +++ b/tiramisu/option/portoption.py @@ -25,9 +25,10 @@ from typing import Union from ..setting import undefined, Undefined, OptionBag from ..i18n import _ from .option import Option +from .stroption import StrOption -class PortOption(Option): +class PortOption(StrOption): """represents the choice of a port The port numbers are divided into three ranges: the well-known ports, @@ -101,8 +102,6 @@ class PortOption(Option): value: Union[int,str], option_bag: OptionBag, current_opt: Option=Undefined) -> None: - if isinstance(value, int): - value = str(value) if not isinstance(value, str): raise ValueError(_('invalid string')) if self.impl_get_extra('_allow_range') and ":" in str(value): diff --git a/tiramisu/option/stroption.py b/tiramisu/option/stroption.py index a0f9022..e28b375 100644 --- a/tiramisu/option/stroption.py +++ b/tiramisu/option/stroption.py @@ -19,6 +19,7 @@ # the whole pypy projet is under MIT licence # ____________________________________________________________ import sys +from typing import Any from ..setting import undefined, Undefined, OptionBag from ..i18n import _ @@ -42,3 +43,17 @@ class StrOption(Option): class UnicodeOption(StrOption): __slots__ = tuple() _display_name = _('unicode') + + +class RegexpOption(StrOption): + __slots__ = tuple() + + def _validate(self, + value: Any, + option_bag: OptionBag, + current_opt: Option=Undefined) -> None: + if not isinstance(value, str): + raise ValueError(_('invalid string')) + match = self._regexp.search(value) + if not match: + raise ValueError() diff --git a/tiramisu/option/usernameoption.py b/tiramisu/option/usernameoption.py index 0732c73..1882051 100644 --- a/tiramisu/option/usernameoption.py +++ b/tiramisu/option/usernameoption.py @@ -21,7 +21,7 @@ import re from ..i18n import _ -from .option import RegexpOption +from .stroption import RegexpOption class UsernameOption(RegexpOption):