[Python-Dev] New Module: CommandLoop (original) (raw)

Crutcher Dunnavant crutcher at gmail.com
Sun Feb 19 22:52:38 CET 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()

-- Crutcher Dunnavant <crutcher at gmail.com> littlelanguages.com monket.samedi-studios.com



More information about the Python-Dev mailing list