[project] name = "blog" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.13" dependencies = [ "fastapi>=0.136.0", "pydantic>=2.13.2", "pydantic-settings>=2.14.0", "uvicorn>=0.44.0", "sqlalchemy>=2.0.0", "aiosqlite>=0.21.0", "asyncpg>=0.30.0", "alembic>=1.15.0", "dishka>=1.5.0", "httpx>=0.28.0", "jinja2>=3.1.6", "itsdangerous>=2.2.0", "markdown-it-py>=4.0.0", "mdit-py-plugins>=0.5.0", "pygments>=2.20.0", ] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["app"] [dependency-groups] dev = [ {include-group = "lints"}, {include-group = "tests"}, {include-group = "types"}, "playwright>=1.59.0", "pre-commit>=4.5.1", "pytest-playwright>=0.7.2", "python-multipart>=0.0.27", "types-pygments>=2.20.0.20260408", ] tests = [ "httpx>=0.28.1", "mimesis>=19.1.0", "pytest>=9.0.3", "pytest-asyncio>=1.3.0", "pytest-cov>=7.1.0", "pytfm", ] lints = [ "ruff>=0.15.11", "isort>=8.0.1", ] types = [ "mypy>=1.20.1", ] [project.scripts] blog = "app.main:main" [tool.uv.sources] pytfm = { workspace = true } [tool.pytest.ini_options] asyncio_mode = "auto" addopts = "--cov=app --cov-fail-under=70 --cov-report=term-missing --cov-report=html" pythonpath = "." testpaths = "tests" xfail_strict = true markers = [ "e2e: End-to-end tests requiring running server", ] [tool.mypy] strict = true exclude = ["tests/e2e"] plugins = ["pydantic.mypy"] [tool.ruff] target-version = "py313" line-length = 100 [tool.ruff.lint] select = ["E", "F", "I", "W", "B", "C4", "SIM"] ignore = ["E501"] [tool.isort] profile = "black" filter_files = true