[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "easy-tdx" version = "1.19.3" description = "通达信 TCP 协议行情数据客户端,支持在线行情、离线数据读取与写入同步" readme = "README.md" requires-python = ">=3.10" dependencies = ["pandas>=2.0,<3", "tzdata>=2024.1", "click>=8.0,<9"] [project.scripts] easy-tdx = "easy_tdx.cli:cli" # cli/__init__.py exposes the click group [project.optional-dependencies] dev = ["pytest>=8.0", "pytest-asyncio>=0.23", "pytest-cov", "mypy>=1.9", "ruff>=0.4", "scipy>=1.10,<1.16", "httpx>=0.27"] science = ["scipy>=1.10,<1.16"] web = ["fastapi>=0.110,<1", "uvicorn[standard]>=0.29"] # 打包成桌面 EXE 用:系统托盘(pystray)+ 图标生成(Pillow)。 # 仅 PyInstaller 打包态需要,开发态 ``pip install -e .[web]`` 不强制装。 packaging = ["pystray>=0.19", "Pillow>=10.0"] [tool.hatch.build.targets.wheel] packages = ["src/easy_tdx"] [tool.mypy] strict = true python_version = "3.12" # 跳过未跟踪的本地脚本(依赖外部 unified_config/sqlalchemy/requests,不属于库) exclude = ["src/easy_tdx/exchange_margin\\.py"] [[tool.mypy.overrides]] module = ["pandas", "tabulate", "matplotlib", "matplotlib.*"] ignore_missing_imports = true [[tool.mypy.overrides]] module = "easy_tdx.MyTT" # Type stubs provided via MyTT.pyi — keep strict checks enabled [[tool.mypy.overrides]] module = ["fastapi.*", "uvicorn.*", "pydantic.*"] ignore_missing_imports = true [[tool.mypy.overrides]] # pystray / Pillow 无 type stubs;tray.py 已用 type: ignore 兜底关键调用 module = ["pystray", "pystray.*", "PIL", "PIL.*"] ignore_missing_imports = true [[tool.mypy.overrides]] module = ["scipy", "scipy.*"] ignore_missing_imports = true [tool.ruff] target-version = "py310" line-length = 100 extend-exclude = ["*.pyi", "src/easy_tdx/exchange_margin.py"] [tool.ruff.lint] select = ["E", "F", "I", "UP"] [tool.pytest.ini_options] testpaths = ["tests"] addopts = "--tb=short" asyncio_mode = "auto" [tool.coverage.run] source = ["easy_tdx"] omit = ["tests/*"] [tool.coverage.report] # 覆盖率门槛。从 50 提升到 60(审计 #9):补充 reconnect/bitmap/config 测试后 # 实测约 61%。进一步提到 70 需补 web/ 路由与更多 client 镜像测试,留待后续。 fail_under = 60 show_missing = true