Coverage for src / core / config.py: 100%
43 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 14:29 -0300
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 14:29 -0300
1"""Carrega configuracoes da aplicacao via Dynaconf."""
3from collections.abc import Mapping
4from functools import lru_cache
5from urllib.parse import quote_plus
7from dynaconf import Dynaconf
9SETTINGS_FILES = [
10 "settings.toml",
11 "settings.database.toml",
12 ".secrets.toml",
13 ".secrets.database.toml",
14]
17def _get_database_config(source) -> Mapping:
18 if isinstance(source, Mapping):
19 database = source.get("database", {})
20 else:
21 database = source.get("database", default={})
23 if isinstance(database, Mapping):
24 return database
25 return {}
28def _get_auth_config(source) -> Mapping:
29 if isinstance(source, Mapping):
30 auth = source.get("auth", {})
31 else:
32 auth = source.get("auth", default={})
34 if isinstance(auth, Mapping):
35 return auth
36 return {}
39def build_settings(env: str | None = None) -> Dynaconf:
40 """Cria objeto de configuracao com suporte a ambientes."""
41 settings = Dynaconf(
42 settings_files=SETTINGS_FILES,
43 envvar_prefix="FASTAPI_TPL",
44 environments=True,
45 load_dotenv=True,
46 )
47 if env:
48 settings.setenv(env)
49 return settings
52@lru_cache
53def get_settings() -> Dynaconf:
54 """Retorna configuracoes em cache para evitar recarga repetida."""
55 return build_settings()
58def get_database_url(settings_obj=None) -> str:
59 """Retorna URL do banco preferindo `database.url` se definida."""
60 current_settings = settings_obj or get_settings()
61 database_config = _get_database_config(current_settings)
63 explicit_url = database_config.get("url")
64 if explicit_url:
65 return str(explicit_url)
67 driver = database_config.get("driver", "postgresql+psycopg")
68 user = quote_plus(str(database_config.get("user", "")))
69 password = quote_plus(str(database_config.get("password", "")))
70 host = database_config.get("host", "localhost")
71 port = database_config.get("port", 5432)
72 database_name = database_config.get("name", "postgres")
74 return f"{driver}://{user}:{password}@{host}:{port}/{database_name}"
77def get_auth_config(settings_obj=None) -> Mapping:
78 """Retorna bloco de configuracao de autenticacao."""
79 current_settings = settings_obj or get_settings()
80 return _get_auth_config(current_settings)