Example #1
0
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"
Example #2
0
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')
Example #3
0
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")
Example #4
0
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')
Example #5
0
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"
Example #6
0
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)
Example #7
0
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)