[project] name = "openclaw-trading" version = "0.1.0" description = "OpenClaw Trading - AI-powered multi-agent trading system" readme = "README.md" requires-python = ">=3.10" license = {text = "MIT"} authors = [ {name = "OpenClaw Team"} ] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Financial and Insurance Industry", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", ] dependencies = [ "pydantic>=2.0", "rich>=13.0", "typer>=0.9", "loguru>=0.7", "pandas>=2.0", "numpy>=1.24", "yfinance>=0.2.28", "langgraph>=0.2.0", "langchain-core>=0.3.0", "fastapi>=0.104.0", "uvicorn[standard]>=0.24.0", "websockets>=12.0", "jinja2>=3.1.0", "python-multipart>=0.0.6", "aiofiles>=23.2.0", "ccxt>=4.2.0", "cryptography>=42.0.0", "pydantic-settings>=2.0.0", ] [project.optional-dependencies] dev = [ "pytest>=7.0", "pytest-asyncio>=0.21", "ruff>=0.1.0", "black>=23.0", "mypy>=1.5", ] [project.scripts] openclaw = "openclaw.cli.main:main" [build-system] requires = ["setuptools>=61.0", "wheel"] build-backend = "setuptools.build_meta" [tool.setuptools.packages.find] where = ["src"] [tool.ruff] target-version = "py310" line-length = 100 [tool.ruff.lint] select = [ "E", # pycodestyle errors "F", # Pyflakes "I", # isort "N", # pep8-naming "W", # pycodestyle warnings "UP", # pyupgrade "B", # flake8-bugbear "C4", # flake8-comprehensions "SIM", # flake8-simplify ] ignore = [ "E501", # Line too long (handled by formatter) ] [tool.ruff.lint.pydocstyle] convention = "google" [tool.ruff.lint.isort] known-first-party = ["openclaw"] [tool.black] line-length = 100 target-version = ["py310", "py311", "py312"] [tool.mypy] python_version = "3.10" strict = true 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 implicit_reexport = false strict_equality = true show_error_codes = true # mypy pydantic plugin disabled - requires pydantic v1 compatibility # [tool.mypy.plugins.pydantic] # init_forbid_extra = true # init_typed = true # warn_required_dynamic_aliases = true [[tool.mypy.overrides]] module = "tests.*" disallow_untyped_defs = false [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py", "*_test.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = "-v --tb=short" asyncio_mode = "auto" filterwarnings = [ "ignore::DeprecationWarning", ]