fixbot/config.py
author Tero Marttila <terom@fixme.fi>
Thu, 04 Feb 2010 19:17:14 +0200
changeset 36 92c55179542a
child 38 66a42168c80b
permissions -rw-r--r--
support for reading .py config files
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
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    def _map_name (self, name) :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        return name.replace('_', '-')
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    def __getitem__ (self, name) :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
            Map from foo_bar -> foo-bar
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        """
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
        return self.opts[self._map_name(name)]
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
    def __setitem__ (self, name, value) :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
            Map from foo_bar -> foo-bar
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
        """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        store = self.opts
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
        # filter out certain keys
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
        if name in self.IGNORED_NAMES :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
            # skip things like __doc__
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
            return
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
        # translate name
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        name = self._map_name(name)
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        if name in self.opts :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
            # normal long opt
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
            pass
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        else :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
            # fail
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
            raise NameError(name)
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
        # store
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
        store[name] = value
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
        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
    62
            self.defaults[name] = value
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
class ConfigOptions (usage.Options) :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        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
    67
    """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    def opt_config (self, path) :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
        """
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
            Read the given configuration file
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
        """
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
        # set up env for the config module
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
        globals = {}
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
        locals = ConfigMapper(self.opts, self.defaults)
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
        try :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
            # run config
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
            execfile(path, globals, locals)
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
        except :
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
            # XXX: raising a usage.error prints out --help
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
            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
    85
    
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    opt_c = opt_config
92c55179542a support for reading .py config files
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87