Example #1
0
def test_read_from_vault_kv2_with_different_environments(docker_vault):
    os.environ["VAULT_ENABLED_FOR_DYNACONF"] = "1"
    os.environ["VAULT_KV_VERSION_FOR_DYNACONF"] = "2"
    os.environ["VAULT_TOKEN_FOR_DYNACONF"] = "myroot"
    settings = LazySettings(environments=["dev", "prod"])
    for env in ["default", "dev", "prod"]:
        with settings.using_env(env):
            write(settings, {"SECRET": f"vault_works_in_{env}"})
    load(settings)
    assert settings.secret == "vault_works_in_default"
    assert settings.from_env("dev").secret == "vault_works_in_dev"
    assert settings.from_env("prod").secret == "vault_works_in_prod"
Example #2
0
def test_should_NOT_duplicate_when_explicit_set(tmpdir):
    """Issue #653"""
    settings_file_yaml = """
    default:
      SCRIPTS:
        - "script1.sh"
        - "script2.sh"
        - "script3.sh"
    other:
      SCRIPTS:
        - "script4.sh"
        - "script1.sh"
        - "dynaconf_merge_unique"  # NO DUPLICATE
    """
    tmpdir.join("settings.yaml").write(settings_file_yaml)
    settings = LazySettings(environments=True,
                            settings_files=["settings.yaml"])
    assert settings.SCRIPTS == [
        "script1.sh",
        "script2.sh",
        "script3.sh",
    ]

    other_settings = settings.from_env("other")
    assert other_settings.SCRIPTS == [
        "script2.sh",
        "script3.sh",
        "script4.sh",
        "script1.sh",
        # merge_unique does not duplicate, but overrides the order
    ]
Example #3
0
def test_should_duplicate_when_explicit_set(tmpdir):
    """Issue #653"""
    settings_file_yaml = """
    default:
      SCRIPTS:
        - "script1.sh"
        - "script2.sh"
        - "script3.sh"
    other:
      SCRIPTS:
        - "script4.sh"
        - "script1.sh"
        - "dynaconf_merge"
    """
    tmpdir.join("settings.yaml").write(settings_file_yaml)
    settings = LazySettings(environments=True,
                            settings_files=["settings.yaml"])
    assert settings.SCRIPTS == [
        "script1.sh",
        "script2.sh",
        "script3.sh",
    ]

    other_settings = settings.from_env("other")
    assert other_settings.SCRIPTS == [
        "script1.sh",
        "script2.sh",
        "script3.sh",
        "script4.sh",
        "script1.sh",  # explicit wants to duplicate
    ]
Example #4
0
def test_should_not_merge_if_merge_is_not_explicit_set(tmpdir):
    """Should not merge if merge is not explicit set."""
    settings_file_yaml = """
    default:
      SOME_KEY: "value"
      SOME_LIST:
        - "item_1"
        - "item_2"
        - "item_3"
    other:
      SOME_KEY: "new_value"
      SOME_LIST:
        - "item_4"
        - "item_5"
    """
    tmpdir.join("settings.yaml").write(settings_file_yaml)
    settings = LazySettings(
        environments=True,
        settings_files=["settings.yaml"],
    )
    settings.reload()
    assert settings.SOME_KEY == "value"
    assert settings.SOME_LIST == ["item_1", "item_2", "item_3"]

    other_settings = settings.from_env("other")
    assert other_settings.SOME_KEY == "new_value"
    assert other_settings.SOME_LIST == ["item_4", "item_5"]
Example #5
0
def test_from_env_method_with_prefix(clean_env, tmpdir):
    data = {
        "default": {
            "prefix_a_default": "From default env"
        },
        "development": {
            "prefix_value": "From development env",
            "prefix_only_in_development": True,
        },
        "other": {
            "prefix_value": "From other env",
            "prefix_only_in_other": True,
            "not_prefixed": "no prefix",
        },
    }
    toml_path = str(tmpdir.join("base_settings.toml"))
    toml_loader.write(toml_path, data, merge=False)
    settings = LazySettings(
        settings_file=toml_path,
        environments=True,
        filter_strategy=PrefixFilter("prefix"),
    )
    settings.set("ARBITRARY_KEY", "arbitrary value")

    assert settings.VALUE == "From development env"
    assert settings.A_DEFAULT == "From default env"
    assert settings.ONLY_IN_DEVELOPMENT is True
    assert settings.ARBITRARY_KEY == "arbitrary value"
    assert settings.get("ONLY_IN_OTHER") is None

    # clone the settings object pointing to a new env
    other_settings = settings.from_env("other")
    assert other_settings.VALUE == "From other env"
    assert other_settings.A_DEFAULT == "From default env"
    assert other_settings.ONLY_IN_OTHER is True
    assert other_settings.get("ARBITRARY_KEY") is None
    assert other_settings.get("ONLY_IN_DEVELOPMENT") is None
    with pytest.raises(AttributeError):
        other_settings.not_prefixed
    with pytest.raises(AttributeError):
        # values set programatically are not cloned
        other_settings.ARBITRARY_KEY
    with pytest.raises(AttributeError):
        # values set only in a specific env not cloned
        other_settings.ONLY_IN_DEVELOPMENT
    # assert it is cached not created twice
    assert other_settings is settings.from_env("other")
