[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "ihalent" version = "0.3.2" description = "Turkish public-tender award intelligence: who won, for how much, at what discount, against how many bidders." readme = "README.md" license = "MIT" authors = [{ name = "Mehmet Eren Gülmez" }] requires-python = ">=3.10" keywords = [ "turkey", "ekap", "public-procurement", "tenders", "government-data", "analytics", "ai-agents", "mcp", ] classifiers = [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Financial and Insurance Industry", "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 :: Office/Business :: Financial", "Topic :: Scientific/Engineering :: Information Analysis", "Typing :: Typed", ] dependencies = [ "rich>=13.7", "typer>=0.12", ] [project.optional-dependencies] # The MCP server is an extra so the parse+analytics core and CLI stay # dependency-light for pipelines that never touch an agent runtime. mcp = ["mcp>=1.2"] [project.urls] Homepage = "https://github.com/gulmezeren2-byte/ihalent" Repository = "https://github.com/gulmezeren2-byte/ihalent" Issues = "https://github.com/gulmezeren2-byte/ihalent/issues" Changelog = "https://github.com/gulmezeren2-byte/ihalent/blob/main/CHANGELOG.md" [project.scripts] ihalent = "ihalent.cli:main" ihalent-mcp = "ihalent.mcp_server:main" [dependency-groups] dev = [ "pytest>=8.0", "ruff>=0.6", "mypy>=1.11", ] [tool.ruff] line-length = 100 target-version = "py310" [tool.ruff.lint] select = ["E", "F", "I", "UP", "B", "SIM", "RET", "C4"] ignore = ["SIM108"] [tool.ruff.lint.flake8-bugbear] extend-immutable-calls = ["typer.Option", "typer.Argument"] [tool.ruff.lint.per-file-ignores] # Test fixtures embed real EKAP notice rows verbatim; their length is the data's, # not the code's, and reflowing them would make them stop matching reality. "tests/conftest.py" = ["E501"] [tool.mypy] python_version = "3.10" strict = false warn_unused_ignores = true disallow_untyped_defs = true no_implicit_optional = true [[tool.mypy.overrides]] # mcp is an optional extra; the server module guards its import at runtime. module = ["mcp.*"] ignore_missing_imports = true [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-q"