[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] # The PyPI distribution name is "andon-verify" because the bare "andon" name is # already reserved on PyPI. The import package and the CLI command stay `andon` # (like scikit-learn → import sklearn): pip install andon-verify, then `andon run`. name = "andon-verify" version = "0.7.0" description = "Deterministic verification for AI-generated analysis. Stop the line when the numbers don't add up." readme = "README.md" license = "MIT" authors = [{ name = "Mehmet Eren Gülmez" }] requires-python = ">=3.10" keywords = [ "verification", "data-validation", "reconciliation", "excel", "ai-agents", "analytics", "audit", ] classifiers = [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Financial and Insurance Industry", "Intended Audience :: Science/Research", "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 :: Python :: 3.14", "Topic :: Scientific/Engineering :: Information Analysis", "Topic :: Software Development :: Quality Assurance", "Typing :: Typed", ] dependencies = [ "pandas>=2.2", "openpyxl>=3.1", "PyYAML>=6.0", "rich>=13.7", "typer>=0.12", ] [project.optional-dependencies] parquet = ["pyarrow>=15"] duckdb = [ "duckdb>=1.0", ] mcp = ["mcp>=1.2"] [project.urls] Homepage = "https://github.com/gulmezeren2-byte/andon" Repository = "https://github.com/gulmezeren2-byte/andon" Issues = "https://github.com/gulmezeren2-byte/andon/issues" Changelog = "https://github.com/gulmezeren2-byte/andon/blob/main/CHANGELOG.md" [project.scripts] andon = "andon.cli:main" andon-mcp = "andon.mcp_server:main" [dependency-groups] dev = [ "pytest>=8.0", "ruff>=0.6", "mypy>=1.11", "types-PyYAML", ] [tool.hatch.build.targets.wheel] # Distribution name is andon-verify, but the package on disk is `andon`. packages = ["src/andon"] [tool.ruff] line-length = 100 target-version = "py310" [tool.ruff.lint] select = ["E", "F", "I", "UP", "B", "SIM", "RET", "C4"] ignore = ["SIM108"] # ternaries are not always clearer [tool.ruff.lint.flake8-bugbear] # typer's API *is* calls in argument defaults; that's the documented pattern. extend-immutable-calls = ["typer.Option", "typer.Argument"] [tool.mypy] python_version = "3.10" strict = false warn_unused_ignores = true warn_redundant_casts = true disallow_untyped_defs = true no_implicit_optional = true [[tool.mypy.overrides]] module = ["pandas", "pandas.*", "openpyxl", "openpyxl.*"] ignore_missing_imports = true [[tool.mypy.overrides]] # duckdb is an optional extra; the source module guards its import at runtime. # Skip following it (and the numpy it drags in, whose stubs use 3.12+ syntax). module = ["duckdb", "duckdb.*", "numpy", "numpy.*"] ignore_missing_imports = true follow_imports = "skip" [[tool.mypy.overrides]] # mcp is an optional extra; the server module guards its import at runtime. module = ["mcp", "mcp.*"] ignore_missing_imports = true follow_imports = "skip" [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-q"