[project] name = "dbt-plan" version = "0.18.5" description = "Static analysis tool that warns about risky DDL changes before dbt run" readme = "README.md" requires-python = ">=3.10" license = "Apache-2.0" authors = [{ name = "PresentJay" }] keywords = ["dbt", "ddl", "impact-analysis", "ci", "snowflake", "bigquery", "redshift"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "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 :: Database", "Topic :: Software Development :: Quality Assurance", ] dependencies = [ "sqlglot>=28.0.0", ] [project.scripts] dbt-plan = "dbt_plan.cli:main" dbt-plan-mcp = "dbt_plan_mcp.server:main" [project.optional-dependencies] test = ["pytest>=8.0.0", "pytest-cov>=6.0.0", "jsonschema>=4.18.0"] dev = ["pytest>=8.0.0", "pytest-cov>=6.0.0", "ruff>=0.8.0", "jsonschema>=4.18.0"] dbt = ["dbt-core>=1.7.0", "dbt-duckdb>=1.7.0"] # The MCP server lives outside src/dbt_plan/ on purpose: it is async and speaks a # protocol, and tests/test_invariants.py forbids asyncio and network imports in the # analysis core. Keeping it a separate package keeps that guarantee provable. mcp = ["mcp>=2.0.0"] [project.urls] Homepage = "https://github.com/PresentJay/dbt-plan" Documentation = "https://presentjay.github.io/dbt-plan" Repository = "https://github.com/PresentJay/dbt-plan" Issues = "https://github.com/PresentJay/dbt-plan/issues" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/dbt_plan", "src/dbt_plan_mcp"] # Ship only what is needed to build and understand the package. An sdist is # published permanently and mirrored worldwide, so anything swept into it is # effectively unrecallable -- keep the surface deliberate rather than # defaulting to "the whole working tree". Tests, docs, and examples live in # the git repository. [tool.hatch.build.targets.sdist] include = [ "/src/dbt_plan", "/src/dbt_plan_mcp", "/README.md", "/README.ko.md", "/CHANGELOG.md", "/LICENSE", "/SECURITY.md", "/pyproject.toml", ] [tool.pytest.ini_options] testpaths = ["tests"] [tool.coverage.run] source = ["dbt_plan"] [tool.coverage.report] show_missing = true fail_under = 85 [tool.ruff] target-version = "py310" line-length = 99 [tool.ruff.lint] select = ["E", "F", "I", "UP", "B", "SIM"] ignore = ["E501", "SIM105", "SIM102", "SIM103"]