[project] name = "nl-sql" version = "0.1.0" description = "Portfolio demo: NL→SQL assistant with measurable accuracy, schema-RAG, safety guards" readme = "README.md" requires-python = ">=3.12,<3.14" authors = [{ name = "Julia Edomskikh" }] license = { text = "MIT" } dependencies = [ "fastapi>=0.115", "uvicorn[standard]>=0.32", "pydantic>=2.9", "pydantic-settings>=2.6", "openai>=1.55", "httpx>=0.27", "python-dotenv>=1.0", "sqlalchemy>=2.0", "psycopg[binary]>=3.2", "sqlglot>=25.0", "requests>=2.32", "chromadb>=0.5", "gdown>=5.2", "langgraph>=0.2", "diskcache>=5.6", "streamlit>=1.40", "plotly>=5.24", "pandas>=2.2", ] [project.optional-dependencies] dev = [ "pytest>=8.3", "pytest-asyncio>=0.24", "pytest-cov>=5.0", "respx>=0.21", "ruff>=0.7", "mypy>=1.13", "types-requests", ] ui = [ "streamlit>=1.40", "plotly>=5.24", "pandas>=2.2", ] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/nl_sql"] [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-ra --strict-markers --strict-config" asyncio_mode = "auto" filterwarnings = [ "error", # langgraph 0.6.x emits this on import via langchain_core.cache.base — # upstream issue, not actionable from our code. "default::langchain_core._api.deprecation.LangChainPendingDeprecationWarning", ] [tool.ruff] line-length = 100 target-version = "py313" src = ["src", "tests", "app"] [tool.ruff.lint] select = [ "E", "W", # pycodestyle "F", # pyflakes "I", # isort "N", # pep8-naming "UP", # pyupgrade "B", # bugbear "SIM", # simplify "RUF", # ruff-specific "PT", # pytest "RET", # return "PIE", # misc ] ignore = [ "E501", # line length handled by formatter ] [tool.ruff.lint.per-file-ignores] "tests/**" = ["S101"] [tool.mypy] python_version = "3.13" strict = true mypy_path = "src" explicit_package_bases = true disallow_untyped_decorators = false # FastAPI decorators are fine [[tool.mypy.overrides]] module = ["tests.*"] disallow_untyped_defs = false [[tool.mypy.overrides]] module = ["sqlglot.*"] ignore_missing_imports = true [[tool.mypy.overrides]] module = ["chromadb.*"] ignore_missing_imports = true [[tool.mypy.overrides]] module = ["diskcache.*"] ignore_missing_imports = true [[tool.mypy.overrides]] module = ["plotly.*", "streamlit", "pandas", "pandas.*"] ignore_missing_imports = true