environment.py 2.3 KB

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