def test_set_new_merge_issue_241_4(tmpdir): data = { "name": "Bruno", "colors": ["red", "green"], "data": { "links": { "twitter": "rochacbruno", "site": "brunorocha.org" } }, } toml_loader.write(str(tmpdir.join("settings.toml")), data, merge=False) data = {"data__links__telegram": "t.me/rochacbruno"} toml_loader.write(str(tmpdir.join("settings.local.toml")), data, merge=False) settings = LazySettings(settings_file="settings.toml") assert settings.NAME == "Bruno" assert settings.COLORS == ["red", "green"] assert settings.DATA.links == { "twitter": "rochacbruno", "site": "brunorocha.org", "telegram": "t.me/rochacbruno", }
def test_set_new_merge_issue_241_3(tmpdir): data = { "name": "Bruno", "colors": ["red", "green"], "data": { "links": { "twitter": "rochacbruno", "site": "brunorocha.org" } }, } toml_loader.write(str(tmpdir.join("settings.toml")), data, merge=False) data = { "name": "Tommy Shelby", "colors": { "dynaconf_merge": ["yellow", "pink"] }, "data": { "links": { "site": "pb.com" } }, } toml_loader.write(str(tmpdir.join("settings.local.toml")), data, merge=False) settings = LazySettings(settings_file="settings.toml") assert settings.NAME == "Tommy Shelby" assert settings.COLORS == ["red", "green", "yellow", "pink"] assert settings.DATA.links == {"site": "pb.com"}
def test_set_new_merge_issue_241_2(tmpdir): data = { "default": { "name": "Bruno", "colors": ["red", "green"], "data": { "links": {"twitter": "rochacbruno", "site": "brunorocha.org"} }, } } toml_loader.write(str(tmpdir.join("settings.toml")), data, merge=False) data = { "dynaconf_merge": True, "default": { "colors": ["blue"], "data": {"links": {"github": "rochacbruno.github.io"}}, }, } toml_loader.write( str(tmpdir.join("settings.local.toml")), data, merge=False ) settings = LazySettings() assert settings.NAME == "Bruno" assert settings.COLORS == ["red", "green", "blue"] assert settings.DATA.links == { "twitter": "rochacbruno", "site": "brunorocha.org", "github": "rochacbruno.github.io", }
def test_config_aliases(tmpdir): data = { "hello": {"name": "Bruno", "passwd": 1234}, "awesome": {"passwd": 5678}, } toml_loader.write(str(tmpdir.join("blarg.toml")), data, merge=False) settings = LazySettings( ENVVAR_PREFIX="BRUCE", CORE_LOADERS=["TOML"], LOADERS=["dynaconf.loaders.env_loader"], DEFAULT_ENV="hello", ENV_SWITCHER="BRUCE_ENV", PRELOAD=[], SETTINGS_FILE=["blarg.toml"], INCLUDES=[], ENV="awesome", ) assert settings.NAME == "Bruno" assert settings.PASSWD == 5678 assert settings.ENVVAR_PREFIX_FOR_DYNACONF == "BRUCE" assert settings.CORE_LOADERS_FOR_DYNACONF == ["TOML"] assert settings.LOADERS_FOR_DYNACONF == ["dynaconf.loaders.env_loader"] assert len(settings._loaders) == 1 assert settings.DEFAULT_ENV_FOR_DYNACONF == "hello" assert settings.ENV_SWITCHER_FOR_DYNACONF == "BRUCE_ENV" assert settings.PRELOAD_FOR_DYNACONF == [] assert settings.SETTINGS_FILE_FOR_DYNACONF == ["blarg.toml"] assert settings.INCLUDES_FOR_DYNACONF == [] assert settings.ENV_FOR_DYNACONF == "awesome" assert settings.current_env == "awesome"
def test_set_new_merge_issue_241_5(tmpdir): data = { "default": { "name": "Bruno", "colors": ["red", "green"], "data": { "links": { "twitter": "rochacbruno", "site": "brunorocha.org" } }, } } toml_loader.write(str(tmpdir.join("settings.toml")), data, merge=False) data = {"default": {"colors": "@merge ['blue']"}} toml_loader.write(str(tmpdir.join("settings.local.toml")), data, merge=False) settings = LazySettings(environments=True, settings_file="settings.toml") assert settings.NAME == "Bruno" assert settings.COLORS == ["red", "green", "blue"] assert settings.DATA.links == { "twitter": "rochacbruno", "site": "brunorocha.org", }
def test_lowercase_read_mode(tmpdir): data = { "foo": "bar", "hello": "world", "default": 1, "databases": { "default": { "port": 8080 } }, } toml_loader.write(str(tmpdir.join("settings.toml")), data) settings = LazySettings(ENVLESS_MODE=True, lowercase_read=True) assert settings.FOO == "bar" assert settings.foo == "bar" assert settings.HELLO == "world" assert settings.hello == "world" assert settings.DEFAULT == 1 assert settings.default == 1 assert settings.DATABASES.default.port == 8080 assert settings.databases.default.port == 8080 assert "foo" in settings assert "FOO" in settings # test __dir__ results = dir(settings) assert "foo" in results assert "FOO" in results results = dir(settings.databases) assert "default" in results assert "DEFAULT" in results
def test_lowercase_read_mode(tmpdir): """ Starting on 3.0.0 lowercase keys are enabled by default """ data = { "foo": "bar", "hello": "world", "default": 1, "databases": {"default": {"port": 8080}}, } toml_loader.write(str(tmpdir.join("settings.toml")), data) # settings_files mispelled.. should be `settings_file` settings = LazySettings(settings_files="settings.toml") assert settings.FOO == "bar" assert settings.foo == "bar" assert settings.HELLO == "world" assert settings.hello == "world" assert settings.DEFAULT == 1 assert settings.default == 1 assert settings.DATABASES.default.port == 8080 assert settings.databases.default.port == 8080 assert "foo" in settings assert "FOO" in settings # test __dir__ results = dir(settings) assert "foo" in results assert "FOO" in results results = dir(settings.databases) assert "default" in results assert "DEFAULT" in results
def test_config_aliases(tmpdir): data = { "hello": {"name": "Bruno", "passwd": 1234}, "awesome": {"passwd": 5678}, } toml_loader.write(str(tmpdir.join("blarg.toml")), data, merge=False) settings = LazySettings( envvar_prefix="BRUCE", core_loaders=["TOML"], loaders=["dynaconf.loaders.env_loader"], default_env="hello", env_switcher="BRUCE_ENV", prelaod=[], settings_file=["blarg.toml"], includes=[], ENV="awesome", environments=True, ) assert settings.NAME == "Bruno" assert settings.PASSWD == 5678 assert settings.ENVVAR_PREFIX_FOR_DYNACONF == "BRUCE" assert settings.CORE_LOADERS_FOR_DYNACONF == ["TOML"] assert settings.LOADERS_FOR_DYNACONF == ["dynaconf.loaders.env_loader"] assert len(settings._loaders) == 1 assert settings.DEFAULT_ENV_FOR_DYNACONF == "hello" assert settings.ENV_SWITCHER_FOR_DYNACONF == "BRUCE_ENV" assert settings.PRELOAD_FOR_DYNACONF == [] assert settings.SETTINGS_FILE_FOR_DYNACONF == ["blarg.toml"] assert settings.INCLUDES_FOR_DYNACONF == [] assert settings.ENV_FOR_DYNACONF == "awesome" assert settings.current_env == "awesome"
def test_set_explicit_merge_token(tmpdir): data = { "default": { "a_list": [1, 2], "b_list": [1], "a_dict": { "name": "Bruno" }, } } toml_loader.write(str(tmpdir.join("settings.toml")), data, merge=False) settings = LazySettings() assert settings.A_LIST == [1, 2] assert settings.B_LIST == [1] assert settings.A_DICT == {"name": "Bruno"} assert settings.A_DICT.name == "Bruno" settings.set("a_list", [3], merge=True) assert settings.A_LIST == [1, 2, 3] settings.set("b_list", "@merge [2]") assert settings.B_LIST == [1, 2] settings.set("b_list", "@merge [3, 4]") assert settings.B_LIST == [1, 2, 3, 4] settings.set("b_list", "@merge 5") assert settings.B_LIST == [1, 2, 3, 4, 5] settings.set("b_list", "@merge 6.6") assert settings.B_LIST == [1, 2, 3, 4, 5, 6.6] settings.set("b_list", "@merge false") assert settings.B_LIST == [1, 2, 3, 4, 5, 6.6, False] settings.set("b_list", "@merge foo,bar") assert settings.B_LIST == [1, 2, 3, 4, 5, 6.6, False, "foo", "bar"] settings.set("b_list", "@merge zaz") assert settings.B_LIST == [1, 2, 3, 4, 5, 6.6, False, "foo", "bar", "zaz"] settings.set("a_dict", "@merge {city='Guarulhos'}") assert settings.A_DICT.name == "Bruno" assert settings.A_DICT.city == "Guarulhos" settings.set("a_dict", "@merge country=Brasil") assert settings.A_DICT.name == "Bruno" assert settings.A_DICT.city == "Guarulhos" assert settings.A_DICT.country == "Brasil" settings.set("new_key", "@merge foo=bar") assert settings.NEW_KEY == {"foo": "bar"}
def test_envless_mode(tmpdir): data = { "foo": "bar", "hello": "world", "default": 1, "databases": {"default": {"port": 8080}}, } toml_loader.write(str(tmpdir.join("settings.toml")), data) settings = LazySettings( settings_file="settings.toml" ) # already the default assert settings.FOO == "bar" assert settings.HELLO == "world" assert settings.DEFAULT == 1 assert settings.DATABASES.default.port == 8080
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_envless_mode_with_prefix(tmpdir): data = { "prefix_foo": "bar", "hello": "world", "prefix_default": 1, "prefix_databases": {"default": {"port": 8080}}, } toml_loader.write(str(tmpdir.join("settings.toml")), data) settings = LazySettings( settings_file="settings.toml", filter_strategy=PrefixFilter("prefix") ) # already the default assert settings.FOO == "bar" with pytest.raises(AttributeError): settings.HELLO assert settings.DEFAULT == 1 assert settings.DATABASES.default.port == 8080
def config(key: str, value: Optional[str] = None) -> None: """ Manage thoth configuration options. """ key = key.lower() if not settings.exists(key): console.print(f"The key {key} is invalid.") elif value is None: console.print(settings.get(key)) else: if key == "default_channel" and value not in settings.channels: console.print( f"Invalid channel. Pick one from {settings.channels}") else: CONFIG_FILE.parent.mkdir(parents=True, exist_ok=True) toml_loader.write(CONFIG_FILE, {key: value}, merge=True)
def test_settings_dict_like_iteration(tmpdir): """Settings can be iterated just like a dict""" data = { "foo": "bar", "hello": "world", "default": 1, "databases": {"default": {"port": 8080}}, } toml_loader.write(str(tmpdir.join("settings.toml")), data) # settings_files mispelled.. should be `settings_file` settings = LazySettings(settings_files="settings.toml") for key in settings: assert key in settings._store for key, value in settings.items(): assert settings._store[key] == value
def test_preload(tmpdir): data = { "data": {"links": {"twitter": "rochacbruno", "site": "brunorocha.org"}} } toml_loader.write(str(tmpdir.join("preload.toml")), data, merge=False) data = { "dynaconf_merge": True, "data": {"links": {"github": "rochacbruno.github.io"}}, } toml_loader.write( str(tmpdir.join("main_settings.toml")), data, merge=False ) data = { "dynaconf_merge": True, "data": {"links": {"mastodon": "mastodon.social/@rochacbruno"}}, } toml_loader.write(str(tmpdir.join("included.toml")), data, merge=False) settings = LazySettings( PRELOAD_FOR_DYNACONF=["preload.toml"], SETTINGS_FILE_FOR_DYNACONF="main_settings.toml", INCLUDES_FOR_DYNACONF=["included.toml"], ) assert settings.DATA.links == { "twitter": "rochacbruno", "site": "brunorocha.org", "github": "rochacbruno.github.io", "mastodon": "mastodon.social/@rochacbruno", }
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"
from __future__ import annotations from dynaconf import settings from dynaconf.loaders.toml_loader import write # Get the potato original = str(settings.POTATO) # str() to force a copy modern = "Modern Potato" print("Original data:", original) assert settings.POTATO == settings.get("potato") == original # Change the Toml file print("Change POTATO to `Modern Potato` in settings.toml file...") write(settings.path_for("settings.toml"), {"default": {"potato": modern}}) # Print the original print("Dynaconf knows:", settings.POTATO) assert settings.POTATO == settings.get("potato") == original # Get it freshly print("Read it freshly to get changed value...") print("Changed data:", settings.get_fresh("POTATO")) assert settings.POTATO == settings.get_fresh("potato") == modern # Get it again print("Now read again without the get_fresh method") print("Still the new value no?", settings.POTATO) assert settings.POTATO == settings.get("potato") == modern # Restore it write(settings.path_for("settings.toml"), {"default": {"potato": original}})