# HG changeset patch # User catherine@dellzilla # Date 1224878638 14400 # Node ID 2d3232693807ad0205636ffb828d86773a5775c4 # Parent 130340609e195ea3e910b34da85379616d7ffcf5 prompt-setting quirks diff -r 130340609e19 -r 2d3232693807 cmd2/cmd2.py --- a/cmd2/cmd2.py Fri Oct 24 14:32:23 2008 -0400 +++ b/cmd2/cmd2.py Fri Oct 24 16:03:58 2008 -0400 @@ -98,7 +98,7 @@ win32clipboard.SetClipboardText(txt) win32clipboard.CloseClipboard() except ImportError: - def getPasteBuffer(): + def getPasteBuffer(*args): raise OSError, pastebufferr % ('pywin32', 'Download from http://sourceforge.net/projects/pywin32/') setPasteBuffer = getPasteBuffer else: @@ -129,9 +129,10 @@ xclipproc.stdin.write(txt) xclipproc.stdin.close() else: - def getPasteBuffer(): + def getPasteBuffer(*args): raise OSError, pastebufferr % ('xclip', 'On Debian/Ubuntu, install with "sudo apt-get install xclip"') setPasteBuffer = getPasteBuffer + writeToPasteBuffer = getPasteBuffer pyparsing.ParserElement.setDefaultWhitespaceChars(' \t') def parseSearchResults(pattern, s): @@ -151,7 +152,8 @@ multilineCommands = [] continuationPrompt = '> ' shortcuts = {'?': 'help', '!': 'shell', '@': 'load'} - excludeFromHistory = '''run r list l history hi ed edit li eof'''.split() + excludeFromHistory = '''run r list l history hi ed edit li eof'''.split() + noSpecialParse = 'set ed edit exit'.split() defaultExtension = 'txt' defaultFileName = 'command.txt' editor = os.environ.get('EDITOR') @@ -235,6 +237,14 @@ if isinstance(s, pyparsing.ParseResults): return s result = (pyparsing.SkipTo(pyparsing.StringEnd()))('fullStatement').parseString(s) + command = s.split()[0] + if self.caseInsensitive: + command = command.lower() + '''if command in self.noSpecialParse: + result['statement'] = result['upToIncluding'] = result['unterminated'] = result.fullStatement + result['command'] = command + result['args'] = ' '.join(result.fullStatement.split()[1:]) + return result''' if s[0] in self.shortcuts: s = self.shortcuts[s[0]] + ' ' + s[1:] result['statement'] = s @@ -252,7 +262,7 @@ result += parseSearchResults(self.redirectOutPattern, result.parseable) result += parseSearchResults(self.argSeparatorPattern, result.statement) if self.caseInsensitive: - result['command'] = result.command.lower() + result['command'] = result.command.lower() result['statement'] = '%s %s' % (result.command, result.args) return result @@ -433,9 +443,12 @@ paramName, val = arg.split(None, 1) paramName = self.clean(paramName) if paramName not in self.settable: - raise NotSettableError + raise NotSettableError currentVal = getattr(self, paramName) - val = cast(currentVal, self.parsed(val).unterminated) + if (val[0] == val[-1]) and val[0] in ("'", '"'): + val = val[1:-1] + else: + val = cast(currentVal, self.parsed(val).unterminated) setattr(self, paramName, val) self.stdout.write('%s - was: %s\nnow: %s\n' % (paramName, currentVal, val)) except (ValueError, AttributeError, NotSettableError), e: diff -r 130340609e19 -r 2d3232693807 cmd2/example.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd2/example.py Fri Oct 24 16:03:58 2008 -0400 @@ -0,0 +1,45 @@ +'''A sample application for cmd2.''' + +from cmd2 import Cmd, make_option, options, Cmd2TestCase +import unittest, optparse, sys + +class CmdLineApp(Cmd): + multilineCommands = ['orate'] + Cmd.shortcuts.update({'&': 'speak'}) + maxrepeats = 3 + Cmd.settable.append('maxrepeats') + + @options([make_option('-p', '--piglatin', action="store_true", help="atinLay"), + make_option('-s', '--shout', action="store_true", help="N00B EMULATION MODE"), + make_option('-r', '--repeat', type="int", help="output [n] times") + ]) + def do_speak(self, arg, opts=None): + """Repeats what you tell me to.""" + arg = ''.join(arg) + if opts.piglatin: + arg = '%s%say' % (arg[1:], arg[0]) + if opts.shout: + arg = arg.upper() + repetitions = opts.repeat or 1 + for i in range(min(repetitions, self.maxrepeats)): + self.stdout.write(arg) + self.stdout.write('\n') + # self.stdout.write is better than "print", because Cmd can be + # initialized with a non-standard output destination + + do_say = do_speak # now "say" is a synonym for "speak" + do_orate = do_speak # another synonym, but this one takes multi-line input + +class TestMyAppCase(Cmd2TestCase): + CmdApp = CmdLineApp + transcriptFileName = 'exampleSession.txt' + +parser = optparse.OptionParser() +parser.add_option('-t', '--test', dest='unittests', action='store_true', default=False, help='Run unit test suite') +(callopts, callargs) = parser.parse_args() +if callopts.unittests: + sys.argv = [sys.argv[0]] # the --test argument upsets unittest.main() + unittest.main() +else: + app = CmdLineApp() + app.cmdloop() diff -r 130340609e19 -r 2d3232693807 cmd2/exampleSession.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd2/exampleSession.txt Fri Oct 24 16:03:58 2008 -0400 @@ -0,0 +1,36 @@ +(Cmd) say goodnight, Gracie +goodnight, Gracie +(Cmd) say -p goodnight, Gracie +oodnight, Graciegay +(Cmd) say -h +Usage: speak [options] arg + +Options: + -h, --help show this help message and exit + -p, --piglatin atinLay + -s, --shout N00B EMULATION MODE + -r REPEAT, --repeat=REPEAT + output [n] times +(Cmd) say --shout goodnight, Gracie +GOODNIGHT, GRACIE +(Cmd) set prompt 'example >>> ' +prompt - was: (Cmd) +now: example >>> +example >>> say --repeat 5 spam +spam +spam +spam +example >>> set +prompt: example >>> +editor: gedit +echo: False +maxrepeats: 3 +example >>> set maxrepeats 10 +maxrepeats - was: 3 +now: 10 +example >>> say --repeat 5 spam +spam +spam +spam +spam +spam \ No newline at end of file