diff options
-rwxr-xr-x | ipa | 6 | ||||
-rw-r--r-- | ipalib/cli.py | 31 | ||||
-rw-r--r-- | ipalib/public.py | 5 | ||||
-rw-r--r-- | ipalib/tests/test_cli.py | 19 | ||||
-rw-r--r-- | ipalib/tests/test_public.py | 7 |
5 files changed, 65 insertions, 3 deletions
@@ -27,6 +27,12 @@ Just proof of concept stuff in here right now. import sys from ipalib.startup import api +from ipalib.cli import CLI + +cli = CLI(api) +cli.run() + +sys.exit() TAB_WIDTH = 2 diff --git a/ipalib/cli.py b/ipalib/cli.py index 5e257f709..639883375 100644 --- a/ipalib/cli.py +++ b/ipalib/cli.py @@ -21,6 +21,8 @@ Functionality for Command Line Inteface. """ +import sys +import re def to_cli(name): """ @@ -38,3 +40,32 @@ def from_cli(cli_name): """ assert isinstance(cli_name, basestring) return cli_name.replace('-', '_') + + +class CLI(object): + def __init__(self, api): + self.__api = api + + def __get_api(self): + return self.__api + api = property(__get_api) + + def print_commands(self): + for cmd in self.api.cmd: + print to_cli(cmd.name) + + def run(self): + if len(sys.argv) < 2: + self.print_commands() + print 'Usage: ipa COMMAND [OPTIONS]' + sys.exit(2) + return + name= sys.argv[1] + if name == '_api_': + print_api() + sys.exit() + elif name not in api.cmd: + print_commands() + print 'ipa: ERROR: unknown command %r' % name + sys.exit(2) + api.cmd[name]() diff --git a/ipalib/public.py b/ipalib/public.py index 88b08be55..48e19ff40 100644 --- a/ipalib/public.py +++ b/ipalib/public.py @@ -199,7 +199,7 @@ class cmd(plugable.Plugin): if key in self.options: self.options[key].validate(value) - def execute(self, **kw) + def execute(self, **kw): pass def print_n_call(self, method, kw): @@ -214,8 +214,7 @@ class cmd(plugable.Plugin): kw = self.normalize(**kw) kw.update(self.default(**kw)) self.validate(**kw) - self.execute(**kw) - + return self.execute(**kw) class obj(plugable.Plugin): diff --git a/ipalib/tests/test_cli.py b/ipalib/tests/test_cli.py index 91bc0a29c..b47aff3ac 100644 --- a/ipalib/tests/test_cli.py +++ b/ipalib/tests/test_cli.py @@ -21,6 +21,7 @@ Unit tests for `ipalib.cli` module. """ +from tstutil import raises, getitem, no_set, no_del, read_only, ClassChecker from ipalib import cli @@ -34,3 +35,21 @@ def test_from_cli(): f = cli.from_cli assert f('initialize') == 'initialize' assert f('user-add') == 'user_add' + + +class test_CLI(ClassChecker): + """ + Tests the `CLI` class. + """ + _cls = cli.CLI + + def test_class(self): + assert type(self.cls.api) is property + + def test_api(self): + """ + Tests the `api` property. + """ + api = 'the plugable.API instance' + o = self.cls(api) + assert read_only(o, 'api') is api diff --git a/ipalib/tests/test_public.py b/ipalib/tests/test_public.py index 814018592..d6f3dbbe1 100644 --- a/ipalib/tests/test_public.py +++ b/ipalib/tests/test_public.py @@ -267,6 +267,13 @@ class test_cmd(ClassChecker): sub.validate(**okay) raises(errors.RuleError, sub.validate, **fail) + def test_execute(self): + """ + Tests the `execute` method. + """ + assert 'execute' in self.cls.__public__ # Public + + def test_obj(): cls = public.obj |