Files
ferro-ta/pyproject.toml
T
Pratik Bhadane 71b6343e92 feat: refresh benchmark coverage and harden CI tooling
Refresh the benchmark and performance surface across the repo. This updates the benchmark wrappers and helper scripts, regenerates the checked-in benchmark and perf-contract artifacts, and folds in the related roadmap, compatibility, and example notebook changes that belong with this performance-focused pass.

Harden the Python CI and local pre-push flow so the same checks pass reliably in both places. The workflow and pre-push script now use module-safe uv typecheck invocations, the Python test environment installs the optional MCP dependency needed by the MCP server tests, and one-off root benchmark outputs are ignored to keep the repo clean.

Align local tooling with the current project configuration by updating the Ruff pre-commit hook, tightening the API typing and MCP server helpers, and refreshing the lockfile to pick up the audited PyJWT fix while preserving the rest of the staged source changes.
2026-03-24 14:52:20 +05:30

144 lines
4.3 KiB
TOML

[build-system]
requires = ["maturin>=1.0,<2.0"]
build-backend = "maturin"
[project]
name = "ferro-ta"
version = "1.0.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",
]
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",
"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",
]
[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.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
[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",
]