summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipalib/cli.py28
-rw-r--r--ipalib/public.py12
-rw-r--r--ipalib/tests/test_cli.py12
3 files changed, 32 insertions, 20 deletions
diff --git a/ipalib/cli.py b/ipalib/cli.py
index 40edc890f..ad54d77ae 100644
--- a/ipalib/cli.py
+++ b/ipalib/cli.py
@@ -76,17 +76,17 @@ class CLI(object):
self.print_commands()
print 'ipa: ERROR: unknown command %r' % cmd
sys.exit(2)
- self.run_cmd(cmd)
-
- def run_cmd(self, cmd):
- (options, args) = self.build_parser(cmd)
- print options
-
- def build_parser(self, cmd):
- parser = optparse.OptionParser()
- for option in self[cmd].options:
- parser.add_option('--%s' % to_cli(option.name),
- help=option.get_doc(_),
- )
-
- (options, args) parser.parse_args()
+ self.run_cmd(cmd, sys.argv[2:])
+
+ def run_cmd(self, cmd, args):
+ kw = dict(self.parse_kw(args))
+ self[cmd](**kw)
+
+ def parse_kw(self, args):
+ for arg in args:
+ m = re.match(r'^--([a-z][-a-z0-9]*)=(.+)$', arg)
+ if m is not None:
+ yield (
+ from_cli(m.group(1)),
+ m.group(2),
+ )
diff --git a/ipalib/public.py b/ipalib/public.py
index e66e13684..c1e644d5b 100644
--- a/ipalib/public.py
+++ b/ipalib/public.py
@@ -208,15 +208,15 @@ class cmd(plugable.Plugin):
print '%s.%s(%s)' % (
self.name,
method,
- ' '.join('%s=%r' % (k, v) for (k, v) in kw.items()),
+ ', '.join('%s=%r' % (k, v) for (k, v) in kw.items()),
)
- getattr(self, method)(**kw)
+ return getattr(self, method)(**kw)
def __call__(self, **kw):
- kw = self.normalize(**kw)
- kw.update(self.default(**kw))
- self.validate(**kw)
- return self.execute(**kw)
+ kw = self.print_n_call('normalize', kw)
+ kw.update(self.print_n_call('default', kw))
+ self.print_n_call('validate', kw)
+ return self.print_n_call('execute', kw)
class obj(plugable.Plugin):
diff --git a/ipalib/tests/test_cli.py b/ipalib/tests/test_cli.py
index b47aff3ac..d56a4b192 100644
--- a/ipalib/tests/test_cli.py
+++ b/ipalib/tests/test_cli.py
@@ -53,3 +53,15 @@ class test_CLI(ClassChecker):
api = 'the plugable.API instance'
o = self.cls(api)
assert read_only(o, 'api') is api
+
+ def test_parse_kw(self):
+ """
+ Tests the `parse_kw` method.
+ """
+ o = self.cls(None)
+ kw = dict(
+ hello='world',
+ how_are='you',
+ )
+ args = tuple('--%s=%s' % (cli.to_cli(k), v) for (k,v) in kw.items())
+ assert dict(o.parse_kw(args)) == kw