FreshPixels commited on
Commit
66a185a
·
verified ·
1 Parent(s): c9ad95b

Create core/config/settings.py

Browse files
Files changed (1) hide show
  1. core/config/settings.py +63 -0
core/config/settings.py ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import functools
4
+ from typing import Literal
5
+
6
+ from pydantic import Field
7
+ from pydantic_settings import BaseSettings, SettingsConfigDict
8
+
9
+
10
+ class Settings(BaseSettings):
11
+ """Application settings loaded from environment variables.
12
+
13
+ Required variables must be present at startup.
14
+ Optional variables have sensible defaults.
15
+ No .env files are used — all values come from os.environ.
16
+ """
17
+
18
+ model_config = SettingsConfigDict(
19
+ env_file="",
20
+ env_file_encoding="utf-8",
21
+ case_sensitive=True,
22
+ extra="ignore",
23
+ )
24
+
25
+ BOT_TOKEN: str | None = None
26
+ OPENAI_API_KEY: str | None = None
27
+ ADMIN_ID: str | None = None
28
+
29
+ ADMIN_USERNAME: str = ""
30
+ PORT: int = Field(default=7860, ge=1, le=65535)
31
+ SUPPORT_API_KEY: str = ""
32
+ YOOKASSA_SECRET_KEY: str = ""
33
+ YOOKASSA_SHOP_ID: str = ""
34
+ DATABASE_URL: str = ""
35
+ TELEGRAM_API_SERVER: str = "https://api.telegram.org"
36
+ WEBHOOK_URL: str = ""
37
+ DEFAULT_PROVIDER: Literal["openai", "claude", "gemini", "glm", "qwen"] = "openai"
38
+ LOG_LEVEL: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] = "INFO"
39
+ LOG_FORMAT: Literal["json", "console"] = "json"
40
+
41
+ @property
42
+ def required_fields(self) -> dict[str, str | None]:
43
+ """Return mapping of required field names to their current values."""
44
+ return {
45
+ "BOT_TOKEN": self.BOT_TOKEN,
46
+ "OPENAI_API_KEY": self.OPENAI_API_KEY,
47
+ "ADMIN_ID": self.ADMIN_ID,
48
+ }
49
+
50
+
51
+ @functools.lru_cache(maxsize=1)
52
+ def get_settings() -> Settings:
53
+ """Return the cached Settings singleton.
54
+
55
+ Lazy initialization — Settings() is created only on the first call,
56
+ not at import time. This avoids import-time side effects and allows
57
+ test fixtures to override environment variables before the first call.
58
+
59
+ To reset the cache in tests, call:
60
+ get_settings.cache_clear()
61
+ """
62
+ return Settings()
63
+