File: command_option_parser.py

package info (click to toggle)
chromium-browser 57.0.2987.98-1~deb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 2,637,852 kB
  • ctags: 2,544,394
  • sloc: cpp: 12,815,961; ansic: 3,676,222; python: 1,147,112; asm: 526,608; java: 523,212; xml: 286,794; perl: 92,654; sh: 86,408; objc: 73,271; makefile: 27,698; cs: 18,487; yacc: 13,031; tcl: 12,957; pascal: 4,875; ml: 4,716; lex: 3,904; sql: 3,862; ruby: 1,982; lisp: 1,508; php: 1,368; exp: 404; awk: 325; csh: 117; jsp: 39; sed: 37
file content (75 lines) | stat: -rw-r--r-- 2,419 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""An option parser which handles the first arg as a command.

Add other nice functionality such as printing a list of commands
and an example in usage.
"""

import optparse
import sys


class CommandOptionParser(optparse.OptionParser):
  """Wrapper class for OptionParser to help with listing commands."""

  def __init__(self, *args, **kwargs):
    """Creates a CommandOptionParser.

    Args:
      commands_dict: A dictionary mapping command strings to an object defining
          - add_options_func: Adds options to the option parser
          - run_command_func: Runs the command itself.
      example: An example command.
      everything else: Passed to optparse.OptionParser contructor.
    """
    self.commands_dict = kwargs.pop('commands_dict', {})
    self.example = kwargs.pop('example', '')
    if not 'usage' in kwargs:
      kwargs['usage'] = 'Usage: %prog <command> [options]'
    optparse.OptionParser.__init__(self, *args, **kwargs)

  #override
  def get_usage(self):
    normal_usage = optparse.OptionParser.get_usage(self)
    command_list = self.get_command_list()
    example = self.get_example()
    return self.expand_prog_name(normal_usage + example + command_list)

  #override
  def get_command_list(self):
    if self.commands_dict.keys():
      return '\nCommands:\n  %s\n' % '\n  '.join(
          sorted(self.commands_dict.keys()))
    return ''

  def get_example(self):
    if self.example:
      return '\nExample:\n  %s\n' % self.example
    return ''


def ParseAndExecute(option_parser, argv=None):
  """Parses options/args from argv and runs the specified command.

  Args:
    option_parser: A CommandOptionParser object.
    argv: Command line arguments. If None, automatically draw from sys.argv.

  Returns:
    An exit code.
  """
  if not argv:
    argv = sys.argv

    if len(argv) < 2 or argv[1] not in option_parser.commands_dict:
      # Parse args first, if this is '--help', optparse will print help and exit
      option_parser.parse_args(argv)
      option_parser.error('Invalid command.')

    cmd = option_parser.commands_dict[argv[1]]
    cmd.add_options_func(option_parser)
    options, args = option_parser.parse_args(argv)
    return cmd.run_command_func(argv[1], options, args, option_parser)