[project]
name = "fastapi-sqlalchemy-asyncpg"
version = "1.24.0"
description = "A modern FastAPI application with SQLAlchemy 2.0 and AsyncPG for high-performance async database operations. Features include JWT authentication with Redis token storage, password hashing, connection pooling, data processing with Polars, Rich logging, task scheduling with APScheduler, and Shakespeare datasets integration."
readme = "README.md"
requires-python = "==3.14.0"
dependencies = [
    "fastapi[all]==0.124.4",
    "pydantic[email]==2.12.5",
    "pydantic-settings==2.12.0",
    "sqlalchemy==2.0.45",
    "uvicorn[standard]==0.38.0",
    "asyncpg==0.31.0",
    "alembic==1.17.2",
    "httpx==0.28.1",
    "pytest==9.0.2",
    "pytest-cov==7.0.0",
    "uvloop==0.22.1",
    "httptools==0.7.1",
    "rich==14.2.0",
    "pyjwt==2.10.1",
    "redis==7.1.0",
    "bcrypt==5.0.0",
    "polars[pyarrow]==1.36.1",
    "python-multipart==0.0.20",
    "fastexcel==0.18.0",
    "inline-snapshot==0.31.1",
    "dirty-equals==0.11",
    "polyfactory==3.1.0",
    "granian==2.6.0",
    "apscheduler[redis,sqlalchemy]>=4.0.0a6",
    "rotoger==0.2.1",
]

[tool.uv]
dev-dependencies = [
    "ruff==0.14.9",
    "devtools[pygments]==0.12.2",
    "pyupgrade==3.21.2",
    "ipython==9.8.0",
    "tryceratops==2.4.1",
]


[tool.mypy]
strict = true
exclude = ["venv", ".venv", "alembic"]

[tool.ruff]
target-version = "py314"
exclude = ["alembic"]

[tool.ruff.lint]
select = [
    "E",  # pycodestyle errors
    "W",  # pycodestyle warnings
    "F",  # pyflakes
    "I",  # isort
    "B",  # flake8-bugbear
    "C4",  # flake8-comprehensions
    "UP",  # pyupgrade
    "ARG001", # unused arguments in functions
]
ignore = [
    "E501",  # line too long, handled by black
    "B008",  # do not perform function calls in argument defaults
    "W191",  # indentation contains tabs
    "B904",  # Allow raising exceptions without from e, for HTTPException
]

[tool.ruff.lint.pyupgrade]
# Preserve types, even if a file imports `from __future__ import annotations`.
keep-runtime-typing = true

[tool.inline-snapshot]
hash-length=15
default-flags=["report"]
default-flags-tui=["create", "review"]
show-updates=false
format-command="ruff format --stdin-filename {filename}"

[tool.inline-snapshot.shortcuts]
review=["review"]
fix=["create","fix"]
