| OLD | NEW | 
| (Empty) |  | 
 |   1 # Copyright 2013 The Chromium Authors. All rights reserved. | 
 |   2 # Use of this source code is governed by a BSD-style license that can be | 
 |   3 # found in the LICENSE file. | 
 |   4  | 
 |   5 """An option parser which handles the first arg as a command. | 
 |   6  | 
 |   7 Add other nice functionality such as printing a list of commands | 
 |   8 and an example in usage. | 
 |   9 """ | 
 |  10  | 
 |  11 import optparse | 
 |  12 import sys | 
 |  13  | 
 |  14  | 
 |  15 class CommandOptionParser(optparse.OptionParser): | 
 |  16   """Wrapper class for OptionParser to help with listing commands.""" | 
 |  17  | 
 |  18   def __init__(self, *args, **kwargs): | 
 |  19     """Creates a CommandOptionParser. | 
 |  20  | 
 |  21     Args: | 
 |  22       commands_dict: A dictionary mapping command strings to an object defining | 
 |  23           - add_options_func: Adds options to the option parser | 
 |  24           - run_command_func: Runs the command itself. | 
 |  25       example: An example command. | 
 |  26       everything else: Passed to optparse.OptionParser contructor. | 
 |  27     """ | 
 |  28     self.commands_dict = kwargs.pop('commands_dict', {}) | 
 |  29     self.example = kwargs.pop('example', '') | 
 |  30     if not 'usage' in kwargs: | 
 |  31       kwargs['usage'] = 'Usage: %prog <command> [options]' | 
 |  32     optparse.OptionParser.__init__(self, *args, **kwargs) | 
 |  33  | 
 |  34   #override | 
 |  35   def get_usage(self): | 
 |  36     normal_usage = optparse.OptionParser.get_usage(self) | 
 |  37     command_list = self.get_command_list() | 
 |  38     example = self.get_example() | 
 |  39     return self.expand_prog_name(normal_usage + example + command_list) | 
 |  40  | 
 |  41   #override | 
 |  42   def get_command_list(self): | 
 |  43     if self.commands_dict.keys(): | 
 |  44       return '\nCommands:\n  %s\n' % '\n  '.join( | 
 |  45           sorted(self.commands_dict.keys())) | 
 |  46     return '' | 
 |  47  | 
 |  48   def get_example(self): | 
 |  49     if self.example: | 
 |  50       return '\nExample:\n  %s\n' % self.example | 
 |  51     return '' | 
 |  52  | 
 |  53  | 
 |  54 def ParseAndExecute(option_parser, argv=None): | 
 |  55   """Parses options/args from argv and runs the specified command. | 
 |  56  | 
 |  57   Args: | 
 |  58     option_parser: A CommandOptionParser object. | 
 |  59     argv: Command line arguments. If None, automatically draw from sys.argv. | 
 |  60  | 
 |  61   Returns: | 
 |  62     An exit code. | 
 |  63   """ | 
 |  64   if not argv: | 
 |  65     argv = sys.argv | 
 |  66  | 
 |  67     if len(argv) < 2 or argv[1] not in option_parser.commands_dict: | 
 |  68       # Parse args first, if this is '--help', optparse will print help and exit | 
 |  69       option_parser.parse_args(argv) | 
 |  70       option_parser.error('Invalid command.') | 
 |  71  | 
 |  72     cmd = option_parser.commands_dict[argv[1]] | 
 |  73     cmd.add_options_func(option_parser) | 
 |  74     options, args = option_parser.parse_args(argv) | 
 |  75     return cmd.run_command_func(argv[1], options, args, option_parser) | 
| OLD | NEW |