You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
3.0 KiB
89 lines
3.0 KiB
5 months ago
|
import os
|
||
|
from distutils.dist import Distribution
|
||
|
|
||
|
__metaclass__ = type
|
||
|
|
||
|
class EnvironmentConfig:
|
||
|
def __init__(self, distutils_section='ALL', **kw):
|
||
|
self._distutils_section = distutils_section
|
||
|
self._conf_keys = kw
|
||
|
self._conf = None
|
||
|
self._hook_handler = None
|
||
|
|
||
|
def dump_variable(self, name):
|
||
|
conf_desc = self._conf_keys[name]
|
||
|
hook, envvar, confvar, convert, append = conf_desc
|
||
|
if not convert:
|
||
|
convert = lambda x : x
|
||
|
print('%s.%s:' % (self._distutils_section, name))
|
||
|
v = self._hook_handler(name, hook)
|
||
|
print(' hook : %s' % (convert(v),))
|
||
|
if envvar:
|
||
|
v = os.environ.get(envvar, None)
|
||
|
print(' environ: %s' % (convert(v),))
|
||
|
if confvar and self._conf:
|
||
|
v = self._conf.get(confvar, (None, None))[1]
|
||
|
print(' config : %s' % (convert(v),))
|
||
|
|
||
|
def dump_variables(self):
|
||
|
for name in self._conf_keys:
|
||
|
self.dump_variable(name)
|
||
|
|
||
|
def __getattr__(self, name):
|
||
|
try:
|
||
|
conf_desc = self._conf_keys[name]
|
||
|
except KeyError:
|
||
|
raise AttributeError(
|
||
|
f"'EnvironmentConfig' object has no attribute '{name}'"
|
||
|
) from None
|
||
|
|
||
|
return self._get_var(name, conf_desc)
|
||
|
|
||
|
def get(self, name, default=None):
|
||
|
try:
|
||
|
conf_desc = self._conf_keys[name]
|
||
|
except KeyError:
|
||
|
return default
|
||
|
var = self._get_var(name, conf_desc)
|
||
|
if var is None:
|
||
|
var = default
|
||
|
return var
|
||
|
|
||
|
def _get_var(self, name, conf_desc):
|
||
|
hook, envvar, confvar, convert, append = conf_desc
|
||
|
if convert is None:
|
||
|
convert = lambda x: x
|
||
|
var = self._hook_handler(name, hook)
|
||
|
if envvar is not None:
|
||
|
envvar_contents = os.environ.get(envvar)
|
||
|
if envvar_contents is not None:
|
||
|
envvar_contents = convert(envvar_contents)
|
||
|
if var and append:
|
||
|
if os.environ.get('NPY_DISTUTILS_APPEND_FLAGS', '1') == '1':
|
||
|
var.extend(envvar_contents)
|
||
|
else:
|
||
|
# NPY_DISTUTILS_APPEND_FLAGS was explicitly set to 0
|
||
|
# to keep old (overwrite flags rather than append to
|
||
|
# them) behavior
|
||
|
var = envvar_contents
|
||
|
else:
|
||
|
var = envvar_contents
|
||
|
if confvar is not None and self._conf:
|
||
|
if confvar in self._conf:
|
||
|
source, confvar_contents = self._conf[confvar]
|
||
|
var = convert(confvar_contents)
|
||
|
return var
|
||
|
|
||
|
|
||
|
def clone(self, hook_handler):
|
||
|
ec = self.__class__(distutils_section=self._distutils_section,
|
||
|
**self._conf_keys)
|
||
|
ec._hook_handler = hook_handler
|
||
|
return ec
|
||
|
|
||
|
def use_distribution(self, dist):
|
||
|
if isinstance(dist, Distribution):
|
||
|
self._conf = dist.get_option_dict(self._distutils_section)
|
||
|
else:
|
||
|
self._conf = dist
|