Chromium Code Reviews| Index: build/android/pylib/utils/command_option_parser.py |
| diff --git a/build/android/pylib/utils/command_option_parser.py b/build/android/pylib/utils/command_option_parser.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..df54a7bacffe4b5f324a09d966e56e3b280c0218 |
| --- /dev/null |
| +++ b/build/android/pylib/utils/command_option_parser.py |
| @@ -0,0 +1,74 @@ |
| +# 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. |
|
frankf
2013/08/13 23:33:39
2 spaces, same below
frankf
2013/08/13 23:33:39
Can you just pass argv everywhere instead of relyi
gkanwar1
2013/08/15 19:49:20
Done.
gkanwar1
2013/08/15 19:49:20
I did this to parallel optparser.OptionParser.pars
|
| + |
| + Returns: |
| + An exit code. |
| + """ |
| + if not argv: |
| + argv = sys.argv |
| + |
| + if len(argv) < 2 or argv[1] not in option_parser.commands_dict: |
| + option_parser.error('Invalid command.') |
| + |
| + command = argv[1] |
| + option_parser.commands_dict[command].add_options_func(option_parser) |
| + options, args = option_parser.parse_args(argv) |
| + return option_parser.commands_dict[command].run_command_func( |
| + command, options, args, option_parser) |