Skip to content

Commit

Permalink
Add support for config aliases (#332)
Browse files Browse the repository at this point in the history
All _FOR_DYNACONF can now be aliased when passing to LazySettings.
  • Loading branch information
rochacbruno committed May 5, 2020
1 parent 2041fa8 commit 7bb19e0
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 22 deletions.
21 changes: 19 additions & 2 deletions dynaconf/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ class LazySettings(LazyObject):
in a file `proj/conf.py`::
>>> from dynaconf import LazySettings
>>> config = LazySettings(ENV_FOR_DYNACONF='PROJ',
... LOADERS_FOR_DYNACONF=[
>>> config = LazySettings(ENV='PROJ',
... LOADERS=[
... 'dynaconf.loaders.env_loader',
... 'dynaconf.loaders.redis_loader'
... ])
Expand Down Expand Up @@ -87,10 +87,27 @@ def __init__(self, **kwargs):
:param kwargs: values that overrides default_settings
"""
self.resolve_config_aliases(kwargs)
compat_kwargs(kwargs)
self._kwargs = kwargs
super(LazySettings, self).__init__()

def resolve_config_aliases(self, kwargs):
"""takes aliases for _FOR_DYNACONF configurations
e.g: ROOT_PATH='/' is transformed into `ROOT_PATH_FOR_DYNACONF`
"""
for_dynaconf_keys = {
key
for key in dir(default_settings)
if key.endswith("_FOR_DYNACONF")
}
aliases = {
key for key in kwargs if f"{key}_FOR_DYNACONF" in for_dynaconf_keys
}
for alias in aliases:
kwargs[f"{alias}_FOR_DYNACONF"] = kwargs.pop(alias)

@evaluate_lazy_format
def __getattr__(self, name):
"""Allow getting keys from self.store using dot notation"""
Expand Down
15 changes: 5 additions & 10 deletions dynaconf/contrib/django_dynaconf/dynaconf_django_conf.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# WARNING: THIS EXTENSION IS DEPRECATED
# WARNING: THIS EXTENSION IS DEPRECATED in favor of django_dynaconf_v2
# Read more on how to integrate with django on
# https://dynaconf.readthedocs.io/en/latest/guides/django.html
import os
Expand All @@ -7,20 +7,15 @@

from dynaconf import LazySettings


dj = {}

for key in dir(django_settings):
if key.isupper() and key != "SETTINGS_MODULE":
dj[key] = getattr(django_settings, key, None)
dj["ORIGINAL_SETTINGS_MODULE"] = django_settings.SETTINGS_MODULE


dj.setdefault("ENVVAR_PREFIX_FOR_DYNACONF", "DJANGO")

env_prefix = f"{dj['ENVVAR_PREFIX_FOR_DYNACONF']}_ENV" # DJANGO_ENV

dj.setdefault(
"ENV_FOR_DYNACONF", os.environ.get(env_prefix, "DEVELOPMENT").upper()
)
dj.setdefault("ENVVAR_PREFIX", "DJANGO")
env_prefix = f"{dj['ENVVAR_PREFIX']}_ENV" # DJANGO_ENV
dj.setdefault("ENV", os.environ.get(env_prefix, "DEVELOPMENT").upper())

settings = LazySettings(**dj)
12 changes: 5 additions & 7 deletions dynaconf/contrib/flask_dynaconf.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ class FlaskDynaconf(object):
app = Flask(__name__)
FlaskDynaconf(
app,
ENV_FOR_DYNACONF='MYSITE',
SETTINGS_FILE_FOR_DYNACONF='settings.yml',
ENV='MYSITE',
SETTINGS_FILE='settings.yml',
EXTRA_VALUE='You can add aditional config vars here'
)
Expand All @@ -87,11 +87,9 @@ def __init__(
)
self.kwargs = kwargs

kwargs.setdefault("ENVVAR_PREFIX_FOR_DYNACONF", "FLASK")

env_prefix = f"{kwargs['ENVVAR_PREFIX_FOR_DYNACONF']}_ENV" # FLASK_ENV

kwargs.setdefault("ENV_SWITCHER_FOR_DYNACONF", env_prefix)
kwargs.setdefault("ENVVAR_PREFIX", "FLASK")
env_prefix = f"{kwargs['ENVVAR_PREFIX']}_ENV" # FLASK_ENV
kwargs.setdefault("ENV_SWITCHER", env_prefix)

self.dynaconf_instance = dynaconf_instance
self.instance_relative_config = instance_relative_config
Expand Down
4 changes: 2 additions & 2 deletions example/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@


settings = LazySettings(
NAMESPACE_FOR_DYNACONF="FOO",
NAMESPACE="FOO",
SETTINGS_MODULE="foo.py",
PROJECT_ROOT_FOR_DYNACONF="/tmp",
PROJECT_ROOT="/tmp",
DYNACONF_SILENT_ERRORS=True,
DYNACONF_ALWAYS_FRESH_VARS=["BAR"],
)
Expand Down
2 changes: 1 addition & 1 deletion example/validators/with_python/conf.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from dynaconf import LazySettings
from dynaconf import Validator

settings = LazySettings(ENV_FOR_DYNACONF="EXAMPLE")
settings = LazySettings(ENV="EXAMPLE")

settings.validators.register(
Validator("VERSION", "AGE", "NAME", must_exist=True),
Expand Down
35 changes: 35 additions & 0 deletions tests/test_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -739,3 +739,38 @@ def test_preload(tmpdir):
"github": "rochacbruno.github.io",
"mastodon": "mastodon.social/@rochacbruno",
}


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"

0 comments on commit 7bb19e0

Please sign in to comment.