Optparse is not designed for iterative cmd-type apps where you remain at an application prompt after issuing each command - it keeps issuing
sys.exit()s to kick you back to the shell. That was my excuse for not using it earlier, but once I decided to fix it, a little subclassing took care of it.
Next I got a little deeper into decorators than I'd ever been, to provide a concise way to specify those options:
@options([make_option('-k', '--ketchup', action="store_true", help="Ketchup on that?"),
[make_option('-r', '--relish', help="relish (sweet or dill)")])
def do_hotdog(self, arg, opts):
self.stdout.write('One dog with %s relish\n' % opts.relish)
self.stdout.write('Hope you're not wearing white!\n')
That was pretty fun. Took some experimentation and this article, though, to figure out how to write a decorator that would accept an argument.
I didn't throw away the homemade ("flagReader") code, for backward compatibility; I issue a DeprecationWarning instead. I did throw away the guts and reimplement it as a wrapper around optparse. I managed to do that part on a single 20-minute bus ride, thanks to good doctests on flagReader. I feel so grown-up!
Finally, inspired by Brandon Rhodes' article in the March 2008 Python magazine, I tried supporting buildout deployments this time. I'm not sure I'm getting it quite right yet; expect it to actually work in cmd2 0.3.1.