def test_py_loader_from_file_dunder(clean_env, tmpdir): """Test load with dunder settings""" settings = LazySettings( DATABASES={ "default": { "NAME": "db", "ENGINE": "module.foo.engine", "ARGS": { "timeout": 30 }, "PORTS": [123, 456], } }) dummy_path = tmpdir.join("dummy_module.py") with open(str(dummy_path), "w", encoding=default_settings.ENCODING_FOR_DYNACONF) as f: f.write('F = "bar"') f.write("\n") f.write('COLORS__white__code = "#FFFFFF"') f.write("\n") f.write('DATABASES__default__ENGINE = "other.module"') load(settings, "dummy_module.py") os.remove("dummy_module.py") load(settings, "dummy_module.py") # will be ignored not found assert settings.get("F") == "bar" assert settings.COLORS == {"white": {"code": "#FFFFFF"}} assert settings.DATABASES.default.NAME == "db" assert settings.DATABASES.default.ENGINE == "other.module"
def test_py_loader(): settings = DynaconfDict(_no_project_root=True) with open('dummy_module.py', 'w') as f: f.write('FOO = "bar"') load(settings, 'dummy_module') os.remove('dummy_module.py') load(settings, 'dummy_module.py')
def test_py_loader_from_module(tmpdir): settings = DynaconfDict() dummy_folder = tmpdir.mkdir("dummy") dummy_folder.join("dummy_module.py").write('FOO = "bar"') dummy_folder.join("__init__.py").write('print("initing dummy...")') load(settings, "dummy.dummy_module") assert settings.exists("FOO")
def test_py_loader(): settings = DynaconfDict(_no_project_root=True) with io.open('dummy_module.py', 'w', encoding=default_settings.ENCODING_FOR_DYNACONF) as f: f.write('FOO = "bar"') load(settings, 'dummy_module') os.remove('dummy_module.py') load(settings, 'dummy_module.py')
def test_py_loader_from_file(tmpdir): settings = DynaconfDict() dummy_path = tmpdir.join("dummy_module.py") with open(str(dummy_path), "w", encoding=default_settings.ENCODING_FOR_DYNACONF) as f: f.write('FOO = "bar"') load(settings, "dummy_module.py") os.remove("dummy_module.py") load(settings, "dummy_module.py") # will be ignored not found assert settings.get("FOO") == "bar"
def settings_loader(obj, settings_module=None, env=None, silent=True, key=None, filename=None): """Loads from defined settings module :param obj: A dynaconf instance :param settings_module: A path or a list of paths e.g settings.toml :param env: Env to look for data defaults: development :param silent: Boolean to raise loading errors :param key: Load a single key if provided :param filename: optional filename to override the settings_module """ if filename is None: settings_module = settings_module or obj.settings_module if not settings_module: # pragma: no cover return files = ensure_a_list(settings_module) else: files = ensure_a_list(filename) files.extend(ensure_a_list(obj.get("SECRETS_FOR_DYNACONF", None))) found_files = [] modules_names = [] for item in files: if item.endswith(ct.ALL_EXTENSIONS + (".py", )): p_root = obj._root_path or (os.path.dirname(found_files[0]) if found_files else None) found = obj.find_file(item, project_root=p_root) if found: found_files.append(found) else: # a bare python module name w/o extension modules_names.append(item) enabled_core_loaders = obj.get("CORE_LOADERS_FOR_DYNACONF") for mod_file in modules_names + found_files: # can be set to multiple files settings.py,settings.yaml,... # Cascade all loaders loaders = [ { "ext": ct.YAML_EXTENSIONS, "name": "YAML", "loader": yaml_loader }, { "ext": ct.TOML_EXTENSIONS, "name": "TOML", "loader": toml_loader }, { "ext": ct.INI_EXTENSIONS, "name": "INI", "loader": ini_loader }, { "ext": ct.JSON_EXTENSIONS, "name": "JSON", "loader": json_loader }, ] for loader in loaders: if loader["name"] not in enabled_core_loaders: continue if mod_file.endswith(loader["ext"]): loader["loader"].load(obj, filename=mod_file, env=env, silent=silent, key=key) continue if mod_file.endswith(ct.ALL_EXTENSIONS): continue if "PY" not in enabled_core_loaders: # pyloader is disabled continue # must be Python file or module # load from default defined module settings.py or .secrets.py if exists py_loader.load(obj, mod_file, key=key) # load from the current env e.g: development_settings.py env = env or obj.current_env if mod_file.endswith(".py"): if ".secrets.py" == mod_file: tmpl = ".{0}_{1}{2}" mod_file = "secrets.py" else: tmpl = "{0}_{1}{2}" dirname = os.path.dirname(mod_file) filename, extension = os.path.splitext(os.path.basename(mod_file)) new_filename = tmpl.format(env.lower(), filename, extension) env_mod_file = os.path.join(dirname, new_filename) global_filename = tmpl.format("global", filename, extension) global_mod_file = os.path.join(dirname, global_filename) else: env_mod_file = "{0}_{1}".format(env.lower(), mod_file) global_mod_file = "{0}_{1}".format("global", mod_file) py_loader.load( obj, env_mod_file, identifier="py_{0}".format(env.upper()), silent=True, key=key, ) # load from global_settings.py py_loader.load(obj, global_mod_file, identifier="py_global", silent=True, key=key)
def settings_loader(obj, settings_module=None, env=None, silent=True, key=None, filename=None): """Loads from defined settings module :param obj: A dynaconf instance :param settings_module: A path or a list of paths e.g settings.toml :param env: Env to look for data defaults: development :param silent: Boolean to raise loading errors :param key: Load a single key if provided :param filename: optional filename to override the settings_module """ settings_module = settings_module or obj.settings_module if not settings_module: # pragma: no cover return if not isinstance(settings_module, (list, tuple)): files = settings_module.split(',') else: files = [settings_module] obj.logger.debug("Looking for %s", files) if filename is not None: files.append(filename) found_files = [] modules_names = [] for item in files: if item.endswith(ct.ALL_EXTENSIONS + ('.py', )): found = find_file(item) if found: found_files.append(found) else: # a bare python module name w/o extension modules_names.append(item) obj.logger.debug("Found files %s", found_files) for mod_file in (modules_names + found_files): # can be set to multiple files settings.py,settings.yaml,... # Cascade all loaders loaders = [ { 'ext': ct.YAML_EXTENSIONS, 'name': 'YAML', 'loader': yaml_loader }, { 'ext': ct.TOML_EXTENSIONS, 'name': 'TOML', 'loader': toml_loader }, { 'ext': ct.INI_EXTENSIONS, 'name': 'INI', 'loader': ini_loader }, { 'ext': ct.JSON_EXTENSIONS, 'name': 'JSON', 'loader': json_loader }, ] for loader in loaders: if mod_file.endswith(loader['ext']): loader['loader'].load(obj, filename=mod_file, env=env, silent=silent, key=key) continue if mod_file.endswith(ct.ALL_EXTENSIONS): continue # must be Python file or module # load from default defined module settings.py or .secrets.py if exists py_loader.load(obj, mod_file, key=key) # load from the current env e.g: development_settings.py env = env or obj.current_env if mod_file.endswith('.py'): if '.secrets.py' == mod_file: tmpl = ".{0}_{1}{2}" mod_file = 'secrets.py' else: tmpl = "{0}_{1}{2}" dirname = os.path.dirname(mod_file) filename, extension = os.path.splitext(os.path.basename(mod_file)) new_filename = tmpl.format(env.lower(), filename, extension) env_mod_file = os.path.join(dirname, new_filename) global_filename = tmpl.format('global', filename, extension) global_mod_file = os.path.join(dirname, global_filename) else: env_mod_file = "{0}_{1}".format(env.lower(), mod_file) global_mod_file = "{0}_{1}".format('global', mod_file) py_loader.load(obj, env_mod_file, identifier='py_{0}'.format(env.upper()), silent=True, key=key) # load from global_settings.py py_loader.load(obj, global_mod_file, identifier='py_global', silent=True, key=key)