Chris@87
|
1 from __future__ import division, absolute_import, print_function
|
Chris@87
|
2
|
Chris@87
|
3 import os
|
Chris@87
|
4 from distutils.dist import Distribution
|
Chris@87
|
5
|
Chris@87
|
6 __metaclass__ = type
|
Chris@87
|
7
|
Chris@87
|
8 class EnvironmentConfig(object):
|
Chris@87
|
9 def __init__(self, distutils_section='ALL', **kw):
|
Chris@87
|
10 self._distutils_section = distutils_section
|
Chris@87
|
11 self._conf_keys = kw
|
Chris@87
|
12 self._conf = None
|
Chris@87
|
13 self._hook_handler = None
|
Chris@87
|
14
|
Chris@87
|
15 def dump_variable(self, name):
|
Chris@87
|
16 conf_desc = self._conf_keys[name]
|
Chris@87
|
17 hook, envvar, confvar, convert = conf_desc
|
Chris@87
|
18 if not convert:
|
Chris@87
|
19 convert = lambda x : x
|
Chris@87
|
20 print('%s.%s:' % (self._distutils_section, name))
|
Chris@87
|
21 v = self._hook_handler(name, hook)
|
Chris@87
|
22 print(' hook : %s' % (convert(v),))
|
Chris@87
|
23 if envvar:
|
Chris@87
|
24 v = os.environ.get(envvar, None)
|
Chris@87
|
25 print(' environ: %s' % (convert(v),))
|
Chris@87
|
26 if confvar and self._conf:
|
Chris@87
|
27 v = self._conf.get(confvar, (None, None))[1]
|
Chris@87
|
28 print(' config : %s' % (convert(v),))
|
Chris@87
|
29
|
Chris@87
|
30 def dump_variables(self):
|
Chris@87
|
31 for name in self._conf_keys:
|
Chris@87
|
32 self.dump_variable(name)
|
Chris@87
|
33
|
Chris@87
|
34 def __getattr__(self, name):
|
Chris@87
|
35 try:
|
Chris@87
|
36 conf_desc = self._conf_keys[name]
|
Chris@87
|
37 except KeyError:
|
Chris@87
|
38 raise AttributeError(name)
|
Chris@87
|
39 return self._get_var(name, conf_desc)
|
Chris@87
|
40
|
Chris@87
|
41 def get(self, name, default=None):
|
Chris@87
|
42 try:
|
Chris@87
|
43 conf_desc = self._conf_keys[name]
|
Chris@87
|
44 except KeyError:
|
Chris@87
|
45 return default
|
Chris@87
|
46 var = self._get_var(name, conf_desc)
|
Chris@87
|
47 if var is None:
|
Chris@87
|
48 var = default
|
Chris@87
|
49 return var
|
Chris@87
|
50
|
Chris@87
|
51 def _get_var(self, name, conf_desc):
|
Chris@87
|
52 hook, envvar, confvar, convert = conf_desc
|
Chris@87
|
53 var = self._hook_handler(name, hook)
|
Chris@87
|
54 if envvar is not None:
|
Chris@87
|
55 var = os.environ.get(envvar, var)
|
Chris@87
|
56 if confvar is not None and self._conf:
|
Chris@87
|
57 var = self._conf.get(confvar, (None, var))[1]
|
Chris@87
|
58 if convert is not None:
|
Chris@87
|
59 var = convert(var)
|
Chris@87
|
60 return var
|
Chris@87
|
61
|
Chris@87
|
62 def clone(self, hook_handler):
|
Chris@87
|
63 ec = self.__class__(distutils_section=self._distutils_section,
|
Chris@87
|
64 **self._conf_keys)
|
Chris@87
|
65 ec._hook_handler = hook_handler
|
Chris@87
|
66 return ec
|
Chris@87
|
67
|
Chris@87
|
68 def use_distribution(self, dist):
|
Chris@87
|
69 if isinstance(dist, Distribution):
|
Chris@87
|
70 self._conf = dist.get_option_dict(self._distutils_section)
|
Chris@87
|
71 else:
|
Chris@87
|
72 self._conf = dist
|