[project] name = "han-api-backend" version = "0.1.0" description = "HAN Chat FastAPI backend" requires-python = ">=3.12" dependencies = [ "alembic>=1.16,<2", "asyncpg>=0.30,<1", "boto3>=1.39,<2", "fastapi>=0.116,<1", "httpx>=0.28,<1", "opentelemetry-api>=1.44,<2", "opentelemetry-exporter-otlp-proto-grpc>=1.44,<2", "opentelemetry-instrumentation-botocore>=0.65b0,<1", "opentelemetry-instrumentation-fastapi>=0.65b0,<1", "opentelemetry-instrumentation-httpx>=0.65b0,<1", "opentelemetry-instrumentation-redis>=0.65b0,<1", "opentelemetry-instrumentation-sqlalchemy>=0.65b0,<1", "opentelemetry-sdk>=1.44,<2", "phonenumbers>=9,<10", "prometheus-client>=0.22,<1", "pydantic-settings>=2.10,<3", "pyyaml>=6,<7", "pyjwt[crypto]>=2.10,<3", "redis>=6,<7", "sqlalchemy[asyncio]>=2.0.41,<3", "structlog>=25,<26", "uvicorn[standard]>=0.35,<1", ] [project.optional-dependencies] dev = [ "aiosqlite>=0.21,<1", "mypy>=1.16,<2", "pytest>=8.4,<9", "pytest-asyncio>=1.0,<2", "ruff>=0.12,<1", "types-boto3-s3>=1.39,<2", "types-PyYAML>=6,<7", ] [project.scripts] han-api = "app.main:run" han-delivery-worker = "app.workers:delivery_main" han-safety-worker = "app.workers:safety_main" han-cleanup-worker = "app.workers:cleanup_main" han-notification-expire-worker = "app.workers:notification_expire_main" han-notification-draft-cleanup-worker = "app.workers:notification_draft_cleanup_main" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["app"] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] [tool.ruff] target-version = "py312" line-length = 100 [tool.ruff.lint] select = ["E", "F", "I", "UP", "B", "ASYNC", "S"] ignore = ["S101"] [tool.mypy] python_version = "3.12" check_untyped_defs = true warn_redundant_casts = true warn_unused_ignores = true ignore_missing_imports = true disable_error_code = ["no-untyped-def", "misc", "arg-type", "assignment"] plugins = ["pydantic.mypy", "sqlalchemy.ext.mypy.plugin"] exclude = ["alembic/"]