From ab81ca56fd336af4b83ef19a6f97dffe0b1a0923 Mon Sep 17 00:00:00 2001 From: Jason Gerard DeRose Date: Thu, 4 Sep 2008 04:39:01 +0000 Subject: [PATCH] 255: CLI help, console commands now subclass from public.Application; other tweeking to make CLI utilize Application --- ipalib/__init__.py | 1 + ipalib/cli.py | 18 ++++++++++++------ ipalib/public.py | 6 ++++-- ipalib/tests/test_cli.py | 5 +++-- ipalib/tests/test_public.py | 13 +++++++------ 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/ipalib/__init__.py b/ipalib/__init__.py index a5fc3f116..b0f0a1fc8 100644 --- a/ipalib/__init__.py +++ b/ipalib/__init__.py @@ -61,4 +61,5 @@ api = plugable.API( public.Object, public.Method, public.Property, + public.Application, ) diff --git a/ipalib/cli.py b/ipalib/cli.py index 989c24f67..e1cbfa78f 100644 --- a/ipalib/cli.py +++ b/ipalib/cli.py @@ -44,7 +44,7 @@ def from_cli(cli_name): return str(cli_name).replace('-', '_') -class help(public.Command): +class help(public.Application): 'Display help on command' def __call__(self, key): if from_cli(key) not in self.api.Command: @@ -53,7 +53,7 @@ class help(public.Command): print 'Help on command %r:' % key -class console(public.Command): +class console(public.Application): 'Start IPA Interactive Python Console' def __call__(self): @@ -95,10 +95,16 @@ class CLI(object): api.register(help) api.register(console) api.finalize() - def d_iter(): - for cmd in api.Command(): - yield (to_cli(cmd.name), cmd) - self.__d = dict(d_iter()) + for a in api.Application(): + a.set_application(self) + self.build_map() + + def build_map(self): + assert self.__d is None + self.__d = dict( + (c.name.replace('_', '-'), c) for c in self.api.Command() + ) + def run(self): self.finalize() diff --git a/ipalib/public.py b/ipalib/public.py index c6611ab72..eb94ac52d 100644 --- a/ipalib/public.py +++ b/ipalib/public.py @@ -396,6 +396,7 @@ class Application(Command): __public__ = frozenset(( 'application', + 'set_application' )).union(Command.__public__) __application = None @@ -404,7 +405,9 @@ class Application(Command): Returns external ``application`` object. """ return self.__application - def __set_application(self, application): + application = property(__get_application) + + def set_application(self, application): """ Sets the external application object to ``application``. """ @@ -418,4 +421,3 @@ class Application(Command): ) object.__setattr__(self, '_Application__application', application) assert self.application is application - application = property(__get_application, __set_application) diff --git a/ipalib/tests/test_cli.py b/ipalib/tests/test_cli.py index 2c65bd06f..df3f943eb 100644 --- a/ipalib/tests/test_cli.py +++ b/ipalib/tests/test_cli.py @@ -75,6 +75,7 @@ class DummyAPI(object): + class test_CLI(ClassChecker): """ Tests the `cli.CLI` class. @@ -117,7 +118,7 @@ class test_CLI(ClassChecker): len(api.Command) == cnt o = self.cls(api) assert o.mcl is None - o.finalize() + o.build_map() assert o.mcl == 6 # len('cmd_99') def test_dict(self): @@ -128,7 +129,7 @@ class test_CLI(ClassChecker): api = DummyAPI(cnt) assert len(api.Command) == cnt o = self.cls(api) - o.finalize() + o.build_map() for cmd in api.Command(): key = cli.to_cli(cmd.name) assert key in o diff --git a/ipalib/tests/test_public.py b/ipalib/tests/test_public.py index 52fb9336b..c071832a1 100644 --- a/ipalib/tests/test_public.py +++ b/ipalib/tests/test_public.py @@ -707,19 +707,20 @@ class test_Application(ClassChecker): Tests the `public.Application.application` property. """ assert 'application' in self.cls.__public__ # Public + assert 'set_application' in self.cls.__public__ # Public app = 'The external application' class example(self.cls): 'A subclass' for o in (self.cls(), example()): - assert o.application is None - e = raises(TypeError, setattr, o, 'application', None) + assert read_only(o, 'application') is None + e = raises(TypeError, o.set_application, None) assert str(e) == ( '%s.application cannot be None' % o.__class__.__name__ ) - o.application = app - assert o.application is app - e = raises(AttributeError, setattr, o, 'application', app) + o.set_application(app) + assert read_only(o, 'application') is app + e = raises(AttributeError, o.set_application, app) assert str(e) == ( '%s.application can only be set once' % o.__class__.__name__ ) - assert o.application is app + assert read_only(o, 'application') is app