307beeca02
Prepare the first public 1.0.0 release and finish the remaining CI hardening work. Highlights: - align Python, Rust, WASM, Conda, API, MCP, and docs version metadata to 1.0.0 - promote package metadata to Production/Stable and update stability/versioning docs for the stable series - move the accumulated Unreleased notes into a dated 1.0.0 changelog section and keep a fresh top-level Unreleased block - strengthen the changelog checker so it validates a single top-level Unreleased section - fix the CI/package support mismatch by declaring Python >=3.10 consistently and gating pandas-ta extras to Python 3.12+ - restore Sphinx autodoc compatibility for documented ferro_ta.<module> imports by registering module aliases - make the TA-Lib benchmark guardrail less flaky by checking median and tail-percentile speedups instead of failing on a single mild outlier - switch PyPI publishing to OIDC-only trusted publishing and wire the changelog check into the required CI gate - apply the Ruff-driven cleanup across the Python and test tree and refresh uv/cargo lockfiles Validated locally: - python3 scripts/check_changelog.py - uv run --with ruff ruff check python tests - uv run --with ruff ruff format --check python tests - uv lock --check - sphinx-build -b html docs docs/_build -W --keep-going - build/install the ferro_ta 1.0.0 wheel successfully
140 lines
4.1 KiB
TOML
140 lines
4.1 KiB
TOML
[build-system]
|
|
requires = ["maturin>=1.0,<2.0"]
|
|
build-backend = "maturin"
|
|
|
|
[project]
|
|
name = "ferro-ta"
|
|
version = "1.0.0"
|
|
description = "A fast Technical Analysis library — TA-Lib alternative powered by Rust and PyO3"
|
|
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",
|
|
"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"]
|
|
"python/ferro_ta/*.py" = ["N802"] # Public API: SMA, RSI, ATR, etc.
|
|
"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",
|
|
"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",
|
|
]
|