89 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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
 |