22
22
"""
23
23
24
24
import tomllib
25
+ from functools import cached_property
25
26
from pathlib import Path
26
27
from typing import Literal
27
28
28
- from pydantic import AnyHttpUrl , BaseSettings , EmailStr , PostgresDsn , validator
29
+ from pydantic import AnyHttpUrl , EmailStr , PostgresDsn , computed_field
30
+ from pydantic_settings import BaseSettings , SettingsConfigDict
29
31
30
32
PROJECT_DIR = Path (__file__ ).parent .parent .parent
31
33
with open (f"{ PROJECT_DIR } /pyproject.toml" , "rb" ) as f :
@@ -51,47 +53,51 @@ class Settings(BaseSettings):
51
53
DEFAULT_DATABASE_HOSTNAME : str
52
54
DEFAULT_DATABASE_USER : str
53
55
DEFAULT_DATABASE_PASSWORD : str
54
- DEFAULT_DATABASE_PORT : str
56
+ DEFAULT_DATABASE_PORT : int
55
57
DEFAULT_DATABASE_DB : str
56
- DEFAULT_SQLALCHEMY_DATABASE_URI : str = ""
57
58
58
59
# POSTGRESQL TEST DATABASE
59
60
TEST_DATABASE_HOSTNAME : str = "postgres"
60
61
TEST_DATABASE_USER : str = "postgres"
61
62
TEST_DATABASE_PASSWORD : str = "postgres"
62
- TEST_DATABASE_PORT : str = " 5432"
63
+ TEST_DATABASE_PORT : int = 5432
63
64
TEST_DATABASE_DB : str = "postgres"
64
- TEST_SQLALCHEMY_DATABASE_URI : str = ""
65
65
66
66
# FIRST SUPERUSER
67
67
FIRST_SUPERUSER_EMAIL : EmailStr
68
68
FIRST_SUPERUSER_PASSWORD : str
69
69
70
- @validator ("DEFAULT_SQLALCHEMY_DATABASE_URI" )
71
- def _assemble_default_db_connection (cls , v : str , values : dict [str , str ]) -> str :
72
- return PostgresDsn .build (
73
- scheme = "postgresql+asyncpg" ,
74
- user = values ["DEFAULT_DATABASE_USER" ],
75
- password = values ["DEFAULT_DATABASE_PASSWORD" ],
76
- host = values ["DEFAULT_DATABASE_HOSTNAME" ],
77
- port = values ["DEFAULT_DATABASE_PORT" ],
78
- path = f"/{ values ['DEFAULT_DATABASE_DB' ]} " ,
70
+ @computed_field
71
+ @cached_property
72
+ def DEFAULT_SQLALCHEMY_DATABASE_URI (self ) -> str :
73
+ return str (
74
+ PostgresDsn .build (
75
+ scheme = "postgresql+asyncpg" ,
76
+ username = self .DEFAULT_DATABASE_USER ,
77
+ password = self .DEFAULT_DATABASE_PASSWORD ,
78
+ host = self .DEFAULT_DATABASE_HOSTNAME ,
79
+ port = self .DEFAULT_DATABASE_PORT ,
80
+ path = self .DEFAULT_DATABASE_DB ,
81
+ )
79
82
)
80
83
81
- @validator ("TEST_SQLALCHEMY_DATABASE_URI" )
82
- def _assemble_test_db_connection (cls , v : str , values : dict [str , str ]) -> str :
83
- return PostgresDsn .build (
84
- scheme = "postgresql+asyncpg" ,
85
- user = values ["TEST_DATABASE_USER" ],
86
- password = values ["TEST_DATABASE_PASSWORD" ],
87
- host = values ["TEST_DATABASE_HOSTNAME" ],
88
- port = values ["TEST_DATABASE_PORT" ],
89
- path = f"/{ values ['TEST_DATABASE_DB' ]} " ,
84
+ @computed_field
85
+ @cached_property
86
+ def TEST_SQLALCHEMY_DATABASE_URI (self ) -> str :
87
+ return str (
88
+ PostgresDsn .build (
89
+ scheme = "postgresql+asyncpg" ,
90
+ username = self .TEST_DATABASE_USER ,
91
+ password = self .TEST_DATABASE_PASSWORD ,
92
+ host = self .TEST_DATABASE_HOSTNAME ,
93
+ port = self .TEST_DATABASE_PORT ,
94
+ path = self .TEST_DATABASE_DB ,
95
+ )
90
96
)
91
97
92
- class Config :
93
- env_file = f"{ PROJECT_DIR } /.env"
94
- case_sensitive = True
98
+ model_config = SettingsConfigDict (
99
+ env_file = f"{ PROJECT_DIR } /.env" , case_sensitive = True
100
+ )
95
101
96
102
97
103
settings : Settings = Settings () # type: ignore
0 commit comments