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

1"""Carrega configuracoes da aplicacao via Dynaconf.""" 

2 

3from collections.abc import Mapping 

4from functools import lru_cache 

5from urllib.parse import quote_plus 

6 

7from dynaconf import Dynaconf 

8 

9SETTINGS_FILES = [ 

10 "settings.toml", 

11 "settings.database.toml", 

12 ".secrets.toml", 

13 ".secrets.database.toml", 

14] 

15 

16 

17def _get_database_config(source) -> Mapping: 

18 if isinstance(source, Mapping): 

19 database = source.get("database", {}) 

20 else: 

21 database = source.get("database", default={}) 

22 

23 if isinstance(database, Mapping): 

24 return database 

25 return {} 

26 

27 

28def _get_auth_config(source) -> Mapping: 

29 if isinstance(source, Mapping): 

30 auth = source.get("auth", {}) 

31 else: 

32 auth = source.get("auth", default={}) 

33 

34 if isinstance(auth, Mapping): 

35 return auth 

36 return {} 

37 

38 

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 

50 

51 

52@lru_cache 

53def get_settings() -> Dynaconf: 

54 """Retorna configuracoes em cache para evitar recarga repetida.""" 

55 return build_settings() 

56 

57 

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) 

62 

63 explicit_url = database_config.get("url") 

64 if explicit_url: 

65 return str(explicit_url) 

66 

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") 

73 

74 return f"{driver}://{user}:{password}@{host}:{port}/{database_name}" 

75 

76 

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)