Settings done right
This commit is contained in:
@ -3,6 +3,7 @@
|
||||
Take note of the environment variable prefixes required for each
|
||||
settings class, except `AppSettings`.
|
||||
"""
|
||||
import sys
|
||||
from typing import Literal, Optional, Union
|
||||
|
||||
__all__ = [
|
||||
@ -17,10 +18,11 @@ __all__ = [
|
||||
from pydantic import Extra
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
from const import ROOT_DIR
|
||||
|
||||
|
||||
class BaseEnvSettings(BaseSettings):
|
||||
class Config:
|
||||
env_file = ".env"
|
||||
env_file_encoding = "utf-8"
|
||||
extra = Extra.ignore
|
||||
|
||||
@ -89,12 +91,7 @@ class TestingSettings(BaseEnvSettings):
|
||||
env_prefix = "TESTS_"
|
||||
case_sensitive = True
|
||||
|
||||
DB_HOST: str = "localhost"
|
||||
DB_PORT: int = 5432
|
||||
DB_TEMPLATE_NAME: str = "db-template-name"
|
||||
DB_NAME: str = "test_db-name"
|
||||
DB_USER: str = "db-user"
|
||||
DB_PASSWORD: str = "db-password"
|
||||
DROP_DATABASE_BEFORE_TESTS: bool = True
|
||||
DROP_DATABASE_AFTER_TESTS: bool = True
|
||||
|
||||
@ -117,11 +114,18 @@ class EmailSettings(BaseEnvSettings):
|
||||
case_sensitive = True
|
||||
|
||||
|
||||
# `.parse_obj()` thing is a workaround for pyright and pydantic interplay, see:
|
||||
# https://github.com/pydantic/pydantic/issues/3753#issuecomment-1087417884
|
||||
api = APISettings.parse_obj({})
|
||||
app = AppSettings.parse_obj({})
|
||||
db = DatabaseSettings.parse_obj({})
|
||||
openapi = OpenAPISettings.parse_obj({})
|
||||
server = ServerSettings.parse_obj({})
|
||||
testing = TestingSettings.parse_obj({})
|
||||
if "pytest" in sys.modules:
|
||||
env_file = ROOT_DIR / ".env.testing"
|
||||
else:
|
||||
env_file = ROOT_DIR / ".env"
|
||||
|
||||
params = {
|
||||
"_env_file": env_file,
|
||||
}
|
||||
|
||||
api = APISettings(**params)
|
||||
app = AppSettings(**params)
|
||||
db = DatabaseSettings(**params)
|
||||
openapi = OpenAPISettings(**params)
|
||||
server = ServerSettings(**params)
|
||||
testing = TestingSettings(**params)
|
||||
|
||||
@ -74,26 +74,15 @@ def create_db_engine(connection_settings: DBConnectionSettings) -> AsyncEngine:
|
||||
)
|
||||
|
||||
|
||||
if "pytest" in sys.modules:
|
||||
engine = create_db_engine(
|
||||
connection_settings=DBConnectionSettings(
|
||||
username=settings.testing.DB_USER,
|
||||
password=settings.testing.DB_PASSWORD,
|
||||
host=settings.testing.DB_HOST,
|
||||
port=settings.testing.DB_PORT,
|
||||
database=settings.testing.DB_NAME,
|
||||
)
|
||||
)
|
||||
else:
|
||||
engine = create_db_engine(
|
||||
connection_settings=DBConnectionSettings(
|
||||
username=settings.db.USER,
|
||||
password=settings.db.PASSWORD,
|
||||
host=settings.db.HOST,
|
||||
port=settings.db.PORT,
|
||||
database=settings.db.NAME,
|
||||
)
|
||||
engine = create_db_engine(
|
||||
connection_settings=DBConnectionSettings(
|
||||
username=settings.db.USER,
|
||||
password=settings.db.PASSWORD,
|
||||
host=settings.db.HOST,
|
||||
port=settings.db.PORT,
|
||||
database=settings.db.NAME,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
"""Configure via DatabaseSettings.
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from typing import Protocol
|
||||
from dataclasses import dataclass
|
||||
|
||||
import asyncpg
|
||||
import sqlalchemy
|
||||
@ -7,13 +7,14 @@ from asyncpg import Connection, DuplicateDatabaseError, InvalidCatalogNameError
|
||||
from migrate import DatabaseConfig, migrate
|
||||
|
||||
|
||||
class TestingSettingsInitOptions(Protocol):
|
||||
@dataclass
|
||||
class TestingSettingsInitOptions:
|
||||
DB_HOST: str
|
||||
DB_PORT: int
|
||||
DB_TEMPLATE_NAME: str
|
||||
DB_NAME: str
|
||||
DB_USER: str
|
||||
DB_PASSWORD: str
|
||||
DB_TEMPLATE_NAME: str
|
||||
DROP_DATABASE_BEFORE_TESTS: bool
|
||||
DROP_DATABASE_AFTER_TESTS: bool
|
||||
|
||||
|
||||
Reference in New Issue
Block a user