def import_from_filename(filename, silent=False): # pragma: no cover """If settings_module is a filename path import it.""" if not filename.endswith('.py'): filename = '{0}.py'.format(filename) if filename in default_settings.SETTINGS_MODULE_FOR_DYNACONF: silent = True mod = types.ModuleType(filename.rstrip('.py')) mod.__file__ = filename mod._is_error = False try: with io.open( find_file(filename), encoding=default_settings.ENCODING_FOR_DYNACONF ) as config_file: exec( compile(config_file.read(), filename, 'exec'), mod.__dict__ ) except IOError as e: e.strerror = ( 'py_loader: error loading file (%s %s)\n' ) % (e.strerror, filename) if silent and e.errno in (errno.ENOENT, errno.EISDIR): return raw_logger().debug(e.strerror) mod._is_error = True return mod
def import_from_filename(obj, filename, silent=False): # pragma: no cover """If settings_module is a filename path import it.""" if filename in [item.filename for item in inspect.stack()]: raise ImportError( "Looks like you are loading dynaconf " f"from inside the {filename} file and then it is trying " "to load itself entering in a circular reference " "problem. To solve it you have to " "invoke your program from another root folder " "or rename your program file.") _find_file = getattr(obj, "find_file", find_file) if not filename.endswith(".py"): filename = f"{filename}.py" if filename in default_settings.SETTINGS_FILE_FOR_DYNACONF: silent = True mod = types.ModuleType(filename.rstrip(".py")) mod.__file__ = filename mod._is_error = False try: with io.open( _find_file(filename), encoding=default_settings.ENCODING_FOR_DYNACONF, ) as config_file: exec(compile(config_file.read(), filename, "exec"), mod.__dict__) except IOError as e: e.strerror = (f"py_loader: error loading file " f"({e.strerror} {filename})\n") if silent and e.errno in (errno.ENOENT, errno.EISDIR): return raw_logger().debug(e.strerror) mod._is_error = True return mod
def start_dotenv(obj=None, root_path=None): # load_from_dotenv_if_installed obj = obj or {} _find_file = getattr(obj, "find_file", find_file) root_path = ( root_path or getattr(obj, "_root_path", None) or get("ROOT_PATH_FOR_DYNACONF") ) raw_logger().debug( "Starting Dynaconf Dotenv %s", "for {0}".format(root_path) if root_path else "Base", ) dotenv_path = ( obj.get("DOTENV_PATH_FOR_DYNACONF") or get("DOTENV_PATH_FOR_DYNACONF") or _find_file(".env", project_root=root_path) ) load_dotenv( dotenv_path, verbose=obj.get("DOTENV_VERBOSE_FOR_DYNACONF", False), override=obj.get("DOTENV_OVERRIDE_FOR_DYNACONF", False), ) warn_deprecations(os.environ)
def get_module(obj, filename, silent=False): logger = raw_logger() try: logger.debug("Trying to import %s", filename) mod = importlib.import_module(filename) loaded_from = "module" except (ImportError, TypeError): logger.debug("Cant import %s trying to load from file", filename) mod = import_from_filename(obj, filename, silent=silent) if mod and not mod._is_error: loaded_from = "filename" else: loaded_from = None return mod, loaded_from
def get_module(obj, filename, silent=False): logger = raw_logger() try: logger.debug(f"Trying to import {filename}") mod = importlib.import_module(filename) loaded_from = "module" except (ImportError, TypeError): logger.debug(f"Cant import {filename} trying to load from file") mod = import_from_filename(obj, filename, silent=silent) if mod and not mod._is_error: loaded_from = "filename" else: # it is important to return None in case of not loaded loaded_from = None return mod, loaded_from
def logger(self): # pragma: no cover """Get or create inner logger""" return raw_logger()
import io import os from dynaconf.utils import ensure_a_list from dynaconf.utils import raw_logger logger = raw_logger() class BaseLoader(object): """Base loader for dynaconf source files. :param obj: {[LazySettings]} -- [Dynaconf settings] :param env: {[string]} -- [the current env to be loaded defaults to [development]] :param identifier: {[string]} -- [identifier ini, yaml, json, py, toml] :param extensions: {[list]} -- [List of extensions with dots ['.a', '.b']] :param file_reader: {[callable]} -- [reads file return dict] :param string_reader: {[callable]} -- [reads string return dict] """ def __init__(self, obj, env, identifier, extensions, file_reader, string_reader): """Instantiates a loader for different sources""" self.obj = obj self.env = env or obj.current_env self.identifier = identifier self.extensions = extensions self.file_reader = file_reader self.string_reader = string_reader @staticmethod