gendesign/backend/pyproject.toml
Light1YT 3b79533f9f
Some checks failed
CI / changes (push) Successful in 7s
CI / frontend-tests (push) Has been skipped
CI / backend-tests (push) Has been cancelled
feat(generative): движок концепций Stage 1a/1b/1c (#54 #55 #56)
Заменяет generative stubs детерминированным end-to-end пайплайном:
- 1a geometry: WGS84-parse, метрическая AEQD-репроекция, setback-буфер, placement grid
- 1b placement: greedy section-fill + STRtree коллизии (full-gap), 3 стратегии, coverage cap
- 1c teap/financial: площади/квартиры/FAR/паркинг; выручка/затраты/маржа + IRR-proxy
- exporters: ezdxf DXF (геометрия) + WeasyPrint ТЭП/фин PDF (lazy import)
generate() заменил generate_stub в route (422 на degenerate). mypy-strict + ruff clean,
31 generative-тест + full suite 3078 passed. ConceptVariant заполняется реальными числами.

Closes #54
Closes #55
Closes #56
2026-06-13 21:32:32 +05:00

109 lines
3.7 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[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",
"jinja2>=3.1.0",
"ezdxf>=1.3.0",
"openpyxl>=3.1.0",
"python-docx>=1.1.0", # DOCX export (import name `docx`) — §22 forecast report (#959)
"python-pptx>=1.0.0", # PPTX export (import name `pptx`) — §22 forecast report (#959)
"pandas>=2.2.0",
"numpy>=2.0.0",
"scikit-learn>=1.5.0",
"sentry-sdk[fastapi,celery,sqlalchemy,httpx]>=2.18.0",
"rosreestr2coord>=5.0.0",
"ijson>=3.2.0",
"pyyaml>=6.0.0", # RBAC roles.yaml loader (app/core/auth.py)
"pdfplumber>=0.10.0", # PDF-парсер постановлений об изъятии/резервировании (#1091)
"beautifulsoup4>=4.12.0", # HTML-парсер реестра КРТ-площадок ЕКБ (#1060)
"pymupdf>=1.24.0", # растеризация PDF→image (без poppler) для OCR (#1062)
"pytesseract>=0.3.13", # OCR сканов через Tesseract для изъятия ЕКБ (#1062)
]
[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.placement",
"app.services.generative.teap",
"app.services.generative.financial",
"app.services.generative.exporters.dxf",
"app.services.generative.exporters.pdf",
"app.services.site_finder.scorer",
]
strict = true
# Геометрия/экспорт-библиотеки без type stubs (shapely/ezdxf/weasyprint не несут
# py.typed) — игнорируем missing-imports, чтобы strict-модули generative проходили.
[[tool.mypy.overrides]]
module = [
"shapely.*",
"ezdxf.*",
"weasyprint.*",
]
ignore_missing_imports = true
[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"
addopts = ["-m", "not prod_smoke"]
markers = [
"slow: marks tests as slow (need real network, deselect with -m 'not slow')",
"prod_smoke: production smoke tests against live https://gendsgn.ru (run only post-deploy with -m prod_smoke)",
"integration: phantom column gate tests requiring TEST_DATABASE_URL (SSH tunnel to prod Postgres)",
]