| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 | from __future__ import absolute_importfrom __future__ import unicode_literalsimport loggingfrom string import Templateimport sixfrom .errors import ConfigurationErrorlog = logging.getLogger(__name__)def interpolate_environment_variables(config, section, environment):    def process_item(name, config_dict):        return dict(            (key, interpolate_value(name, key, val, section, environment))            for key, val in (config_dict or {}).items()        )    return dict(        (name, process_item(name, config_dict or {}))        for name, config_dict in config.items()    )def interpolate_value(name, config_key, value, section, mapping):    try:        return recursive_interpolate(value, mapping)    except InvalidInterpolation as e:        raise ConfigurationError(            'Invalid interpolation format for "{config_key}" option '            'in {section} "{name}": "{string}"'.format(                config_key=config_key,                name=name,                section=section,                string=e.string))def recursive_interpolate(obj, mapping):    if isinstance(obj, six.string_types):        return interpolate(obj, mapping)    elif isinstance(obj, dict):        return dict(            (key, recursive_interpolate(val, mapping))            for (key, val) in obj.items()        )    elif isinstance(obj, list):        return [recursive_interpolate(val, mapping) for val in obj]    else:        return objdef interpolate(string, mapping):    try:        return Template(string).substitute(mapping)    except ValueError:        raise InvalidInterpolation(string)class InvalidInterpolation(Exception):    def __init__(self, string):        self.string = string
 |