[project] name = "aps" version = "0.1.0" description = "APS:独立的高级排产业务系统。开发期与平台同仓不同目录(ADR-0010),工具链与依赖独立。" requires-python = ">=3.11" dependencies = [ # 接口层(B5:契约化 API) "fastapi>=0.115", "uvicorn[standard]>=0.30", "pydantic>=2.7", "python-multipart>=0.0.9", "httpx>=0.27", # 求解引擎(B1 搬入 server/engines) "ortools>=9.10", "scipy>=1.14", # 导入与文档解析(B1 搬入 server/importers;图纸解析归 APS) "openpyxl>=3.1", "pdfplumber>=0.11", "python-docx>=1.1", "lxml>=5.0", "ezdxf>=1.4", "fonttools>=4.50", # 持久层:APS 库归 APS(ADR-0008),独立账号、独立 database "sqlalchemy>=2.0", "alembic>=1.13", "pymysql>=1.1", # APS 自己的审计归档加密(B4) "cryptography>=42", "python-dotenv>=1.0", ] # 开发依赖用 uv 的 dependency-group(uv sync 默认安装,CI 用 --locked 保证一致) [dependency-groups] dev = ["ruff>=0.7", "pytest>=8.3", "pytest-asyncio>=0.24"] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/aps"] [tool.ruff] line-length = 120 target-version = "py311" src = ["src", "tests"] [tool.ruff.lint] select = ["E", "F", "W", "I", "UP", "B", "SIM"] [tool.ruff.lint.per-file-ignores] # B1 从 main 分支原样搬入的旧代码:先保证行为与旧系统一致,格式与风格清理放到 B3(那时删掉这一段) "src/aps/domain/*.py" = ["E501", "I001", "B007", "SIM103", "SIM108"] "src/aps/engines/*.py" = ["E501", "I001"] "src/aps/timeutil.py" = ["I001"] [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto" addopts = "-q"