New Module: CommandLoop

Crutcher crutcher at gmail.com
Sun Feb 19 21:34:48 EST 2006


This is something I've been working on for a bit, and I think it is
more or less ready to bring up on this list. I'd like to add a module
(though probably not for 2.5).

Before you ask, this module is _not_ compatible with cmd.py, as it is
command oriented, whereas cmd.py is line oriented.

Anyway, I'm looking for feedback, feature requests before starting the
submission process.

Code available here:
http://littlelanguages.com/web/software/python/modules/cmdloop.py

Base class for writing simple interactive command loop environments.

CommandLoop provides a base class for writing simple interactive user
environments.  It is designed around sub-classing, has a simple command
parser, and is trivial to initialize.

Here is a trivial little environment written using CommandLoop:

   import cmdloop

   class Hello(cmdloop.CommandLoop):
       PS1='hello>'

       @cmdloop.aliases('hello', 'hi', 'hola')
       @cmdloop.shorthelp('say hello')
       @cmdloop.usage('hello TARGET')
       def helloCmd(self, flags, args):
           '''
           Say hello to TARGET, which defaults to 'world'
           '''
           if flags or len(args) != 1:
               raise cmdloop.InvalidArguments
           print 'Hello %s!' % args[0]

       @cmdloop.aliases('quit')
       def quitCmd(self, flags, args):
           '''
           Quit the environment.
           '''
           raise cmdloop.HaltLoop

   Hello().runLoop()

Here's a more complex example:

   import cmdloop

   class HelloGoodbye(cmdloop.CommandLoop):
       PS1='hello>'

       def __init__(self, default_target = 'world'):
           self.default_target = default_target
           self.target_list = []

       @cmdloop.aliases('hello', 'hi', 'hola')
       @cmdloop.shorthelp('say hello')
       @cmdloop.usage('hello [TARGET]')
       def helloCmd(self, flags, args):
           '''
           Say hello to TARGET, which defaults to 'world'
           '''
           if flags or len(args) > 1:
               raise cmdloop.InvalidArguments
           if args:
               target = args[0]
           else:
               target = self.default_target
           if target not in self.target_list:
               self.target_list.append(target)
           print 'Hello %s!' % target

       @cmdloop.aliases('goodbye')
       @cmdloop.shorthelp('say goodbye')
       @cmdloop.usage('goodbye TARGET')
       def goodbyeCmd(self, flags, args):
           '''
           Say goodbye to TARGET.
           '''
           if flags or len(args) != 1:
               raise cmdloop.InvalidArguments
           target = args[0]
           if target in self.target_list:
               print 'Goodbye %s!' % target
               self.target_list.remove(target)
           else:
               print "I haven't said hello to %s." % target

       @cmdloop.aliases('quit')
       def quitCmd(self, flags, args):
           '''
           Quit the environment.
           '''
           raise cmdloop.HaltLoop

       def _onLoopExit(self):
           if len(self.target_list):
               self.pushCommands(('quit',))
               for target in self.target_list:
                   self.pushCommands(('goodbye', target))
           else:
               raise cmdloop.HaltLoop

   HelloGoodbye().runLoop()




More information about the Python-list mailing list