[build-system] requires = ["hatchling>=1.25.0"] build-backend = "hatchling.build" [project] name = "arbitrade" version = "0.1.0" description = "Low-latency Kraken arbitrage bot" readme = "README.md" requires-python = ">=3.12" dependencies = [ "cryptography>=43.0.0", "duckdb>=1.1.0", "fastapi>=0.115.0", "httptools>=0.6.1", "httpx>=0.28.0", "jinja2>=3.1.0", "keyring>=25.0.0", "orjson>=3.10.0", "pydantic>=2.9.0", "pydantic-settings>=2.5.0", "structlog>=24.4.0", "sortedcontainers>=2.4.0", "uvicorn[standard]>=0.31.0", "uvloop>=0.20.0; platform_system != 'Windows'", "websockets>=13.0", ] [project.optional-dependencies] dev = [ "black>=24.8.0", "mypy>=1.11.0", "pre-commit>=3.8.0", "pytest>=8.3.0", "pytest-asyncio>=0.24.0", "respx>=0.21.1", "ruff>=0.6.0", "vcrpy>=6.0.0", ] [project.scripts] arbitrade = "arbitrade.main:main" [tool.hatch.build.targets.wheel] packages = ["src/arbitrade"] [tool.black] line-length = 100 target-version = ["py312"] [tool.ruff] line-length = 100 target-version = "py312" [tool.ruff.lint] select = ["E", "F", "I", "UP", "B", "N", "ASYNC"] ignore = ["E203"] [tool.mypy] python_version = "3.12" strict = true warn_return_any = true warn_unused_configs = true pretty = true mypy_path = "src" [[tool.mypy.overrides]] module = ["duckdb", "keyring", "sortedcontainers"] ignore_missing_imports = true [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto"