~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 19:19:42 UTC
  • mto: This revision was merged to the branch mainline in revision 13619.
  • Revision ID: aaron@canonical.com-20110804191942-6a008gyqjfvu8722
Use inspection to determine default arguments.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
import optparse
 
1
import inspect
2
2
 
3
3
 
4
4
class UserError(Exception):
5
5
    pass
6
6
 
7
7
 
8
 
class OptionParser(optparse.OptionParser):
9
 
 
10
 
    UNSPECIFIED = object()
11
 
 
12
 
    def add_option(self, *args, **kwargs):
13
 
        """Add an option, with the default that it not be included."""
14
 
        kwargs['default'] = kwargs.get('default', self.UNSPECIFIED)
15
 
        optparse.OptionParser.add_option(self, *args, **kwargs)
16
 
 
17
 
    def parse_args_dict(self, cmd_args):
18
 
        """Return a dict of specified options.
19
 
 
20
 
        Unspecified options with no explicit default are not included in the
21
 
        dict."""
22
 
        options, args = self.parse_args(cmd_args)
23
 
        option_dict = dict(
24
 
            item for item in options.__dict__.items()
25
 
            if item[1] is not self.UNSPECIFIED)
26
 
        return args, option_dict
27
 
 
28
 
 
29
8
class Command:
30
9
    """Base class for subcommands."""
31
10
 
38
17
        return {}
39
18
 
40
19
    @classmethod
 
20
    def set_defaults(cls, parser):
 
21
        args, ignored, ignored, defaults = inspect.getargspec(cls.run)
 
22
        if defaults is None:
 
23
            return
 
24
        defaults_dict = dict(zip(args, defaults))
 
25
        option_defaults = dict(
 
26
            (key, value) for key, value in defaults_dict.items()
 
27
            if parser.defaults.get(key, '') is None)
 
28
        parser.set_defaults(**option_defaults)
 
29
 
 
30
    @classmethod
41
31
    def run_from_args(cls, cmd_args):
42
 
        args, kwargs = cls.get_parser().parse_args_dict(cmd_args)
43
 
        kwargs.update(cls.parse_args(args))
 
32
        parser = cls.get_parser()
 
33
        cls.set_defaults(parser)
 
34
        options, args = parser.parse_args(cmd_args)
 
35
        kwargs = cls.parse_args(args)
 
36
        kwargs.update(options.__dict__)
44
37
        cls.run(**kwargs)
45
38
 
46
39
    @classmethod