summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xipa6
-rw-r--r--ipalib/cli.py31
-rw-r--r--ipalib/public.py5
-rw-r--r--ipalib/tests/test_cli.py19
-rw-r--r--ipalib/tests/test_public.py7
5 files changed, 65 insertions, 3 deletions
diff --git a/ipa b/ipa
index 1dcef2883..c7168bfe9 100755
--- a/ipa
+++ b/ipa
@@ -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