diff cmd2.py @ 166:a3414ac38677

so close - now problem with terminator in string
author catherine@dellzilla
date Mon, 08 Dec 2008 17:27:47 -0500
parents 3dc882a00e53
children a38303571916
line wrap: on
line diff
--- a/cmd2.py	Thu Dec 04 16:43:57 2008 -0500
+++ b/cmd2.py	Mon Dec 08 17:27:47 2008 -0500
@@ -176,7 +176,7 @@
     echo = False
     caseInsensitive = True
     continuationPrompt = '> '  
-    legalChars = '!#$%.:?@_'   # make sure your terminators are not in here!
+    legalChars = '!#$%.:?@_' + pyparsing.alphanums + pyparsing.alphas8bit  # make sure your terminators are not in here!
     shortcuts = {'?': 'help', '!': 'shell', '@': 'load' }
     excludeFromHistory = '''run r list l history hi ed edit li eof'''.split()
     noSpecialParse = 'set ed edit exit'.split()
@@ -375,7 +375,7 @@
         terminatorParser = pyparsing.oneOf(self.terminators)('terminator')
         stringEnd = pyparsing.stringEnd ^ '\nEOF'
         multilineCommand = pyparsing.Or([pyparsing.Keyword(c, caseless=self.caseInsensitive) for c in self.multilineCommands])('multilineCommand')
-        oneLineCommand = pyparsing.Word(self.legalChars + pyparsing.alphanums + pyparsing.alphas8bit)('command')
+        oneLineCommand = pyparsing.Word(self.legalChars)('command')
         pipe = pyparsing.Keyword('|', identChars='|')
         afterElements = \
             pyparsing.Optional(pipe + pyparsing.SkipTo(outputParser ^ stringEnd)('pipeTo')) + \
@@ -400,7 +400,7 @@
         
         inputMark = pyparsing.Literal('<')
         inputMark.setParseAction(lambda x: '')
-        inputFrom = pyparsing.Word(self.legalChars)('inputFrom')
+        inputFrom = pyparsing.Word(self.legalChars + '/\\')('inputFrom')
         inputFrom.setParseAction(lambda x: (x and open(x[0]).read()) or getPasteBuffer())
         self.inputParser = inputMark + pyparsing.Optional(inputFrom)
         self.inputParser.ignore(pyparsing.sglQuotedString).ignore(pyparsing.dblQuotedString).ignore(self.commentGrammars).ignore(self.commentInProgress)               
@@ -409,7 +409,7 @@
         if isinstance(raw, ParsedString):
             p = raw
         else:
-            s = self.inputParser.transformString(raw.strip())
+            s = self.inputParser.transformString(raw.strip()) # used to be raw.strip()
             for (shortcut, expansion) in self.shortcuts.items():
                 if s.startswith(shortcut):
                     s = s.replace(shortcut, expansion + ' ', 1)
@@ -419,14 +419,14 @@
             result['raw'] = raw
             result['clean'] = self.commentGrammars.transformString(result.args)
             result['expanded'] = s        
-            p = ParsedString(result.args)
+            p = ParsedString(result.clean)
             p.parsed = result
             p.parser = self.parsed
         for (key, val) in kwargs.items():
             p.parsed[key] = val
         return p
               
-    def onecmd(self, line, assumeComplete=False):
+    def onecmd(self, line):
         """Interpret the argument as though it had been typed in response
         to the prompt.
 
@@ -445,13 +445,9 @@
             return 0
         try:
             statement = self.parsed(line)
-            if assumeComplete:
-                if statement.parsed.multilineCommand and not statement.parsed.terminator:
-                    statement.parsed.terminator = self.terminators[0]
-            else:
-                while statement.parsed.multilineCommand and not statement.parsed.terminator:
-                    statement = self.parsed('%s\n%s' % (statement.parsed.raw, 
-                                            self.pseudo_raw_input(self.continuationPrompt)))
+            while statement.parsed.multilineCommand and not statement.parsed.terminator:
+                statement = self.parsed('%s\n%s' % (statement.parsed.raw, 
+                                        self.pseudo_raw_input(self.continuationPrompt)))
         except Exception, e:
             print e
             return 0
@@ -916,12 +912,18 @@
     def testall(self):
         if self.CmdApp:            
             for (cmdInput, lineNum) in self.transcriptReader.inputGenerator():
-                self.cmdapp.onecmd(cmdInput, assumeComplete=True)
+                parsed = self.cmdapp.parsed(cmdInput)
+                if parsed.parsed.multilineCommand and not parsed.parsed.terminator:
+                    cmdInput = cmdInput + self.cmdapp.terminators[0]
+                self.cmdapp.onecmd(cmdInput)
                 result = self.outputTrap.read()
                 expected = self.transcriptReader.nextExpected()
                 self.assertEqual(self.stripByLine(result), self.stripByLine(expected), 
                     '\nFile %s, line %d\nCommand was:\n%s\nExpected:\n%s\nGot:\n%s\n' % 
-                    (self.transcriptFileName, lineNum, cmdInput, expected, result))
+                    (self.transcriptFileName, lineNum, cmdInput, expected, result))                
+                #self.assertEqual(self.stripByLine(result), self.stripByLine(expected), 
+                #    '\nFile %s, line %d\nCommand was:\n%s\nExpected:\n%s\nGot:\n%s\n' % 
+                #    (self.transcriptFileName, lineNum, cmdInput, expected, result))
     def stripByLine(self, s):
         bareprompt = self.cmdapp.continuationPrompt.strip()
         lines = []