fixbot/config.py
author Tero Marttila <terom@fixme.fi>
Fri, 05 Feb 2010 22:20:59 +0200
changeset 59 43806d334fb4
parent 38 66a42168c80b
permissions -rw-r--r--
prepend source name to output type
36
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Support for loading config files with twisted.python.usage
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
from twisted.python import usage
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
import traceback
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
class ConfigMapper (dict) :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
        Provides access to a usage.Options's keys via python names.
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    IGNORED_NAMES = ('__doc__', )
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    def __init__ (self, opts, defaults=None) :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
        """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
            opts        - store the values from the config file into the given dict
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
            defaults    - (optional) update any pre-exisitng values from the config file into the given dict
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
        self.opts = opts
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
        self.defaults = defaults
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
38
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    25
        # temp. vars
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    26
        self.locals = {}
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    27
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    28
    def optname (self, name) :
36
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        return name.replace('_', '-')
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    def __getitem__ (self, name) :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
        """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
            Map from foo_bar -> foo-bar
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
        """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
38
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    36
        # translate
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    37
        optname = self.optname(name)
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    38
        
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    39
        if optname in self.opts :
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    40
            # normal long opt
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    41
            return self.opts[optname]
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    42
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    43
        elif name in self.locals :
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    44
            # temp local
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    45
            return self.locals[name]
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    46
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    47
        else :
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    48
            # unknown
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    49
            raise NameError(name)
36
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    def __setitem__ (self, name, value) :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
            Map from foo_bar -> foo-bar
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
        store = self.opts
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
        
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        # filter out certain keys
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
        if name in self.IGNORED_NAMES :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
            # skip things like __doc__
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
            return
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
        # translate name
38
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    64
        optname = self.optname(name)
36
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
38
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    66
        if optname in self.opts :
36
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
            # normal long opt
38
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    68
            name = optname
36
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
        else :
38
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    71
            # store as a local
66a42168c80b allow config .py's to process their own locals
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    72
            store = self.locals
36
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
        
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        # store
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
        store[name] = value
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        if self.defaults is not None and name in self.defaults :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
            self.defaults[name] = value
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
class ConfigOptions (usage.Options) :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        Provide a --config param to read in new values/defaults for any defined options from the given config file
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    def opt_config (self, path) :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
        """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
            Read the given configuration file
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
        # set up env for the config module
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        globals = {}
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        locals = ConfigMapper(self.opts, self.defaults)
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
        try :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
            # run config
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
            execfile(path, globals, locals)
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
        except :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
            # XXX: raising a usage.error prints out --help
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
            raise usage.error("Error reading config file: %s\n%s" % (path, traceback.format_exc()))
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
    
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    opt_c = opt_config
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103