[project] name = "dealix-api" version = "0.1.0" description = "Dealix — Sovereign Deal, Growth & Commitment OS" requires-python = ">=3.12,<3.13" readme = "../README.md" license = { text = "Proprietary" } dependencies = [ # Core framework "fastapi>=0.115.0,<0.116.0", "uvicorn[standard]>=0.32.0,<0.33.0", "pydantic>=2.10.0,<3.0.0", "pydantic-settings>=2.10.1,<3.0.0", "pydantic-extra-types[phonenumbers]>=2.0.0", "python-multipart==0.0.12", # Database "sqlalchemy==2.0.36", "asyncpg==0.30.0", "psycopg2-binary==2.9.10", "alembic==1.14.0", "pgvector==0.3.6", # AI / LLM Providers "litellm>=1.74.0,<2", "instructor>=1.14.0", "groq==0.12.0", "openai>=2.8.0,<3", # Async tasks "celery>=5.4.0,<6", "redis>=5.2.0,<6", # Auth & Security "pyjwt>=2.10.0", "passlib[bcrypt]>=1.7.4", "bcrypt>=4.2.0", "python-jose>=3.3.0", "slowapi>=0.1.9", # Communication "httpx>=0.28.1,<0.29.0", # Arabic NLP "pyarabic>=0.6.0", # PDF + docs "weasyprint>=60.0", # Observability "sentry-sdk>=2.0.0", "prometheus-client>=0.21.0", "prometheus-fastapi-instrumentator>=7.0.0", "structlog>=24.0.0", "opentelemetry-api>=1.27.0,<2", "opentelemetry-sdk>=1.27.0,<2", "opentelemetry-instrumentation-fastapi>=0.48b0", "opentelemetry-instrumentation-sqlalchemy>=0.48b0", # Utils "tenacity>=9.0.0", "python-dotenv>=1.0.0", ] [dependency-groups] dev = [ "pytest==8.3.4", "pytest-asyncio==0.24.0", "pytest-cov==5.0.0", "aiosqlite==0.20.0", "factory-boy>=3.3.0", "ruff>=0.7.0", "mypy>=1.13.0", "testcontainers>=4.8.0", ] [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" filterwarnings = ["ignore::DeprecationWarning"] markers = [ "launch: pre-release surface & scenario checks", "slow: tests that hit external IO or long LangGraph paths", ] [tool.ruff] line-length = 120 target-version = "py312" [tool.ruff.lint] select = ["E", "W", "F", "I", "B", "C4", "UP"] ignore = ["E501"] # line too long handled by formatter [tool.mypy] python_version = "3.12" ignore_missing_imports = true warn_return_any = false warn_unused_configs = true