[project]
name = "eVibes"
version = "2026.1"
description = "eVibes — your store without the extra baggage. Everything works out of the box: storefront, product catalog, cart, and orders. Minimal complexity, maximum flexibility — install, adjust to your needs, and start selling."
authors = [{ name = "fureunoir", email = "contact@fureunoir.com" }]
readme = "README.md"
requires-python = ">=3.12,<=3.13"
dependencies = [
    "aiogram==3.23.0",
    "aiosmtpd==1.4.6",
    "channels==4.3.2",
    "channels-redis==4.3.0",
    "colorlog==6.10.1",
    "coverage==7.13.1",
    "click==8.3.1",
    "cryptography==46.0.3",
    "django==5.2.9",
    "django-cacheops==7.2",
    "django-constance==4.3.4",
    "django-cors-headers==4.9.0",
    "django-dbbackup==5.1.0",
    "django-elasticsearch-dsl==8.2",
    "django-extensions==4.1",
    "django-filter==25.2",
    "django-health-check==3.20.8",
    "django-import-export[all]==4.3.14",
    "django-json-widget==2.1.1",
    "django-mailbox==4.10.1",
    "django-model-utils==5.0.0",
    "django-modeltranslation==0.19.19",
    "django-mptt==0.18.0",
    "django-prometheus==2.4.1",
    "django-redis==6.0.0",
    "django-ratelimit==4.1.0",
    "django-storages==1.14.6",
    "django-summernote==0.8.20.0",
    "django-unfold==0.74.1",
    "django-unfold-markdown==0.1.2",
    "django-widget-tweaks==1.5.0",
    "django-md-field==0.1.0",
    "djangorestframework==3.16.1",
    "djangorestframework-recursive==0.1.2",
    "djangorestframework-simplejwt[crypto]==5.5.1",
    "djangorestframework-xml==2.0.0",
    "djangorestframework-yaml==2.0.0",
    "djangoql==0.18.1",
    "docutils==0.22.4",
    "drf-spectacular[sidecar]==0.29.0",
    "drf-spectacular-websocket==1.3.1",
    "drf-orjson-renderer==1.8.0",
    "elasticsearch-dsl==8.18.0",
    "filelock==3.20.1",
    "filetype==1.2.0",
    "graphene-django==3.2.3",
    "graphene-file-upload==1.3.0",
    "gunicorn==23.0.0",
    "httpx==0.28.1",
    "paramiko==4.0.0",
    "pillow==12.0.0",
    "pip==25.3",
    "polib==1.2.0",
    "PyJWT==2.10.1",
    "pytest==9.0.2",
    "pytest-django==4.11.1",
    "python-slugify==8.0.4",
    "psutil==7.2.1",
    "psycopg2-binary==2.9.11",
    "pymdown-extensions==10.19.1",
    "redis==7.1.0",
    "requests==2.32.5",
    "sentry-sdk[django,celery,opentelemetry]==2.48.0",
    "six==1.17.0",
    "swapper==1.4.0",
    "uvicorn==0.40.0",
    "zeep==4.3.2",
    "websockets==15.0.1",
    "whitenoise==6.11.0",
]

[project.optional-dependencies]
graph = ["pygraphviz==1.14; sys_platform != 'win32'"]
worker = [
    "celery==5.6.0",
    "django-celery-beat==2.8.1",
    "django-celery-results==2.6.0",
    "celery-prometheus-exporter==1.7.0",
]
linting = [
    "ty==0.0.7",
    "ruff==0.14.10",
    "celery-types==0.24.0",
    "django-stubs==5.2.8",
    "djangorestframework-stubs==3.16.6",
    "types-requests==2.32.4.20250913",
    "types-redis==4.6.0.20241004",
    "types-paramiko==4.0.0.20250822",
    "types-psutil==7.2.0.20251228",
    "types-pillow==10.2.0.20240822",
    "types-docutils==0.22.3.20251115",
    "types-six==1.17.0.20251009",
]
openai = ["openai==2.14.0"]
jupyter = ["jupyter==1.1.1"]

[tool.uv]
package = false

[tool.uv.pip]
python-version = "3.13"

[tool.ruff]
line-length = 88
target-version = "py312"
exclude = [
    "Dockerfiles",
    "monitoring",
    "scripts",
    "static",
    "storefront",
    "tmp",
    "media",
]

[tool.ruff.lint]
select = ["E4", "E7", "E9", "F", "B", "Q", "I"]
ignore = ["RUF012", "A002", "A003"]

[tool.ruff.lint.isort]
known-first-party = ["evibes", "engine"]

[tool.ruff.format]
quote-style = "double"
indent-style = "space"

[tool.ty.src]
exclude = [
    "Dockerfiles/**",
    "monitoring/**",
    "scripts/**",
    "static/**",
    "storefront/**",
    "tmp/**",
    "media/**",
]

[tool.ty.environment]
python-version = "3.12"

[tool.ty.terminal]
output-format = "concise"

[tool.ty.rules]
possibly-unresolved-reference = "warn"
possibly-missing-attribute = "warn"
possibly-missing-import = "warn"
unsupported-base = "warn"


[tool.django-stubs]
django_settings_module = "evibes.settings.__init__"
