[project] name = "uqo-chat" version = "0.1.0" description = "UQO-Chat — tuteur IA pour IMM1003 / IMM1033 (UQO)" requires-python = ">=3.12" dependencies = [ "fastapi>=0.115", "uvicorn[standard]>=0.30", "gunicorn>=22", "pydantic[email]>=2.7", "pydantic-settings>=2.3", "sqlalchemy[asyncio]>=2.0", "aiosqlite>=0.20", "asyncpg>=0.29", "httpx[http2]>=0.27", "structlog>=24.1", "python-jose[cryptography]>=3.3", "passlib>=1.7", "python-multipart>=0.0.9", "openpyxl>=3.1", "pandas>=2.2", "numpy>=1.26", "numpy-financial>=1.0", "matplotlib>=3.9", "pdfplumber>=0.11", "python-docx>=1.1", "python-pptx>=0.6", "selectolax>=0.3", "markdown-it-py>=3.0", "aiosmtplib>=3.0", "orjson>=3.10", ] [project.optional-dependencies] dev = ["pytest>=8", "pytest-asyncio>=0.23", "respx>=0.21", "ruff>=0.5", "mypy>=1.10"] [build-system] requires = ["setuptools>=68"] build-backend = "setuptools.build_meta" [tool.setuptools.packages.find] include = ["app*"] [tool.ruff] line-length = 100 target-version = "py312" [tool.ruff.lint] select = ["E", "F", "I", "B", "UP"] # B008: FastAPI `Depends()` in defaults is idiomatic; E501: long f-strings in French prompts. ignore = ["B008", "E501"] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"]