Example #6
0
def test_should_not_duplicate_with_global_merge(tmpdir):
    """Assert merge unique in a first level. Issue #653"""
    settings_file_yaml = """
    default:
      SOME_KEY: "value"
      SOME_LIST:
        - "item_1"
        - "item_2"
        - "item_3"
    other:
      SOME_KEY: "new_value"
      SOME_LIST:
        - "item_4"
        - "item_5"
    even_other:
      SOME_KEY: "new_value_2"
      SOME_LIST:
        - "item_6"
        - "item_7"
    """
    tmpdir.join("settings.yaml").write(settings_file_yaml)
    settings = LazySettings(environments=True,
                            settings_files=["settings.yaml"],
                            merge_enabled=True)
    # settings.reload()
    assert settings.SOME_KEY == "value"
    assert settings.SOME_LIST == ["item_1", "item_2", "item_3"]

    other_settings = settings.from_env("other")
    assert other_settings.SOME_KEY == "new_value"
    assert other_settings.SOME_LIST == [
        "item_1",
        "item_2",
        "item_3",
        "item_4",
        "item_5",
    ]
Example #7
0
def test_from_env_method(clean_env, tmpdir):
    data = {
        "default": {
            "a_default": "From default env"
        },
        "development": {
            "value": "From development env",
            "only_in_development": True,
        },
        "other": {
            "value": "From other env",
            "only_in_other": True
        },
    }
    toml_path = str(tmpdir.join("base_settings.toml"))
    toml_loader.write(toml_path, data, merge=False)
    settings = LazySettings(settings_file=toml_path, environments=True)
    settings.set("ARBITRARY_KEY", "arbitrary value")

    assert settings.VALUE == "From development env"
    assert settings.A_DEFAULT == "From default env"
    assert settings.ONLY_IN_DEVELOPMENT is True
    assert settings.ARBITRARY_KEY == "arbitrary value"
    assert settings.get("ONLY_IN_OTHER") is None

    # clone the settings object pointing to a new env
    other_settings = settings.from_env("other")
    assert other_settings.VALUE == "From other env"
    assert other_settings.A_DEFAULT == "From default env"
    assert other_settings.ONLY_IN_OTHER is True
    assert other_settings.get("ARBITRARY_KEY") is None
    assert other_settings.get("ONLY_IN_DEVELOPMENT") is None
    with pytest.raises(AttributeError):
        # values set programatically are not cloned
        other_settings.ARBITRARY_KEY
    with pytest.raises(AttributeError):
        # values set only in a specific env not cloned
        other_settings.ONLY_IN_DEVELOPMENT
    # assert it is cached not created twice
    assert other_settings is settings.from_env("other")

    # Now the same using keep=True
    other_settings = settings.from_env("other", keep=True)
    assert other_settings.VALUE == "From other env"
    assert other_settings.A_DEFAULT == "From default env"
    assert other_settings.ONLY_IN_OTHER is True
    assert other_settings.ONLY_IN_DEVELOPMENT is True
    assert settings.ARBITRARY_KEY == "arbitrary value"

    # assert it is created not cached
    assert other_settings is not settings.from_env("other")

    # settings remains the same
    assert settings.VALUE == "From development env"
    assert settings.A_DEFAULT == "From default env"
    assert settings.ONLY_IN_DEVELOPMENT is True
    assert settings.ARBITRARY_KEY == "arbitrary value"
    assert settings.get("ONLY_IN_OTHER") is None

    # additional kwargs
    data = {
        "default": {
            "a_default": "From default env"
        },
        "production": {
            "value": "From prod env",
            "only_in_prod": True
        },
        "other": {
            "value": "From other env",
            "only_in_other": True
        },
    }
    toml_path = str(tmpdir.join("other_settings.toml"))
    toml_loader.write(toml_path, data, merge=False)

    new_other_settings = other_settings.from_env(
        "production", keep=True, SETTINGS_FILE_FOR_DYNACONF=toml_path)

    # production values
    assert new_other_settings.VALUE == "From prod env"
    assert new_other_settings.ONLY_IN_PROD is True
    # keep=True values
    assert new_other_settings.ONLY_IN_OTHER is True
    assert new_other_settings.ONLY_IN_DEVELOPMENT is True
    assert settings.A_DEFAULT == "From default env"
Example #8
0
print(settings.PASSWORD)

assertions = {
    "SERVER": "fromenv.com",
    "USERNAME": "******",
    "PASSWORD": "******",
}

for key, value in assertions.items():
    found = settings.get(key)
    assert found == getattr(settings, key)
    assert found == value, f"expected: {key}: [{value}] found: [{found}]"

assertions = {"SERVER": "fromenv.com", "USERNAME": "******"}

for key, value in assertions.items():
    found = settings.from_env("development").get(key)
    assert found == getattr(settings.from_env("development"), key)
    assert found == value, f"expected: {key}: [{value}] found: [{found}]"

assertions = {
    "SERVER": "fromenv.com",
    "USERNAME": "******",
    "PASSWORD": "******",  # keep=True will keep it from [example] env
}

for key, value in assertions.items():
    found = settings.from_env("development", keep=True).get(key)
    assert found == getattr(settings.from_env("development", keep=True), key)
    assert found == value, f"expected: {key}: [{value}] found: [{found}]"