[project] name = "gendesign-backend" version = "0.1.0" description = "Generative Design + Site Finder backend (FastAPI)" requires-python = ">=3.12" dependencies = [ "fastapi>=0.115.0", "uvicorn[standard]>=0.30.0", "sqlalchemy>=2.0.30", "geoalchemy2>=0.15.0", "alembic>=1.13.0", "pydantic>=2.7.0", "pydantic-settings>=2.3.0", "psycopg[binary]>=3.2.0", "shapely>=2.0.0", "geopandas>=1.0.0", "pyproj>=3.6.0", "httpx>=0.27.0", "redis>=5.0.0", "celery>=5.4.0", "playwright>=1.45.0", "tenacity>=9.0.0", "pillow>=10.4.0", "weasyprint>=62.0", "ezdxf>=1.3.0", "openpyxl>=3.1.0", "pandas>=2.2.0", "numpy>=2.0.0", "scikit-learn>=1.5.0", "sentry-sdk[fastapi]>=2.10.0", "rosreestr2coord>=5.0.0", ] [dependency-groups] dev = [ "pytest>=8.0.0", "pytest-asyncio>=0.23.0", "ruff>=0.5.0", "mypy>=1.10.0", "types-redis>=4.6.0", "pre-commit>=3.7.0", ] [tool.uv] package = true # Tell setuptools which directory IS the Python package. # Without this, having both `app/`, `alembic/`, `db/` at top level confuses # auto-discovery: "Multiple top-level packages discovered in a flat-layout". # We only want to package `app/`. `alembic/` and `db/` are operational, not Python packages. [tool.setuptools.packages.find] include = ["app*"] [tool.ruff] target-version = "py312" line-length = 100 [tool.ruff.lint] select = ["E", "F", "I", "B", "UP", "N", "RUF", "ASYNC"] # RUF001/002/003 — ambiguous Unicode (Cyrillic vs Latin lookalikes). # Off because the project is Russian-language; comments/docstrings legitimately use Cyrillic. ignore = ["RUF001", "RUF002", "RUF003"] [tool.mypy] python_version = "3.12" strict_optional = true warn_unused_ignores = true # strict только для core-модулей (правило из памяти Validation_Findings_Apr25) [[tool.mypy.overrides]] module = [ "app.services.generative.geometry", "app.services.generative.teap", "app.services.generative.financial", "app.services.site_finder.scorer", ] strict = true [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto"