diff options
-rw-r--r-- | ipalib/public.py | 27 | ||||
-rw-r--r-- | ipalib/tests/test_public.py | 8 |
2 files changed, 35 insertions, 0 deletions
diff --git a/ipalib/public.py b/ipalib/public.py index b22eff0e..003e0d72 100644 --- a/ipalib/public.py +++ b/ipalib/public.py @@ -214,12 +214,39 @@ class Command(plugable.Plugin): options = tuple() takes_args = tuple() + def __init__(self): + self.args = plugable.NameSpace(self.__check_args(), sort=False) + def get_args(self): return self.takes_args def get_options(self): return self.options + def __check_args(self): + optional = False + multivalue = False + for arg in self.get_args(): + if type(arg) is str: + arg = Option(arg, '', ipa_types.Unicode(), required=True) + elif not isinstance(arg, Option): + raise TypeError( + 'arg: need %r or %r; got %r' % (str, Option, arg) + ) + if optional and arg.required: + raise ValueError( + '%s: required argument after optional' % arg.name + ) + if multivalue: + raise ValueError( + '%s: only final argument can be multivalue' % arg.name + ) + if not arg.required: + optional = True + if arg.multivalue: + multivalue = True + yield arg + def __get_Option(self): """ Returns the NameSpace containing the Option instances. diff --git a/ipalib/tests/test_public.py b/ipalib/tests/test_public.py index f9ff3a89..2683e5dd 100644 --- a/ipalib/tests/test_public.py +++ b/ipalib/tests/test_public.py @@ -368,6 +368,14 @@ class test_Command(ClassChecker): o = example() assert o.get_args() is args + def test_args(self): + """ + Tests the ``Command.args`` instance attribute. + """ + ns = self.cls().args + assert type(ns) is plugable.NameSpace + assert len(ns) == 0 + def test_get_options(self): """ Tests the `public.Command.get_options` method. |