[project] name = "nadlan-mcp" version = "2.0.0" description = "Israeli Real Estate MCP Server" readme = "README.md" requires-python = ">=3.7" license = {text = "MIT"} authors = [ {name = "Nadlan MCP Contributors"} ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", ] dependencies = [ "requests>=2.31.0", "python-dotenv>=1.0.0", "pydantic>=2.0.0", "fastmcp>=0.1.0", ] [project.optional-dependencies] dev = [ "pytest>=7.4.0", "pytest-cov>=4.1.0", "pytest-mock>=3.11.1", "pytest-anyio>=0.0.0", "ruff>=0.1.0", "mypy>=1.5.0", "pre-commit>=3.4.0", "types-requests>=2.31.0", ] [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" # Ruff configuration [tool.ruff] line-length = 100 target-version = "py37" # Exclude directories exclude = [ ".git", ".mypy_cache", ".pytest_cache", ".ruff_cache", ".venv", "venv", "__pycache__", "build", "dist", "*.egg-info", ] [tool.ruff.lint] # Enable specific rule sets select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort (import sorting) "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade "SIM", # flake8-simplify ] # Ignore specific rules ignore = [ "E501", # line too long (handled by formatter) "B008", # do not perform function calls in argument defaults "B904", # raise from exceptions "SIM108", # use ternary operator (sometimes less readable) ] # Allow autofix for all enabled rules fixable = ["ALL"] unfixable = [] # Per-file ignores [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] # Allow unused imports in __init__.py "tests/**/*.py" = ["S101"] # Allow assert in tests [tool.ruff.lint.isort] known-first-party = ["nadlan_mcp"] force-sort-within-sections = true [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" # Mypy configuration [tool.mypy] python_version = "3.10" warn_return_any = true warn_unused_configs = true disallow_untyped_defs = false # Gradual typing - start permissive check_untyped_defs = true no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true warn_no_return = true warn_unreachable = true strict_equality = true pretty = true # Per-module options [[tool.mypy.overrides]] module = "tests.*" disallow_untyped_defs = false [[tool.mypy.overrides]] module = "fastmcp.*" ignore_missing_imports = true [[tool.mypy.overrides]] module = "mcp.*" ignore_missing_imports = true # Pytest configuration [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = "-ra -q --strict-markers" markers = [ "unit: fast unit tests (default)", "integration: slow integration tests requiring real API calls", "api_health: weekly API health check tests (run separately)", ] # Coverage configuration [tool.coverage.run] source = ["nadlan_mcp"] omit = [ "tests/*", "nadlan_mcp/__pycache__/*", "*/site-packages/*", ] [tool.coverage.report] precision = 2 show_missing = true skip_covered = false exclude_lines = [ "pragma: no cover", "def __repr__", "if TYPE_CHECKING:", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "@abstractmethod", ]