255: CLI help, console commands now subclass from public.Application; other tweeking to make CLI utilize Application

This commit is contained in:
Jason Gerard DeRose 2008-09-04 04:39:01 +00:00
parent e1f8619d4a
commit ab81ca56fd
5 changed files with 27 additions and 16 deletions

View File

@ -61,4 +61,5 @@ api = plugable.API(
public.Object, public.Object,
public.Method, public.Method,
public.Property, public.Property,
public.Application,
) )

View File

@ -44,7 +44,7 @@ def from_cli(cli_name):
return str(cli_name).replace('-', '_') return str(cli_name).replace('-', '_')
class help(public.Command): class help(public.Application):
'Display help on command' 'Display help on command'
def __call__(self, key): def __call__(self, key):
if from_cli(key) not in self.api.Command: if from_cli(key) not in self.api.Command:
@ -53,7 +53,7 @@ class help(public.Command):
print 'Help on command %r:' % key print 'Help on command %r:' % key
class console(public.Command): class console(public.Application):
'Start IPA Interactive Python Console' 'Start IPA Interactive Python Console'
def __call__(self): def __call__(self):
@ -95,10 +95,16 @@ class CLI(object):
api.register(help) api.register(help)
api.register(console) api.register(console)
api.finalize() api.finalize()
def d_iter(): for a in api.Application():
for cmd in api.Command(): a.set_application(self)
yield (to_cli(cmd.name), cmd) self.build_map()
self.__d = dict(d_iter())
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): def run(self):
self.finalize() self.finalize()

View File

@ -396,6 +396,7 @@ class Application(Command):
__public__ = frozenset(( __public__ = frozenset((
'application', 'application',
'set_application'
)).union(Command.__public__) )).union(Command.__public__)
__application = None __application = None
@ -404,7 +405,9 @@ class Application(Command):
Returns external ``application`` object. Returns external ``application`` object.
""" """
return self.__application return self.__application
def __set_application(self, application): application = property(__get_application)
def set_application(self, application):
""" """
Sets the external application object to ``application``. Sets the external application object to ``application``.
""" """
@ -418,4 +421,3 @@ class Application(Command):
) )
object.__setattr__(self, '_Application__application', application) object.__setattr__(self, '_Application__application', application)
assert self.application is application assert self.application is application
application = property(__get_application, __set_application)

View File

@ -75,6 +75,7 @@ class DummyAPI(object):
class test_CLI(ClassChecker): class test_CLI(ClassChecker):
""" """
Tests the `cli.CLI` class. Tests the `cli.CLI` class.
@ -117,7 +118,7 @@ class test_CLI(ClassChecker):
len(api.Command) == cnt len(api.Command) == cnt
o = self.cls(api) o = self.cls(api)
assert o.mcl is None assert o.mcl is None
o.finalize() o.build_map()
assert o.mcl == 6 # len('cmd_99') assert o.mcl == 6 # len('cmd_99')
def test_dict(self): def test_dict(self):
@ -128,7 +129,7 @@ class test_CLI(ClassChecker):
api = DummyAPI(cnt) api = DummyAPI(cnt)
assert len(api.Command) == cnt assert len(api.Command) == cnt
o = self.cls(api) o = self.cls(api)
o.finalize() o.build_map()
for cmd in api.Command(): for cmd in api.Command():
key = cli.to_cli(cmd.name) key = cli.to_cli(cmd.name)
assert key in o assert key in o

View File

@ -707,19 +707,20 @@ class test_Application(ClassChecker):
Tests the `public.Application.application` property. Tests the `public.Application.application` property.
""" """
assert 'application' in self.cls.__public__ # Public assert 'application' in self.cls.__public__ # Public
assert 'set_application' in self.cls.__public__ # Public
app = 'The external application' app = 'The external application'
class example(self.cls): class example(self.cls):
'A subclass' 'A subclass'
for o in (self.cls(), example()): for o in (self.cls(), example()):
assert o.application is None assert read_only(o, 'application') is None
e = raises(TypeError, setattr, o, 'application', None) e = raises(TypeError, o.set_application, None)
assert str(e) == ( assert str(e) == (
'%s.application cannot be None' % o.__class__.__name__ '%s.application cannot be None' % o.__class__.__name__
) )
o.application = app o.set_application(app)
assert o.application is app assert read_only(o, 'application') is app
e = raises(AttributeError, setattr, o, 'application', app) e = raises(AttributeError, o.set_application, app)
assert str(e) == ( assert str(e) == (
'%s.application can only be set once' % o.__class__.__name__ '%s.application can only be set once' % o.__class__.__name__
) )
assert o.application is app assert read_only(o, 'application') is app