diff --git a/ipalib/public.py b/ipalib/public.py index 4c0255ef0..84d321bee 100644 --- a/ipalib/public.py +++ b/ipalib/public.py @@ -350,34 +350,38 @@ class Command(plugable.Plugin): for option in sorted(self.options(), key=get_key): yield option - def args_to_kw(self, *args): - Args = tuple(self.args()) - if len(Args) == 0 and len(args) > 0: - raise errors.ArgumentError(self, 'takes no arguments') - if len(args) > len(Args) and not Args[-1].multivalue: - if len(Args) == 1: - error = 'takes at most 1 argument' - else: - error = 'takes at most %d arguments' % len(Args) - raise errors.ArgumentError(self, error) - MinArgs = sum(int(A.required) for A in Args) - if len(args) < MinArgs: - if MinArgs == 1: + def group_args(self, *values): + args = tuple(self.args()) + if len(args) == 0: + if len(values) > 0: + raise errors.ArgumentError(self, 'takes no arguments') + else: + return tuple() + if len(values) > len(args) and not args[-1].multivalue: + if len(args) == 1: + error = 'takes at most 1 argument' + else: + error = 'takes at most %d arguments' % len(args) + raise errors.ArgumentError(self, error) + min_args = sum(int(a.required) for a in args) + if len(values) < min_args: + if min_args == 1: error = 'takes at least 1 argument' else: - error = 'takes at least %d arguments' % MinArgs + error = 'takes at least %d arguments' % min_args raise errors.ArgumentError(self, error) - return dict(self.__args_to_kw_iter(args)) + return tuple(self.__group_args_iter(values, args)) - def __args_to_kw_iter(self, args): - for (i, Arg) in enumerate(self.args()): - if len(args) > i: - if Arg.multivalue: - yield (Arg.name, args[i:]) + def __group_args_iter(self, values, args): + for (i, arg) in enumerate(args): + if len(values) > i: + if arg.multivalue: + yield values[i:] else: - yield (Arg.name, args[i]) + yield values[i] else: - assert not Arg.required + assert not arg.required + yield None class Object(plugable.Plugin): diff --git a/ipalib/tests/test_public.py b/ipalib/tests/test_public.py index 8bff5a19f..aac962b53 100644 --- a/ipalib/tests/test_public.py +++ b/ipalib/tests/test_public.py @@ -550,38 +550,38 @@ class test_Command(ClassChecker): """ assert 'execute' in self.cls.__public__ # Public - def test_args_to_kw(self): + def test_group_args(self): o = self.__get_instance(args=('one', 'two?')) - assert o.args_to_kw(1) == dict(one=1) - assert o.args_to_kw(1, 2) == dict(one=1, two=2) + assert o.group_args(1) == (1, None) + assert o.group_args(1, 2) == (1, 2) o = self.__get_instance(args=('one', 'two*')) - assert o.args_to_kw(1) == dict(one=1) - assert o.args_to_kw(1, 2) == dict(one=1, two=(2,)) - assert o.args_to_kw(1, 2, 3) == dict(one=1, two=(2, 3)) + assert o.group_args(1) == (1, None) + assert o.group_args(1, 2) == (1, (2,)) + assert o.group_args(1, 2, 3) == (1, (2, 3)) o = self.__get_instance(args=('one', 'two+')) - assert o.args_to_kw(1, 2) == dict(one=1, two=(2,)) - assert o.args_to_kw(1, 2, 3) == dict(one=1, two=(2, 3)) + assert o.group_args(1, 2) == (1, (2,)) + assert o.group_args(1, 2, 3) == (1, (2, 3)) o = self.__get_instance() - e = raises(errors.ArgumentError, o.args_to_kw, 1) + e = raises(errors.ArgumentError, o.group_args, 1) assert str(e) == 'example takes no arguments' o = self.__get_instance(args=('one?',)) - e = raises(errors.ArgumentError, o.args_to_kw, 1, 2) + e = raises(errors.ArgumentError, o.group_args, 1, 2) assert str(e) == 'example takes at most 1 argument' o = self.__get_instance(args=('one', 'two?')) - e = raises(errors.ArgumentError, o.args_to_kw, 1, 2, 3) + e = raises(errors.ArgumentError, o.group_args, 1, 2, 3) assert str(e) == 'example takes at most 2 arguments' o = self.__get_instance(args=('one', 'two?')) - e = raises(errors.ArgumentError, o.args_to_kw) + e = raises(errors.ArgumentError, o.group_args) assert str(e) == 'example takes at least 1 argument' o = self.__get_instance(args=('one', 'two', 'three?')) - e = raises(errors.ArgumentError, o.args_to_kw, 1) + e = raises(errors.ArgumentError, o.group_args, 1) assert str(e) == 'example takes at least 2 arguments'