]> andersk Git - sql.git/blob - lib/python/mitsql/config.py
implemented base interface
[sql.git] / lib / python / mitsql / config.py
1 """
2 Global configuration objects.
3
4 Joe Presbrey  <presbrey@mit.edu>
5 """
6
7 from ConfigParser import ConfigParser, NoSectionError, NoOptionError
8 import os
9
10 _ENV_BASE='_SQL_MIT_EDU'
11
12 class Section(object):
13     """Configuration section namespace."""
14     def __init__(self, d):
15         self.items = d
16
17     def __getattr__(self, k):
18         v = self.items.get(k, None)
19         try:
20             if str(int(v)) == str(v): v = int(v)
21         except TypeError: pass
22         except ValueError: pass
23         try:
24             if str(v).lower() == 'true': v = True
25             if str(v).lower() == 'false': v = False
26         except TypeError: pass
27         except ValueError: pass
28         return v
29
30     def __iter__(self):
31         return iter(self.items)
32
33     def __str__(self):
34         return str(self.items)
35
36 class Config(object):
37     """Base configuration namespace."""
38     def __init__(self, filename, *args, **kwargs):
39         self._cp = ConfigParser(*args, **kwargs)
40         self.read(filename)
41         self._none = Section({})
42     
43     def _samefile(self, f1, f2):
44         try:
45             return os.path.samefile(f1, f2)
46         except OSError, e:
47             return False
48     
49     def read(self, filename):
50         config_path = [os.path.join(x, filename) for x in [
51             os.path.dirname(__file__),
52             '/etc']]
53         if _ENV_BASE in os.environ:
54             config_path.insert(1, os.path.join(os.environ[_ENV_BASE], 'etc', filename))
55         def append(path):
56             r = os.path.join(path, filename)
57             if not r in config_path:
58                 config_path.append(r)
59         if 'HOME' in os.environ:
60             append(os.environ['HOME'])
61         if 'PWD' in os.environ:
62             append(os.environ['PWD'])
63         self._cp.read(config_path)
64         self._sections = dict(map(lambda x: (x, Section(dict(self._cp.items(x)))),
65                                   self._cp.sections()))
66     
67     def get(self, *av, **kw):
68         try: return self._cp.get(*av, **kw)
69         except NoSectionError: return None
70         except NoOptionError: return None
71     
72     def __getattr__(self, k):
73         return self._sections.get(k, self._none)
74     
75     def __str__(self):
76         d = {}
77         for x in self._cp.sections():
78             d[x] = dict(self._cp.items(x))
79         return str(d)
80
81 if __name__ == '__main__':
82     import mitsql
83     print mitsql.config
This page took 0.037464 seconds and 5 git commands to generate.