~ubuntu-branches/ubuntu/trusty/cmd2/trusty

« back to all changes in this revision

Viewing changes to cmd2.py

  • Committer: Package Import Robot
  • Author(s): Federico Ceratto
  • Date: 2012-05-28 21:28:35 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20120528212835-3jyfefsxyjzjdqco
Tags: 0.6.4-1
* New upstream release.
* Standards-Version bumped to 3.9.3, minor updates.

Show diffs side-by-side

added added

removed removed

Lines of Context:
42
42
from optparse import make_option
43
43
import pyparsing
44
44
 
45
 
__version__ = '0.6.3'
 
45
__version__ = '0.6.4'
46
46
 
47
47
if sys.version_info[0] == 2:
48
48
    pyparsing.ParserElement.enablePackrat()
57
57
 
58
58
(Pdb) parseFn
59
59
<bound method Or._parseCache of {Python style comment ^ C style comment}>
 
60
 
 
61
Bug report filed: https://sourceforge.net/tracker/?func=detail&atid=617311&aid=3381439&group_id=97203
60
62
"""
61
63
 
62
64
class OptionParser(optparse.OptionParser):
377
379
    debug = False
378
380
    locals_in_py = True
379
381
    kept_state = None
 
382
    redirector = '>'                    # for sending output to file
380
383
    settable = stubbornDict('''
381
384
        prompt
382
385
        colors                Colorized output (*nix only)
626
629
          - terminator: ;
627
630
        - terminator: ;        
628
631
        >>> print (c.parser.parseString('multiline command /* with comment in progress;').dump())
629
 
        ['multiline', ' command']
 
632
        ['multiline', ' command /* with comment in progress;']
630
633
        - multilineCommand: multiline
631
634
        >>> print (c.parser.parseString('multiline command /* with comment complete */ is done;').dump())
632
635
        ['multiline', 'command /* with comment complete */ is done', ';', '']
646
649
          - multilineCommand: multiline
647
650
          - terminator: ['\n', '\n']
648
651
        - terminator: ['\n', '\n']
 
652
        >>> print (c.parser.parseString('multiline command "with term; ends" now\n\n').dump())
 
653
        ['multiline', 'command "with term; ends" now', '\n', '\n']
 
654
        - args: command "with term; ends" now
 
655
        - multilineCommand: multiline
 
656
        - statement: ['multiline', 'command "with term; ends" now', '\n', '\n']
 
657
          - args: command "with term; ends" now
 
658
          - multilineCommand: multiline
 
659
          - terminator: ['\n', '\n']
 
660
        - terminator: ['\n', '\n']
 
661
        >>> print (c.parser.parseString('what if "quoted strings /* seem to " start comments?').dump())
 
662
        ['what', 'if "quoted strings /* seem to " start comments?']
 
663
        - args: if "quoted strings /* seem to " start comments?
 
664
        - command: what
 
665
        - statement: ['what', 'if "quoted strings /* seem to " start comments?']
 
666
          - args: if "quoted strings /* seem to " start comments?
 
667
          - command: what
649
668
        '''
650
 
        outputParser = (pyparsing.Literal('>>') | (pyparsing.WordStart() + '>') | pyparsing.Regex('[^=]>'))('output')
 
669
        #outputParser = (pyparsing.Literal('>>') | (pyparsing.WordStart() + '>') | pyparsing.Regex('[^=]>'))('output')
 
670
        outputParser = (pyparsing.Literal(self.redirector *2) | \
 
671
                       (pyparsing.WordStart() + self.redirector) | \
 
672
                        pyparsing.Regex('[^=]' + self.redirector))('output')
651
673
        
652
674
        terminatorParser = pyparsing.Or([(hasattr(t, 'parseString') and t) or pyparsing.Literal(t) for t in self.terminators])('terminator')
653
675
        stringEnd = pyparsing.stringEnd ^ '\nEOF'
654
676
        self.multilineCommand = pyparsing.Or([pyparsing.Keyword(c, caseless=self.case_insensitive) for c in self.multilineCommands])('multilineCommand')
655
677
        oneLineCommand = (~self.multilineCommand + pyparsing.Word(self.legalChars))('command')
656
678
        pipe = pyparsing.Keyword('|', identChars='|')
657
 
        self.commentGrammars.ignore(pyparsing.quotedString).setParseAction(lambda x: '')        
 
679
        self.commentGrammars.ignore(pyparsing.quotedString).setParseAction(lambda x: '')
 
680
        doNotParse = self.commentGrammars | self.commentInProgress | pyparsing.quotedString
658
681
        afterElements = \
659
 
            pyparsing.Optional(pipe + pyparsing.SkipTo(outputParser ^ stringEnd)('pipeTo')) + \
660
 
            pyparsing.Optional(outputParser + pyparsing.SkipTo(stringEnd).setParseAction(lambda x: x[0].strip())('outputTo'))
 
682
            pyparsing.Optional(pipe + pyparsing.SkipTo(outputParser ^ stringEnd, ignore=doNotParse)('pipeTo')) + \
 
683
            pyparsing.Optional(outputParser + pyparsing.SkipTo(stringEnd, ignore=doNotParse).setParseAction(lambda x: x[0].strip())('outputTo'))
661
684
        if self.case_insensitive:
662
685
            self.multilineCommand.setParseAction(lambda x: x[0].lower())
663
686
            oneLineCommand.setParseAction(lambda x: x[0].lower())
666
689
        else:
667
690
            self.blankLineTerminator = (pyparsing.lineEnd + pyparsing.lineEnd)('terminator')
668
691
            self.blankLineTerminator.setResultsName('terminator')
669
 
            self.blankLineTerminationParser = ((self.multilineCommand ^ oneLineCommand) + pyparsing.SkipTo(self.blankLineTerminator).setParseAction(lambda x: x[0].strip())('args') + self.blankLineTerminator)('statement')
670
 
        self.multilineParser = (((self.multilineCommand ^ oneLineCommand) + pyparsing.SkipTo(terminatorParser, ignore=self.commentInProgress).setParseAction(lambda x: x[0].strip())('args') + terminatorParser)('statement') +
671
 
                                pyparsing.SkipTo(outputParser ^ pipe ^ stringEnd).setParseAction(lambda x: x[0].strip())('suffix') + afterElements)
 
692
            self.blankLineTerminationParser = ((self.multilineCommand ^ oneLineCommand) + pyparsing.SkipTo(self.blankLineTerminator, ignore=doNotParse).setParseAction(lambda x: x[0].strip())('args') + self.blankLineTerminator)('statement')
 
693
        self.multilineParser = (((self.multilineCommand ^ oneLineCommand) + pyparsing.SkipTo(terminatorParser, ignore=doNotParse).setParseAction(lambda x: x[0].strip())('args') + terminatorParser)('statement') +
 
694
                                pyparsing.SkipTo(outputParser ^ pipe ^ stringEnd, ignore=doNotParse).setParseAction(lambda x: x[0].strip())('suffix') + afterElements)
672
695
        self.multilineParser.ignore(self.commentInProgress)
673
 
        self.singleLineParser = ((oneLineCommand + pyparsing.SkipTo(terminatorParser ^ stringEnd ^ pipe ^ outputParser).setParseAction(lambda x:x[0].strip())('args'))('statement') +
 
696
        self.singleLineParser = ((oneLineCommand + pyparsing.SkipTo(terminatorParser ^ stringEnd ^ pipe ^ outputParser, ignore=doNotParse).setParseAction(lambda x:x[0].strip())('args'))('statement') +
674
697
                                 pyparsing.Optional(terminatorParser) + afterElements)
675
698
        #self.multilineParser = self.multilineParser.setResultsName('multilineParser')
676
699
        #self.singleLineParser = self.singleLineParser.setResultsName('singleLineParser')
680
703
            self.multilineParser |
681
704
            self.singleLineParser |
682
705
            self.blankLineTerminationParser | 
683
 
            self.multilineCommand + pyparsing.SkipTo(stringEnd)
 
706
            self.multilineCommand + pyparsing.SkipTo(stringEnd, ignore=doNotParse)
684
707
            )
685
 
        self.parser.ignore(pyparsing.quotedString).ignore(self.commentGrammars)
 
708
        self.parser.ignore(self.commentGrammars)
686
709
        
687
710
        inputMark = pyparsing.Literal('<')
688
711
        inputMark.setParseAction(lambda x: '')
693
716
        # as in "lesser than"
694
717
        self.inputParser = inputMark + pyparsing.Optional(inputFrom) + pyparsing.Optional('>') + \
695
718
                           pyparsing.Optional(fileName) + (pyparsing.stringEnd | '|')
696
 
        self.inputParser.ignore(pyparsing.quotedString).ignore(self.commentGrammars).ignore(self.commentInProgress)               
 
719
        self.inputParser.ignore(self.commentInProgress)               
697
720
    
698
721
    def preparse(self, raw, **kwargs):
699
722
        return raw
796
819
            self.kept_sys = Statekeeper(sys, ('stdout',))
797
820
            if statement.parsed.outputTo:
798
821
                mode = 'w'
799
 
                if statement.parsed.output == '>>':
 
822
                if statement.parsed.output == 2 * self.redirector:
800
823
                    mode = 'a'
801
824
                sys.stdout = self.stdout = open(os.path.expanduser(statement.parsed.outputTo), mode)                            
802
825
            else:
1055
1078
                pass
1056
1079
            keepstate.restore()
1057
1080
            
1058
 
    def do_history(self, arg):
 
1081
    @options([make_option('-s', '--script', action="store_true", help="Script format; no separation lines"),
 
1082
             ], arg_desc = '(limit on which commands to include)')
 
1083
    def do_history(self, arg, opts):
1059
1084
        """history [arg]: lists past commands issued
1060
1085
        
1061
1086
        | no arg:         list all
1068
1093
        else:
1069
1094
            history = self.history
1070
1095
        for hi in history:
1071
 
            self.stdout.write(hi.pr())
 
1096
            if opts.script:
 
1097
                self.poutput(hi)
 
1098
            else:
 
1099
                self.stdout.write(hi.pr())
1072
1100
    def last_matching(self, arg):
1073
1101
        try:
1074
1102
            if arg: