[build-system]
requires = ["maturin>=1.0,<2.0"]
build-backend = "maturin"

[project]
name = "ferro-ta"
version = "1.1.0"
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",
]

[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 = 65
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",
]
