-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.py
More file actions
120 lines (87 loc) · 3.18 KB
/
config.py
File metadata and controls
120 lines (87 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# mypy: disable-error-code="unused-ignore"
# mypy conflicts with ty
import os
from pydantic import Field, HttpUrl
from pydantic_settings import BaseSettings, SettingsConfigDict
from src.system.domain.config import DomainConfigIf, EnvironmentEnum
from src.system.infrastructure.ext.logfire.config import LogfireConfigIf
from src.system.infrastructure.repository.sqlalchemy.config import SQLAlchemyConfigIf
from src.system.infrastructure.ext.sentry.config import SentryConfigIf
from src.system.ui.discord.config import DiscordConfigIf
class BaseConfig(
DomainConfigIf,
SQLAlchemyConfigIf,
DiscordConfigIf,
SentryConfigIf,
LogfireConfigIf,
BaseSettings,
):
model_config = SettingsConfigDict(
env_file="./env/test.env", env_file_encoding="utf-8", extra="allow", frozen=True
)
# domain
environment: EnvironmentEnum = EnvironmentEnum.TEST
@property
def ENVIRONMENT(self) -> EnvironmentEnum:
return self.environment
# SQLAlchemy
database_url: str = Field(alias="DATABASE_URL")
@property
def DATABASE_URL(self) -> str:
return self.database_url
# Discord
discord_token: str = Field(alias="DISCORD_TOKEN")
@property
def DISCORD_TOKEN(self) -> str:
return self.discord_token
# Sentry
sentry_dsn: HttpUrl = Field(
default=HttpUrl(
"https://18f318e974680126187592b8001394df@o4509562192330752.ingest.de.sentry.io/4510019968499792"
),
alias="SENTRY_DSN",
)
sentry_env: str | None = Field(default=None, alias="SENTRY_ENV")
@property
def SENTRY_DSN(self) -> str:
return str(self.sentry_dsn)
@property
def SENTRY_ENV(self) -> str:
if self.sentry_env:
return self.sentry_env
return self.ENVIRONMENT.name
# Logfire
logfire_write_token: str | None = Field(default=None, alias="LOGFIRE_WRITE_TOKEN")
@property
def LOGFIRE_WRITE_TOKEN(self) -> str | None:
return self.logfire_write_token
class TestConfig(BaseConfig):
model_config = SettingsConfigDict(
env_file="./env/test.env", env_file_encoding="utf-8"
)
environment: EnvironmentEnum = EnvironmentEnum.TEST
class DevelopConfig(BaseConfig):
model_config = SettingsConfigDict(
env_file="./env/local.env", env_file_encoding="utf-8"
)
environment: EnvironmentEnum = EnvironmentEnum.DEVELOPMENT
class ProductionConfig(BaseConfig):
model_config = SettingsConfigDict(
env_file="./env/local.env", env_file_encoding="utf-8"
)
environment: EnvironmentEnum = EnvironmentEnum.PRODUCTION
def get_config(environment: EnvironmentEnum) -> BaseConfig:
match environment:
case EnvironmentEnum.TEST:
return TestConfig() # type: ignore
case EnvironmentEnum.DEVELOPMENT:
return DevelopConfig() # type: ignore
case EnvironmentEnum.PRODUCTION:
return ProductionConfig() # type: ignore
def get_config_for_current_env() -> BaseConfig:
# noinspection SpellCheckingInspection
envvar = os.getenv("ENVIRONMENT")
env: EnvironmentEnum = EnvironmentEnum.TEST
if envvar is not None:
env = EnvironmentEnum(envvar)
return get_config(env)