[Python-Dev] New Module: CommandLoop
Crutcher Dunnavant
crutcher at gmail.com
Sun Feb 19 23:02:20 CET 2006
oops, error in the example: s/commandLoop/CommandLoop/g
On 2/19/06, Crutcher Dunnavant <crutcher at gmail.com> wrote:
> 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
>
--
Crutcher Dunnavant <crutcher at gmail.com>
littlelanguages.com
monket.samedi-studios.com
More information about the Python-Dev
mailing list