Files
dpb/backend/pyproject.toml
T
34047007@qq.com 0b50e0adfa checkpoint: SQLite 清理——业务/测试层统一 PostgreSQL(删 aiosqlite/fakeredis)
- setting: DATABASE_TYPE 收窄为 postgres,DB_URI/ASYNC_DB_URI 去 sqlite 分支
- database: create_async_engine_and_session 去 sqlite 分支(同步 psycopg 引擎保留给 jobstore)
- number_gen: 去 DATABASE_TYPE 非 postgres 早退(advisory lock 恒定走 PG)
- chat/crud: 删 SqliteDb 分支(agno 无硬依赖)
- pyproject/requirements/uv.lock: 删 aiosqlite、fakeredis;conftest 口径注释同步
- test_stat_analysis_tc: docstring 口径 SQLite→PG
2026-08-07 21:47:42 +08:00

135 lines
4.4 KiB
TOML

[project]
name = "backend"
version = "2.0.0"
description = "DPB 桃育种系统后端"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"agno==2.5.8",
"aiofiles==24.1.0", # 文件操作
"alembic==1.18.4", # 数据库迁移
"apscheduler==3.11.0", # 定时任务
"bleach==6.4.0", # 过滤 HTML 标签
"click==8.1.7", # 命令行参数解析
"croniter==6.2.4", # cron 表达式校验
"fastapi==0.138.2", # fastapi 框架
"greenlet==3.5.2", # 协程核心依赖(SQLAlchemy 异步)
"httpx==0.28.1", # HTTP 客户端
"jinja2==3.1.6", # 模板引擎(代码生成 + 遗留模板)
"loguru==0.7.3", # 日志
"numpy==2.5.1", # 数值计算(BLUP 引擎)
"openpyxl==3.1.5", # Excel 文件处理
"psutil==7.2.2", # 系统信息
"pydantic-settings>=2.6.1", # 配置设置
"pyjwt==2.13.0", # OAuth2
"python-multipart==0.0.32", # request.form() 对表单进行「解析」时安装
"redis==7.1.0", # redis 异步操作数据库
"rich==15.0.0", # 终端打印美化
"sqlalchemy==2.0.51", # 数据库ORM
"sqlglot[rs]==27.8.0", # sql 解析
"tinycss2==1.5.1", # bleach CSS 清洗依赖
"typer==0.26.7", # 命令行工具
"ua-parser==1.0.2", # 解析 User-Agent 获取 OS/浏览器
"uvicorn==0.49.0", # uvicorn web 框架
"websockets>=16.0,<17.0", # websocket 通信
"asyncpg==0.31.0", # PostgreSQL 异步驱动
"psycopg[binary]==3.3.2", # PostgreSQL 同步驱动:仅 APScheduler SQLAlchemyJobStore(同步库接口)使用;业务层统一 asyncpg,不得再引入同步引擎
"openai==2.46.0",
"pydantic[email]>=2.12.5",
]
[project.optional-dependencies]
postgres = ["asyncpg==0.31.0"]
[dependency-groups]
dev = [
"pytest==9.0.2",
"pytest-asyncio>=0.24.0", # 异步测试支持
"ruff==0.14.13", # 代码检查/格式化
]
[tool.uv]
default-groups = ["dev"] # 本地 uv sync 含 dev;生产 pip -r requirements.txt 不含 pytest/ruff
[[tool.uv.index]]
name = "tuna"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
[tool.ruff]
line-length = 200
indent-width = 4
preview = false
fix = true
show-fixes = true
exclude = [
".bzr",
".direnv",
".eggs",
".git",
".git-rewrite",
".hg",
".ipynb_checkpoints",
".mypy_cache",
".nox",
".pants.d",
".pyenv",
".pytest_cache",
".pytype",
".ruff_cache",
".svn",
".tox",
".venv",
".vscode",
"__pypackages__",
"_build",
"buck-out",
"build",
"dist",
"node_modules",
"site-packages",
"venv",
]
extend-include = ["*.pyw"]
[tool.ruff.lint]
select = [
"FAST",
"F",
"E",
"W",
"F",
"I",
"B",
"C4",
"UP",
]
ignore = [
"E501", # line too long, handled by black
"B008", # do not perform function calls in argument defaults
"C901", # too complex
"W191", # indentation contains tabs
"B904", # Within an `except` clause
"B010", # Do not call with a constant attribute value.
"B009", # Do not use getattr() with a constant attribute value.
"E712", # Avoid equality comparisons to `False`; use `not getattr(self.model, "is_deleted"):` for false checks
"W293", # blank line with whitespace
]
[tool.ruff.lint.per-file-ignores]
"tests/conftest.py" = ["E402"] # 先设置 TESTING/PostgreSQL 环境再 import 应用
[tool.ruff.format]
docstring-code-format = true
preview = false
quote-style = "double"
indent-style = "space"
skip-magic-trailing-comma = false
line-ending = "auto"
[tool.pytest.ini_options]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
markers = [
"pg: 依赖真实 PostgreSQL16 + Redis 的统计引擎正式 tc 套件(pytest -m pg 触发;run_ci.py 验收门)",
]