[tool.poetry] name = "deeprisk-backend" version = "0.1.0" description = "税务风控审查系统后端" authors = ["Development Team "] 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", ]