pycolib/configparser.py
author Radek Brich <brich.radek@ifortuna.cz>
Fri, 16 Aug 2013 13:23:49 +0200
changeset 7 776ba4914dfc
parent 4 fdaa7dc9035e
child 12 d5f749032fa1
permissions -rw-r--r--
Update ConfigParser: rename 'type_' back to 'type'. Rename project in setup.py to make RPM package names more standard.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
     1
# simple config file parser utilizing Python's exec() builtin
3
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     2
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     3
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     4
class ConfigParserError(Exception):
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     5
    pass
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     6
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     7
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     8
class ConfigParser:
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     9
    def __init__(self):
4
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    10
        self.options = {}
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    11
        self.values = {}
3
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    12
7
776ba4914dfc Update ConfigParser: rename 'type_' back to 'type'. Rename project in setup.py to make RPM package names more standard.
Radek Brich <brich.radek@ifortuna.cz>
parents: 4
diff changeset
    13
    def add_option(self, name, type=str, default=None):
4
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    14
        """Register option name, type and default value."""
7
776ba4914dfc Update ConfigParser: rename 'type_' back to 'type'. Rename project in setup.py to make RPM package names more standard.
Radek Brich <brich.radek@ifortuna.cz>
parents: 4
diff changeset
    15
        self.options[name] = {'type':type, 'default':default}
4
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    16
        self.values[name] = default
3
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    17
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    18
    def load(self, fname):
4
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    19
        """Read config file and check loaded values."""
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    20
        self.read(fname)
3
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    21
        self.check()
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    22
4
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    23
    def read(self, fname):
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    24
        """Read config file. Does not check values."""
3
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    25
        with open(fname) as f:
4
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    26
            exec(f.read(), self.values)
3
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    27
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    28
    def check(self):
4
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    29
        """Check option values against registered types."""
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    30
        for key in self.values.keys():
3
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    31
            if key == '__builtins__':
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    32
                continue
4
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    33
            if key in self.options:
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    34
                type_ = self.options[key]['type']
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    35
                if not isinstance(self.values[key], type_) and not self.values[key] is None:
3
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    36
                    raise ConfigParserError("Bad value of config parameter '%s': type is %s but should be %s"
4
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    37
                        % (key, type(self.values[key]), type_))
3
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    38
            else:
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    39
                raise ConfigParserError("Unknown config parameter '%s'." % key)
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    40
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    41
    def __getattr__(self, name):
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    42
        """Attribute access for config parameters.
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    43
4
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    44
        cfg.my_param <===> cfg.values['myparam']
3
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    45
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    46
        """
4
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    47
        if name in self.values:
fdaa7dc9035e Refactor.
Radek Brich <radek.brich@devl.cz>
parents: 3
diff changeset
    48
            return self.values[name]
3
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    49
        else:
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    50
            raise AttributeError()
cc27136cdead Add ConfigParser and tests.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    51