summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipalib/public.py27
-rw-r--r--ipalib/tests/test_public.py8
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.