1TRUE_VALS = set(['1', 't', 'true', 'on', 'yes', 'y'])
2__unittest = True
3
4
5class Config(object):
6
7    """Configuration for a plugin or other entities.
8
9    Encapsulates configuration for a single plugin or other element.
10    Corresponds to a :class:`ConfigParser.Section` but provides an
11    extended interface for extracting items as a certain type.
12
13    """
14
15    def __init__(self, items):
16        self._items = items
17        self._mvd = {}
18        for k, v in items:
19            self._mvd.setdefault(k, []).append(v)
20
21    def __getitem__(self, key):
22        return self._mvd[key]
23
24    def as_bool(self, key, default=None):
25        """Get key value as boolean
26
27        1, t, true, on, yes and y (case insensitive) are accepted as ``True``
28        values. All other values are ``False``.
29
30        """
31        try:
32            val = self._mvd[key][0].strip()
33        except KeyError:
34            return default
35        except IndexError:
36            # setting = -> False
37            return False
38        return val.lower() in TRUE_VALS
39
40    def as_int(self, key, default=None):
41        """Get key value as integer"""
42        return self._cast(key, int, default)
43
44    def as_float(self, key, default=None):
45        """Get key value as float"""
46        return self._cast(key, float, default)
47
48    def as_str(self, key, default=None):
49        """Get key value as str"""
50        return self._cast(key, str, default)
51
52    def as_list(self, key, default=None):
53        """Get key value as list.
54
55        The value is split into lines and returned as a list. Lines
56        are stripped of whitespace, and lines beginning with # are
57        skipped.
58
59        """
60        lines = []
61        try:
62            vlist = self[key]
63        except KeyError:
64            return default
65        for val in vlist:
66            lines.extend(
67                line.strip() for line in val.splitlines()
68                if line.strip() and not line.strip().startswith('#'))
69        return lines
70
71    def get(self, key, default=None):
72        """Get key value"""
73        return self.as_str(key, default)
74
75    def _cast(self, key, type_, default):
76        try:
77            return type_(self._mvd[key][0].strip())
78        except (KeyError, IndexError):
79            return default
80