- Repo-Struktur für Backend, Frontend, Dokumentation und Gitea-Workflows - FastAPI-Skeleton mit pydantic-settings und RFC-7807-artigem Fehlerformat - Vollständiges Datenmodell (15 Tabellen) als SQLAlchemy-2.0-Modelle - Alembic gegen die Async-Engine inklusive Erstmigration - Idempotenter Seed für den deutschen Kategoriebaum und Standardregeln - Endpunkte /api/health und /api/version - pytest-Infrastruktur mit transaktionsisolierten Fixtures Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014e7t8UpmoVNMtWivY5LiSH
61 lines
1.4 KiB
TOML
61 lines
1.4 KiB
TOML
[project]
|
||
name = "moneyfy-backend"
|
||
version = "0.1.0"
|
||
description = "moneyfy – Planung monatlicher Kosten und Einkünfte"
|
||
requires-python = ">=3.12,<3.13"
|
||
dependencies = [
|
||
"fastapi>=0.115",
|
||
"uvicorn[standard]>=0.32",
|
||
"sqlalchemy[asyncio]>=2.0.36",
|
||
"asyncpg>=0.30",
|
||
"alembic>=1.14",
|
||
"pydantic>=2.10",
|
||
"pydantic-settings>=2.7",
|
||
"python-dateutil>=2.9",
|
||
"holidays>=0.63",
|
||
"apscheduler>=3.11",
|
||
"argon2-cffi>=23.1",
|
||
"pyjwt>=2.10",
|
||
"httpx>=0.28",
|
||
"pillow>=11.0",
|
||
"openpyxl>=3.1",
|
||
"apprise>=1.9",
|
||
"python-multipart>=0.0.20",
|
||
"email-validator>=2.2",
|
||
]
|
||
|
||
[project.optional-dependencies]
|
||
dev = [
|
||
"pytest>=8.3",
|
||
"pytest-asyncio>=0.24",
|
||
"ruff>=0.8",
|
||
"psycopg[binary]>=3.2",
|
||
"freezegun>=1.5",
|
||
]
|
||
|
||
[build-system]
|
||
requires = ["setuptools>=75"]
|
||
build-backend = "setuptools.build_meta"
|
||
|
||
[tool.setuptools.packages.find]
|
||
include = ["app*"]
|
||
|
||
[tool.ruff]
|
||
line-length = 100
|
||
target-version = "py312"
|
||
extend-exclude = ["alembic/versions"]
|
||
|
||
[tool.ruff.lint]
|
||
select = ["E", "F", "I", "UP", "B", "SIM", "C4", "N", "RUF"]
|
||
ignore = ["B008", "RUF001", "RUF002", "RUF003"]
|
||
|
||
[tool.ruff.format]
|
||
quote-style = "double"
|
||
|
||
[tool.pytest.ini_options]
|
||
testpaths = ["tests"]
|
||
asyncio_mode = "auto"
|
||
asyncio_default_fixture_loop_scope = "session"
|
||
asyncio_default_test_loop_scope = "session"
|
||
filterwarnings = ["ignore::DeprecationWarning"]
|