# 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 [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)