From dff6bd9bf89ca80e2265696a478e540476718c9c Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Sat, 12 Dec 2009 20:57:59 -0500 Subject: [PATCH] Moved be to libbe.ui.command_line and transitioned to Command format. --- be | 102 +--------- libbe/bug.py | 2 +- libbe/bugdir.py | 2 +- libbe/command/__init__.py | 4 +- libbe/command/base.py | 102 +++++----- libbe/command/list.py | 1 + libbe/command/util.py | 35 +++- libbe/comment.py | 2 +- libbe/storage/util/settings_object.py | 8 +- libbe/ui/base.py | 1 + libbe/ui/command_line.py | 270 ++++++++++++++++++++++++++ libbe/ui/util/cmdutil.py | 108 ----------- libbe/util/encoding.py | 2 +- setup.py | 4 +- 14 files changed, 375 insertions(+), 268 deletions(-) create mode 100755 libbe/ui/command_line.py diff --git a/be b/be index 5e3088e..5f7bd1b 100755 --- a/be +++ b/be @@ -1,103 +1,7 @@ #!/usr/bin/env python -# Copyright (C) 2005-2009 Aaron Bentley and Panometrics, Inc. -# Chris Ball -# 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. +# Copyright -import os import sys +import libbe.ui.command_line -from libbe import cmdutil, version, pager - -__doc__ = cmdutil.help() - -usage = "be [options] [command] [command_options ...] [command_args ...]" - -parser = cmdutil.CmdOptionParser(usage) -parser.command = "be" -parser.add_option("--version", action="store_true", dest="version", - help="Print version string and exit.") -parser.add_option("--verbose-version", action="store_true", dest="verbose_version", - help="Print verbose version information and exit.") -parser.add_option("-d", "--dir", dest="dir", metavar="DIR", default=".", - help="Run this command on the repository in DIR instead of the current directory.") -parser.add_option("-p", "--paginate", dest="paginate", default=False, - action='store_true', - help="Pipe all output into less (or if set, $PAGER).") -parser.add_option("--no-pager", dest="no_pager", default=False, - action='store_true', - help="Do not pipe git output into a pager.") - -# Option(name='repo', short_name='r', -# help='Select BE repository (see `be help repo`) rather than' -# 'the current directory.', -# arg=Argument(name='repo', metavar='REPO', default='.', -# completion_callback=libbe.ui.util.repo.complete)), - -try: - options,args = parser.parse_args() - for option,value in cmdutil.option_value_pairs(options, parser): - if value == "--complete": - if option == "dir": - if len(args) == 0: - args = ["."] - paths = cmdutil.complete_path(args[0]) - raise cmdutil.GetCompletions(paths) -except cmdutil.GetHelp: - print cmdutil.help(parser=parser) - sys.exit(0) -except cmdutil.GetCompletions, e: - print '\n'.join(e.completions) - sys.exit(0) - -if options.version == True or options.verbose_version == True: - print version.version(verbose=options.verbose_version) - sys.exit(0) - -paginate = 'auto' -if options.paginate == True: - paginate = 'always' -if options.no_pager== True: - paginate = 'never' -pager.run_pager(paginate) - -try: - if len(args) == 0: - raise cmdutil.UsageError, "must supply a command" - sys.exit(cmdutil.execute(args[0], args=args[1:], dir=options.dir)) -except cmdutil.GetHelp: - print cmdutil.help(args[0]) - sys.exit(0) -except cmdutil.GetCompletions, e: - print '\n'.join(e.completions) - sys.exit(0) -except cmdutil.UnknownCommand, e: - print e - sys.exit(1) -except cmdutil.UsageError, e: - print "Invalid usage:", e - if len(args) == 0: - print cmdutil.help(parser=parser) - else: - print "\nArgs:", args - print cmdutil.help(args[0]) - sys.exit(1) -except cmdutil.UserError, e: - print "ERROR:" - print e - sys.exit(1) +sys.exit(libbe.ui.command_line.main()) diff --git a/libbe/bug.py b/libbe/bug.py index 1f96779..d62de49 100644 --- a/libbe/bug.py +++ b/libbe/bug.py @@ -37,7 +37,7 @@ import libbe.util.id from libbe.storage.util.properties import Property, doc_property, \ local_property, defaulting_property, checked_property, cached_property, \ primed_property, change_hook_property, settings_property -import libbe.storage.settings_object as settings_object +import libbe.storage.util.settings_object as settings_object import libbe.storage.util.mapfile as mapfile import libbe.comment as comment import libbe.util.utility as utility diff --git a/libbe/bugdir.py b/libbe/bugdir.py index 39eface..5f76d3c 100644 --- a/libbe/bugdir.py +++ b/libbe/bugdir.py @@ -36,7 +36,7 @@ from libbe.storage.util.properties import Property, doc_property, \ local_property, defaulting_property, checked_property, \ fn_checked_property, cached_property, primed_property, \ change_hook_property, settings_property -import libbe.storage.settings_object as settings_object +import libbe.storage.util.settings_object as settings_object import libbe.storage.util.mapfile as mapfile import libbe.bug as bug import libbe.util.utility as utility diff --git a/libbe/command/__init__.py b/libbe/command/__init__.py index 344a8a2..8558882 100644 --- a/libbe/command/__init__.py +++ b/libbe/command/__init__.py @@ -18,12 +18,12 @@ import base UserError = base.UserError -UnkownCommand = base.UnknownCommand +UnknownCommand = base.UnknownCommand get_command = base.get_command commands = base.commands Option = base.Option Argument = base.Argument Command = base.Command -__all__ = [UserError, UnkownCommand, get_command, commands, +__all__ = [UserError, UnknownCommand, get_command, commands, Option, Argument, Command] diff --git a/libbe/command/base.py b/libbe/command/base.py index 0db156b..252dd24 100644 --- a/libbe/command/base.py +++ b/libbe/command/base.py @@ -36,7 +36,7 @@ def get_command(command_name): def commands(): for modname in libbe.util.plugin.modnames('libbe.command'): - if modname != 'base': + if modname not in ['base', 'util']: yield modname class CommandInput (object): @@ -44,28 +44,48 @@ class CommandInput (object): self.name = name self.help = help -class Option (CommandInput): - def __init__(self, option_callback=None, short_name=None, arg=None, - type=None, *args, **kwargs): - CommandInput.__init__(self, *args, **kwargs) - self.option_callback = option_callback - self.short_name = short_name - self.arg = arg - self.type = type - if self.arg != None: - assert self.arg.name == self.name, \ - 'Name missmatch: %s != %s' % (self.arg.name, self.name) - class Argument (CommandInput): - def __init__(self, metavar=None, default=None, + def __init__(self, metavar=None, default=None, type='string', optional=False, repeatable=False, completion_callback=None, *args, **kwargs): CommandInput.__init__(self, *args, **kwargs) self.metavar = metavar self.default = default + self.type = type self.optional = optional self.repeatable = repeatable self.completion_callback = completion_callback + if self.metavar == None: + self.metavar = self.name.upper() + +class Option (CommandInput): + def __init__(self, callback=None, short_name=None, arg=None, + *args, **kwargs): + CommandInput.__init__(self, *args, **kwargs) + self.callback = callback + self.short_name = short_name + self.arg = arg + if self.arg == None and self.callback == None: + # use an implicit boolean argument + self.arg = Argument(name=self.name, help=self.help, + default=False, type='bool') + self.validate() + + def validate(self): + if self.arg == None: + assert self.callback != None + return + assert self.callback == None, self.callback + assert self.arg.name == self.name, \ + 'Name missmatch: %s != %s' % (self.arg.name, self.name) + assert self.arg.optional == False + assert self.arg.repeatable == False + + def __str__(self): + return '--%s' % self.name + + def __repr__(self): + return '