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"
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 ]
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 ]
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"]
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")
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", ]
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"
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}]"