292: Added experimental Command.args_to_kw() method

This commit is contained in:
Jason Gerard DeRose 2008-09-14 23:17:36 +00:00
parent 5a1abcdf4f
commit 4482c71aeb
2 changed files with 42 additions and 12 deletions

View File

@ -333,12 +333,13 @@ class Command(plugable.Plugin):
)
def __call__(self, *args, **kw):
print ''
self.print_call('__call__', kw)
arg_kw = self.args_to_kw(*args)
assert set(arg_kw).intersection(kw) == set()
kw.update(arg_kw)
kw = self.normalize(**kw)
kw = self.convert(**kw)
kw.update(self.get_default(**kw))
self.validate(**kw)
self.execute(**kw)
def smart_option_order(self):
def get_key(option):
@ -373,15 +374,29 @@ class Command(plugable.Plugin):
return tuple(self.__group_args_iter(values, args))
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 values[i]
else:
assert not arg.required
yield None
for (i, arg) in enumerate(args):
if len(values) > i:
if arg.multivalue:
yield values[i:]
else:
yield values[i]
else:
assert not arg.required
yield None
def args_to_kw(self, *values):
return dict(self.__args_to_kw_iter(values))
def __args_to_kw_iter(self, values):
multivalue = False
for (i, arg) in enumerate(self.args()):
assert not multivalue
if len(values) > i:
if arg.multivalue:
multivalue = True
yield (arg.name, values[i:])
else:
yield (arg.name, values[i])
class Object(plugable.Plugin):

View File

@ -584,6 +584,21 @@ class test_Command(ClassChecker):
e = raises(errors.ArgumentError, o.group_args, 1)
assert str(e) == 'example takes at least 2 arguments'
def test_args_to_kw(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)
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))
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))
class test_Object(ClassChecker):
"""