jurix-api / pyproject.toml
rahim237cm's picture
Claude Opus 5.5
feat(embeddings): voyage-4-large remplace EmbeddingGemma (API Voyage, halfvec 1024)
57c8117
Raw History Blame Contribute Delete
4.97 kB
[tool.poetry]
name = "jurix-backend"
version = "3.0.0"
description = "JuriX v2.1 Backend API - Plateforme Juridique Camerounaise"
authors = ["JuriX Team"]
readme = "README.md"
[tool.poetry.dependencies]
python = "^3.11"
# Core Framework
fastapi = "^0.104.0"
uvicorn = {extras = ["standard"], version = "^0.24.0"}
# [email] fournit email-validator, requis par EmailStr au chargement des schemas
pydantic = {extras = ["email"], version = "^2.5.0"}
pydantic-settings = "^2.1.0"
# Database
sqlalchemy = "^2.0.23"
alembic = "^1.12.1"
psycopg2-binary = "^2.9.9"
asyncpg = "^0.29.0"
pgvector = ">=0.3.0,<1.0.0"
# (Async background processing via FastAPI BackgroundTasks - no broker needed)
# Security
python-jose = {extras = ["cryptography"], version = "^3.3.0"}
# bcrypt direct : passlib est incompatible avec bcrypt >= 4.1
bcrypt = ">=4.0,<6.0"
python-multipart = "^0.0.6"
# (Meilisearch replaced by PostgreSQL tsvector + pg_trgm)
# Document Processing
pypdf = "^3.17.0"
pdfplumber = "^0.10.0" # Better text extraction with layout preservation
python-docx = "^1.1.0"
pytesseract = "^0.3.10"
pdf2image = "^1.16.3"
# NLP & ML - Détection Langue v2.1
# numpy 2, exige par opencv-python (Docling). fastText est contourne :
# voir language_detector._fasttext_top1. Aligne sur requirements.txt.
numpy = ">=2.0,<3.0"
langdetect = "^1.0.9"
# fasttext-wheel et non fasttext : le paquet source n'a pas de roue et echoue
# a la compilation sur les Python recents. Aligne sur requirements.txt.
fasttext-wheel = "^0.9.2"
# ML - Catégorisation v2.1
scikit-learn = "^1.3.2"
joblib = "^1.3.2"
# LLM - Gemini API (SDK google-genai ; l'ancien google-generativeai est retire)
google-genai = "^1.0.0"
# Utils
python-dotenv = "^1.0.0"
httpx = ">=0.25.2,<1.0" # aligne sur requirements.txt ; Docling exige >=0.28
[tool.poetry.group.dev.dependencies]
# Aligne sur requirements-dev.txt, le manifeste reellement installe. Les deux
# avaient diverge : pytest 7 ici contre 8 la-bas, et pytest-asyncio 0.21 contre
# 0.24 — or la portee des boucles d'evenements, dont depend toute la suite, a
# change entre ces versions.
# Testing
pytest = "^8.3"
pytest-asyncio = "^0.24"
pytest-cov = "^5.0"
pytest-mock = "^3.14"
pytest-timeout = "^2.3"
respx = "^0.21"
httpx = ">=0.25.2,<1.0" # aligne sur requirements.txt ; Docling exige >=0.28
# aiosqlite retire : conftest.py tourne exclusivement sur PostgreSQL (pgvector,
# tsvector et les fonctions PostgreSQL n'existent pas sous SQLite).
# Linting & Formatting
black = "^24.0"
ruff = "^0.6"
# Type stubs
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
[tool.black]
line-length = 100
target-version = ['py311']
[tool.ruff]
line-length = 100
target-version = "py311"
# Le jeu de regles etait implicite : ruff tournait avec ses defauts et rendait
# 1332 signalements, dont 98 faux positifs sur le motif `Depends()` de FastAPI
# et 615 modernisations de style. Un controle que personne ne peut passer n'est
# pas un controle. Ce qui suit ne retient que ce qui signale un VRAI defaut.
[tool.ruff.lint]
select = [
"F", # erreurs reelles : nom inconnu, import inutilise, f-string sans champ
"E4", # imports mal places
"E7", # comparaisons douteuses (== None, type(x) == y)
"E9", # erreurs de syntaxe et d'execution
"I", # ordre des imports
"RUF100", # noqa devenus inutiles — ils masquent ce qu'ils ne masquent plus
]
ignore = [
# `Depends()`, `Query()`, `File()` en valeur par defaut sont LA convention
# FastAPI, pas un defaut. 98 occurrences legitimes.
"B008",
]
[tool.ruff.lint.per-file-ignores]
# Les migrations Alembic importent les modeles pour enregistrer les metadonnees
# sans les utiliser directement.
# env.py doit inserer la racine du projet dans sys.path AVANT d'importer les
# modeles : c'est le motif standard d'Alembic, et l'ordre n'est pas negociable.
"alembic/env.py" = ["F401", "E402"]
# Les scripts inserent eux aussi la racine dans sys.path avant leurs imports.
"scripts/**" = ["E402"]
# conftest surcharge DATABASE_URL avant d'importer l'application : l'ordre EST
# la protection contre des tests qui ecriraient dans la base de developpement.
# F841 : une variable de fixture liee et non lue nomme ce qui est mis en place.
"tests/**" = ["E402", "F841"]
[tool.mypy]
python_version = "3.11"
strict = true
warn_return_any = true
warn_unused_configs = true
# NOTE : la configuration pytest vit exclusivement dans pytest.ini.
# Un bloc [tool.pytest.ini_options] existait ici mais etait IGNORE en silence
# (pytest.ini a la priorite), et les deux avaient deja diverge sur la liste des
# marqueurs — avec --strict-markers, editer le mauvais fichier cassait la suite.
[tool.pyrefly]
# Exclude large directories to reduce memory usage
project_excludes = [
"../frontend",
"models/fasttext",
"models/*.bin",
"models/*.pkl",
"../data",
"data",
"htmlcov",
".pytest_cache",
]
python_version = "3.11"