# 直接依赖。全部是「>= 下限」约束 —— 注意服务器跑在 **Python 3.9**，
# pip 会自动退到「声明支持 3.9 的最高版本」：fastapi / uvicorn / python-multipart / pytest
# 的最新版都已要求 >=3.10，所以服务器上装到的会比开发机旧一档（这是 pip 的正常行为，不是错误）。
fastapi>=0.110
# 代码里有 8 个文件直接 `from pydantic import BaseModel`。
# 它本来是 fastapi 的传递依赖（装了 fastapi 就会有），所以一直没写进来；
# 2026-10-09 补上 —— 「直接 import 的就要直接声明」，否则 fastapi 哪天换掉它就会静默炸。
# 下限定 2.0：现有各环境实测都是 2.x，且 fastapi>=0.110 接受 <3。
pydantic>=2.0
uvicorn[standard]>=0.29
pymysql>=1.1
# ⚠️ Python 3.9 上 pytest / python-multipart 也会退版本，属正常。
# ⚠️ PyJWT：2026-10-09 全仓库扫描确认**没有任何地方 `import jwt`** ——
#    鉴权走的是 `auth_sessions` 里的 64 位 hex token，`config.JWT_*` 只是历史命名。
#    但 `python-multipart` 不一样：虽然我们也不 import 它，FastAPI 处理
#    `File(...)` / `Form(...)` 时**运行时需要它**，删了上传接口就 500，必须留着。
PyJWT>=2.8
httpx>=0.27
python-multipart>=0.0.9
pytest>=8.0
DBUtils>=3.0
# 2026-10-09 补记：`config.py` 一直在用 `from dotenv import load_dotenv`，
# 但这份清单里从来没有它 —— 服务器上是手工装的，没有记录。
# 换机器 / 重建 venv 时就会 ImportError，所以必须写进来。
python-dotenv>=1.0
# 打卡附件 / 头像写 OSS（2026-09-22 新增）。
# 纯 Python 包，但 PyPI 上只有 sdist（没有 wheel）→ 会走源码安装，不需要编译器。
# 它依赖的 `crcmod` 是 C 扩展，好在 setup.py **编译失败时会退回纯 Python 实现**，
# 所以没有编译器的机器也能装上（只是 CRC 校验慢一点）。
oss2>=2.17
