Skip to content

refactor: centralize deployment settings in top-level config.py (pydantic-settings) #343

Description

@as535364

What to build

單一 PR 將散落各處的環境變數讀取統整為頂層 config.py 的 pydantic-settings Settings(即時單例,import 即驗證),部署設定自此「啟動時一次載入並驗證」。此票 block Normal-OJ/Normal-OJ#61(PR #341 將 rebase 其上)。

決策已定案如下:

  • 頂層 config.pysettings = Settings() 即時單例;新依賴 pydantic-settings
  • 行為凍結:所有欄位維持現行預設/Optional 語意;唯一啟動 raise 是現行 setup_smtp() 的 cross-field 規則(SMTP_SERVER 有設但 SMTP_NOREPLY 未設),搬進 model_validator 後 setup_smtp() 移除
  • 搬遷清單:MINIO_*mongo/config.py,搬完刪檔)、MONGO_HOSTmongo/engine.py)、JWT_*mongo/user.py)、TESTINGREDIS_*mongo/utils.py)、SUBMISSION_TMP_DIRmongo/submission.py)、SMTP_*model/utils/smtp.pyapp.py
  • 僅有的兩個刻意行為變更(PR 描述須明講):
    1. SUBMISSION_TMP_DIR 預設值改 tempfile.mkdtemp()——現值 TemporaryDirectory(...).name 未留物件引用,GC 時目錄被刪;順修 noj-submisisons typo
    2. FLASK_DEBUG 改名 DEBUG——外部已零設定點,唯一消費者是 mongo/utils.py 的 MinIO secure=
  • 測試配套:runtime 改 os.environ 的測試(conftesttest_smtptest_mongo_utilstest_target_sandbox)改用 monkeypatch.setattr(settings, ...)
  • 不做:JWT_SECRET 等安全 tightening(另議)

Acceptance criteria

  • 上列 env 讀取全部經由 config.settings;舊讀取點與 mongo/config.py 刪除
  • poetry run pytest 全綠、yapf diff 乾淨
  • 啟動時 SMTP_SERVER 有設而 SMTP_NOREPLY 未設 → 啟動失敗;其餘缺省不擋啟動(與現行一致)
  • PR 描述列明上述兩個刻意行為變更

Blocked by

None — can start immediately.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions