Chris@87: from __future__ import division, absolute_import, print_function Chris@87: Chris@87: import os Chris@87: from distutils.dist import Distribution Chris@87: Chris@87: __metaclass__ = type Chris@87: Chris@87: class EnvironmentConfig(object): Chris@87: def __init__(self, distutils_section='ALL', **kw): Chris@87: self._distutils_section = distutils_section Chris@87: self._conf_keys = kw Chris@87: self._conf = None Chris@87: self._hook_handler = None Chris@87: Chris@87: def dump_variable(self, name): Chris@87: conf_desc = self._conf_keys[name] Chris@87: hook, envvar, confvar, convert = conf_desc Chris@87: if not convert: Chris@87: convert = lambda x : x Chris@87: print('%s.%s:' % (self._distutils_section, name)) Chris@87: v = self._hook_handler(name, hook) Chris@87: print(' hook : %s' % (convert(v),)) Chris@87: if envvar: Chris@87: v = os.environ.get(envvar, None) Chris@87: print(' environ: %s' % (convert(v),)) Chris@87: if confvar and self._conf: Chris@87: v = self._conf.get(confvar, (None, None))[1] Chris@87: print(' config : %s' % (convert(v),)) Chris@87: Chris@87: def dump_variables(self): Chris@87: for name in self._conf_keys: Chris@87: self.dump_variable(name) Chris@87: Chris@87: def __getattr__(self, name): Chris@87: try: Chris@87: conf_desc = self._conf_keys[name] Chris@87: except KeyError: Chris@87: raise AttributeError(name) Chris@87: return self._get_var(name, conf_desc) Chris@87: Chris@87: def get(self, name, default=None): Chris@87: try: Chris@87: conf_desc = self._conf_keys[name] Chris@87: except KeyError: Chris@87: return default Chris@87: var = self._get_var(name, conf_desc) Chris@87: if var is None: Chris@87: var = default Chris@87: return var Chris@87: Chris@87: def _get_var(self, name, conf_desc): Chris@87: hook, envvar, confvar, convert = conf_desc Chris@87: var = self._hook_handler(name, hook) Chris@87: if envvar is not None: Chris@87: var = os.environ.get(envvar, var) Chris@87: if confvar is not None and self._conf: Chris@87: var = self._conf.get(confvar, (None, var))[1] Chris@87: if convert is not None: Chris@87: var = convert(var) Chris@87: return var Chris@87: Chris@87: def clone(self, hook_handler): Chris@87: ec = self.__class__(distutils_section=self._distutils_section, Chris@87: **self._conf_keys) Chris@87: ec._hook_handler = hook_handler Chris@87: return ec Chris@87: Chris@87: def use_distribution(self, dist): Chris@87: if isinstance(dist, Distribution): Chris@87: self._conf = dist.get_option_dict(self._distutils_section) Chris@87: else: Chris@87: self._conf = dist