|
|
|
|
@ -9,6 +9,12 @@ from dotenv import load_dotenv
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BASE_DIR = Path(os.getenv("ITI_BASE_DIR", Path.cwd())).resolve()
|
|
|
|
|
SUPPORTED_DATABASE_DIALECTS = {"mysql", "postgresql"}
|
|
|
|
|
_DATABASE_DIALECT_ALIASES = {
|
|
|
|
|
"mysql": "mysql",
|
|
|
|
|
"postgres": "postgresql",
|
|
|
|
|
"postgresql": "postgresql",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_env_name(default: str = "dev") -> str:
|
|
|
|
|
@ -33,6 +39,20 @@ def env_bool(key: str, default: bool = False) -> bool:
|
|
|
|
|
return value.lower() in {"1", "true", "yes", "on"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def normalize_database_dialect(dialect: str) -> str:
|
|
|
|
|
normalized = _DATABASE_DIALECT_ALIASES.get(dialect.strip().lower())
|
|
|
|
|
if normalized is None:
|
|
|
|
|
supported = ", ".join(sorted(SUPPORTED_DATABASE_DIALECTS))
|
|
|
|
|
raise ValueError(f"unsupported database dialect: {dialect!r}, supported: {supported}")
|
|
|
|
|
return normalized
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_database_dialect(default: str = "mysql") -> str:
|
|
|
|
|
return normalize_database_dialect(
|
|
|
|
|
os.getenv("DATABASE_DIALECT") or os.getenv("DB_DIALECT") or default
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def default_mysql_url(database: str) -> str:
|
|
|
|
|
return (
|
|
|
|
|
f"mysql+pymysql://{os.getenv('MYSQL_USER', 'root')}:"
|
|
|
|
|
@ -42,6 +62,22 @@ def default_mysql_url(database: str) -> str:
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def default_postgresql_url(database: str) -> str:
|
|
|
|
|
return (
|
|
|
|
|
f"postgresql+psycopg://{os.getenv('POSTGRES_USER', 'postgres')}:"
|
|
|
|
|
f"{os.getenv('POSTGRES_PASSWORD', 'password')}@"
|
|
|
|
|
f"{os.getenv('POSTGRES_HOST', '127.0.0.1')}:"
|
|
|
|
|
f"{os.getenv('POSTGRES_PORT', '5432')}/{database}"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def default_database_url(database: str, dialect: str | None = None) -> str:
|
|
|
|
|
dialect = normalize_database_dialect(dialect) if dialect else get_database_dialect()
|
|
|
|
|
if dialect == "postgresql":
|
|
|
|
|
return default_postgresql_url(os.getenv("POSTGRES_DB", database))
|
|
|
|
|
return default_mysql_url(os.getenv("MYSQL_DATABASE", database))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
load_env_file()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -65,7 +101,7 @@ class BaseConfig:
|
|
|
|
|
|
|
|
|
|
database_url: str = field(
|
|
|
|
|
default_factory=lambda: os.getenv(
|
|
|
|
|
"DATABASE_URL", default_mysql_url(os.getenv("MYSQL_DATABASE", "iti_dev"))
|
|
|
|
|
"DATABASE_URL", default_database_url("iti_dev")
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
sqlalchemy_echo: bool = False
|
|
|
|
|
@ -131,7 +167,7 @@ class DevConfig(BaseConfig):
|
|
|
|
|
debug=True,
|
|
|
|
|
database_url=os.getenv(
|
|
|
|
|
"DATABASE_URL",
|
|
|
|
|
default_mysql_url(os.getenv("MYSQL_DATABASE", "iti_dev")),
|
|
|
|
|
default_database_url("iti_dev"),
|
|
|
|
|
),
|
|
|
|
|
sqlalchemy_echo=env_bool("SQLALCHEMY_ECHO", False),
|
|
|
|
|
jwt_access_token_expires_seconds=24 * 3600,
|
|
|
|
|
@ -147,7 +183,7 @@ class TestConfig(BaseConfig):
|
|
|
|
|
testing=True,
|
|
|
|
|
database_url=os.getenv(
|
|
|
|
|
"DATABASE_URL",
|
|
|
|
|
default_mysql_url(os.getenv("MYSQL_DATABASE", "iti_test")),
|
|
|
|
|
default_database_url("iti_test"),
|
|
|
|
|
),
|
|
|
|
|
ratelimit_enabled=False,
|
|
|
|
|
log_file_enabled=False,
|
|
|
|
|
@ -162,7 +198,7 @@ class ProdConfig(BaseConfig):
|
|
|
|
|
debug=False,
|
|
|
|
|
database_url=os.getenv(
|
|
|
|
|
"DATABASE_URL",
|
|
|
|
|
default_mysql_url(os.getenv("MYSQL_DATABASE", "iti_prod")),
|
|
|
|
|
default_database_url("iti_prod"),
|
|
|
|
|
),
|
|
|
|
|
secret_key=os.getenv("SECRET_KEY", ""),
|
|
|
|
|
jwt_secret_key=os.getenv("JWT_SECRET_KEY", ""),
|
|
|
|
|
|