~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to utilities/script_commands.py

  • Committer: Aaron Bentley
  • Date: 2011-08-04 20:44:08 UTC
  • mto: This revision was merged to the branch mainline in revision 13619.
  • Revision ID: aaron@canonical.com-20110804204408-wu7ozxhn0k3dn9qu
Remove Command.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
    return add_dict('_helps', **kwargs)
21
21
 
22
22
 
23
 
 
24
23
def get_function_parser(function):
 
24
    """Generate an OptionParser for a function.
 
25
 
 
26
    Defaults come from the parameter defaults.
 
27
    For every permitted to provide as an option, the type must be specified,
 
28
    using the types decorator.
 
29
    Help may be specified using the helps decorator.
 
30
    """
25
31
    parser = OptionParser()
26
32
    args, ignore, ignored, defaults = inspect.getargspec(function)
27
33
    for arg in args:
41
47
    return parser
42
48
 
43
49
 
44
 
class Command:
45
 
    """Base class for subcommands."""
46
 
 
47
 
    commands = {}
48
 
 
49
 
    @classmethod
50
 
    def parse_args(cls, command, args):
51
 
        if len(args) != 0:
52
 
            raise UserError('Too many arguments.')
53
 
        return {}
54
 
 
55
 
    @classmethod
56
 
    def run_from_args(cls, command, cmd_args):
57
 
        parser = get_function_parser(command)
58
 
        options, args = parser.parse_args(cmd_args)
59
 
        kwargs = cls.parse_args(command, args)
60
 
        kwargs.update(options.__dict__)
61
 
        command(**kwargs)
62
 
 
63
 
    @classmethod
64
 
    def run_subcommand(cls, argv):
65
 
        if len(argv) < 1:
66
 
            raise UserError('Must supply a command: %s.' %
67
 
                            ', '.join(cls.commands.keys()))
68
 
        try:
69
 
            command = cls.commands[argv[0]]
70
 
        except KeyError:
71
 
            raise UserError('%s invalid.  Valid commands: %s.' %
72
 
                            (argv[0], ', '.join(cls.commands.keys())))
73
 
        cls.run_from_args(command, argv[1:])
 
50
def parse_args(command, args):
 
51
    """Return the positional arguments as a dict."""
 
52
    # TODO: implement!
 
53
    if len(args) != 0:
 
54
        raise UserError('Too many arguments.')
 
55
    return {}
 
56
 
 
57
 
 
58
def run_from_args(command, cmd_args):
 
59
    """Run a command function using the specified commandline arguments."""
 
60
    parser = get_function_parser(command)
 
61
    options, args = parser.parse_args(cmd_args)
 
62
    kwargs = parse_args(command, args)
 
63
    kwargs.update(options.__dict__)
 
64
    command(**kwargs)
 
65
 
 
66
 
 
67
def run_subcommand(subcommands, argv):
 
68
    """Run a subcommand as specified by argv."""
 
69
    if len(argv) < 1:
 
70
        raise UserError('Must supply a command: %s.' %
 
71
                        ', '.join(subcommands.keys()))
 
72
    try:
 
73
        command = subcommands[argv[0]]
 
74
    except KeyError:
 
75
        raise UserError('%s invalid.  Valid commands: %s.' %
 
76
                        (argv[0], ', '.join(subcommands.keys())))
 
77
    run_from_args(command, argv[1:])