[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"