[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "ferro-ta" version = "1.1.4" description = "Rust-powered Python technical analysis library with a TA-Lib-compatible API" readme = "README.md" license = { text = "MIT" } requires-python = ">=3.10" keywords = [ "technical-analysis", "trading", "finance", "rust", "pyo3", "ta-lib", "indicators", "candlestick", "pandas", "numpy", ] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Financial and Insurance Industry", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Rust", "Topic :: Office/Business :: Financial", "Topic :: Scientific/Engineering :: Mathematics", "Typing :: Typed", ] dependencies = ["numpy>=1.20"] [project.optional-dependencies] test = ["pytest>=7.0", "hypothesis>=6.0"] benchmark = ["pytest>=7.0", "pytest-benchmark>=4.0"] pandas = ["pandas>=1.0"] polars = ["polars>=0.19"] docs = ["sphinx>=7.0", "sphinx-rtd-theme>=1.3"] comparison = [ "pytest>=7.0", "ta-lib>=0.4", "pandas-ta>=0.3; python_version >= '3.12'", "ta>=0.10", "pandas>=1.0", "vectorbt>=0.28", "backtrader>=1.9", "backtesting>=0.6", "quantstats>=0.0.81", ] gpu = ["torch>=2.0"] options = [] mcp = ["mcp>=1.0"] all = ["pandas>=1.0", "polars>=0.19", "pytest>=7.0", "pytest-benchmark>=4.0"] dev = [ "pytest>=7.0", "pytest-cov>=4.0", "hypothesis>=6.0", "pandas>=1.0", "polars>=0.19", "pre-commit>=3.0", "ruff>=0.3", "mypy>=1.0", "pyright>=1.1", "maturin>=1.0,<2.0", "pyyaml>=6.0", "matplotlib>=3.5", "fastapi>=0.135.1", "httpx>=0.24", "scipy>=1.10", ] [project.urls] Homepage = "https://github.com/pratikbhadane24/ferro-ta" Repository = "https://github.com/pratikbhadane24/ferro-ta" "Bug Tracker" = "https://github.com/pratikbhadane24/ferro-ta/issues" [tool.pytest.ini_options] testpaths = ["tests/unit", "tests/integration"] [tool.coverage.run] source = ["ferro_ta"] omit = ["*/_ferro_ta*", "*/mcp/*"] [tool.coverage.report] show_missing = true fail_under = 80 exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "if __name__ ==", ] [tool.maturin] python-source = "python" module-name = "ferro_ta._ferro_ta" features = ["pyo3/extension-module"] # Include the PEP 561 py.typed marker so type checkers recognize this package include = [{ path = "python/ferro_ta/py.typed", format = "wheel" }] [tool.mypy] python_version = "3.10" warn_return_any = true ignore_missing_imports = true # Strictness: step toward strict; fix critical issues first disallow_untyped_defs = false check_untyped_defs = true # Allow for now; tighten once missing-return and no-any-return are fixed disable_error_code = ["return", "no-any-return"] [tool.ruff] target-version = "py310" line-length = 88 src = ["python", "tests"] [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "UP"] ignore = ["E501", "UP006", "UP045", "UP007"] # Tests: allow underscore in class names (TestCHANDELIER_EXIT), late imports (E402), uppercase helpers (N802) # Stubs: public API names are uppercase (SMA, RSI, etc.); Tuple used for compatibility [tool.ruff.lint.per-file-ignores] "tests/*" = ["N801", "N802", "N806", "E402", "E741", "F811"] "tests/unit/*" = ["N801", "N802", "N806", "E402", "E741", "F811"] "tests/integration/*" = ["N801", "N802", "N806", "E402", "E741", "F811"] "benchmarks/*" = ["E402", "E741"] "python/ferro_ta/*.py" = ["N802"] # Public API: SMA, RSI, ATR, etc. "python/ferro_ta/__init__.py" = ["E402", "N802"] # Re-export surface by design "python/ferro_ta/__init__.pyi" = ["N802", "E402"] [tool.ruff.format] quote-style = "double" [tool.pyright] pythonVersion = "3.10" typeCheckingMode = "basic" reportMissingImports = false reportMissingTypeStubs = false reportMissingModuleSource = false [tool.uv] # Use uv for dependency resolution, locking, and running commands. # Install: pip install uv (or curl -Lsf https://astral.sh/uv/install.sh | sh) # Sync: uv sync --extra dev # Tests: uv run pytest tests/ # Build: uv run maturin build --release --out dist constraint-dependencies = [ "pygments>=2.20.0", "requests>=2.33.0", ] [dependency-groups] dev = [ "pytest>=7.0", "hypothesis>=6.0", "pandas>=1.0", "polars>=0.19", "pre-commit>=3.0", "ruff>=0.3", "mypy>=1.0", "pyright>=1.1", "maturin>=1.0,<2.0", "pyyaml>=6.0", "pandas-ta>=0.3; python_version >= '3.12'", "ta>=0.10", "scipy>=1.15.3", ]