# Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. # Gianluca Montecchi # Oleg Romanyshyn # W. Trevor King # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ Define assorted utilities to make command-line handling easier. """ import glob import optparse import os from textwrap import TextWrapper from StringIO import StringIO import sys import doctest import bugdir import plugin import encoding class UserError(Exception): def __init__(self, msg): Exception.__init__(self, msg) class UnknownCommand(UserError): def __init__(self, cmd): Exception.__init__(self, "Unknown command '%s'" % cmd) self.cmd = cmd class UsageError(Exception): pass class GetHelp(Exception): pass class GetCompletions(Exception): def __init__(self, completions=[]): msg = "Get allowed completions" Exception.__init__(self, msg) self.completions = completions def iter_commands(): for name, module in plugin.iter_plugins("becommands"): yield name.replace("_", "-"), module def get_command(command_name): """Retrieves the module for a user command >>> try: ... get_command("asdf") ... except UnknownCommand, e: ... print e Unknown command 'asdf' >>> repr(get_command("list")).startswith(" 0: max_pos_arg = max(bugid_args.keys()) else: max_pos_arg = -1 for pos,value in enumerate(args): if value == "--complete": filter = None if pos in bugid_args: filter = bugid_args[pos] if pos > max_pos_arg and -1 in bugid_args: filter = bugid_args[-1] if filter != None: bugshortnames = [] try: bd = bugdir.BugDir(from_disk=True, manipulate_encodings=False) bd.load_all_bugs() bugs = [bug for bug in bd if filter(bug) == True] bugshortnames = [bd.bug_shortname(bug) for bug in bugs] except bugdir.NoBugDir: pass raise GetCompletions(bugshortnames) raise GetCompletions() def complete_path(path): """List possible path completions for path.""" comps = glob.glob(path+"*") + glob.glob(path+"/*") if len(comps) == 1 and os.path.isdir(comps[0]): comps.extend(glob.glob(comps[0]+"/*")) return comps def underlined(instring): """Produces a version of a string that is underlined with '=' >>> underlined("Underlined String") 'Underlined String\\n=================' """ return "%s\n%s" % (instring, "="*len(instring)) def bug_from_shortname(bdir, shortname): """ Exception translation for the command-line interface. """ try: bug = bdir.bug_from_shortname(shortname) except (bugdir.MultipleBugMatches, bugdir.NoBugMatches), e: raise UserError(e.message) return bug def _test(): import doctest import sys doctest.testmod() if __name__ == "__main__": _test() suite = doctest.DocTestSuite()