diff options
-rw-r--r-- | ipalib/cli.py | 28 | ||||
-rw-r--r-- | ipalib/public.py | 12 | ||||
-rw-r--r-- | ipalib/tests/test_cli.py | 12 |
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 |