deep-risk/backend/pyproject.toml
2025-12-14 20:08:27 +08:00

134 lines
3.0 KiB
TOML

[tool.poetry]
name = "deeprisk-backend"
version = "0.1.0"
description = "税务风控审查系统后端"
authors = ["Development Team <dev@deeprisk.com>"]
readme = "README.md"
license = {text = "MIT"}
keywords = ["tax", "risk-control", "audit", "fastapi"]
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Financial and Insurance Industry",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3.11",
]
requires-python = ">=3.11"
[tool.poetry.dependencies]
python = "^3.11"
fastapi = "^0.110.0"
uvicorn = {extras = ["standard"], version = "^0.29.0"}
pydantic = "^2.5.0"
pydantic-settings = "^2.1.0"
sqlalchemy = {version = "^2.0.25", features = ["asyncio"]}
asyncpg = "^0.29.0"
alembic = "^1.13.0"
redis = "^5.0.1"
celery = "^5.3.4"
apscheduler = "^3.10.4"
python-jose = {extras = ["cryptography"], version = "^3.3.0"}
passlib = {extras = ["bcrypt"], version = "^1.7.4"}
pandas = "^2.2.0"
openpyxl = "^3.1.2"
reportlab = "^4.0.8"
python-multipart = "^0.0.9"
loguru = "^0.7.2"
python-decouple = "^3.8"
email-validator = "^2.1.0"
[tool.poetry.group.dev.dependencies]
pytest = "^8.0.0"
pytest-asyncio = "^0.23.0"
pytest-httpx = "^0.27.0"
httpx = "^0.27.0"
black = "^24.2.0"
isort = "^5.13.0"
mypy = "^1.7.0"
coverage = "^7.4.0"
factory-boy = "^3.3.0"
faker = "^22.0.0"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
[tool.poetry.group.runtime.dependencies]
python-dotenv = "^1.0.0"
[tool.black]
line-length = 88
target-version = ['py311']
include = '\.pyi?$'
extend-exclude = '''
/(
# directories
\.eggs
| \.git
| \.hg
| \.mypy_cache
| \.tox
| \.venv
| build
| dist
)/
'''
[tool.isort]
profile = "black"
line_length = 88
multi_line_output = 3
include_trailing_comma = true
force_grid_wrap = 0
use_parentheses = true
ensure_newline_before_comments = true
[tool.mypy]
python_version = "3.11"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
check_untyped_defs = true
disallow_untyped_decorators = true
no_implicit_optional = true
warn_redundant_casts = true
warn_unused_ignores = true
warn_no_return = true
warn_unreachable = true
strict_equality = true
[tool.pytest.ini_options]
testpaths = ["app/tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
asyncio_mode = "auto"
addopts = "-v --strict-markers --strict-config --cov=app --cov-report=term-missing --cov-report=html"
markers = [
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
"integration: marks tests as integration tests",
"unit: marks tests as unit tests",
]
[tool.coverage.run]
source = ["app"]
omit = [
"app/tests/*",
"alembic/*",
"*/__pycache__/*",
]
[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"def __repr__",
"if self.debug:",
"if settings.DEBUG",
"raise AssertionError",
"raise NotImplementedError",
"if 0:",
"if __name__ == .__main__.:",
"class .*\\bProtocol\\):",
"@(abc\\.)?abstractmethod",
]