[project] name = "eVibes" version = "2025.4" 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.0", "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.0", "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-camel-case==1.4.2", "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.3", "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.1.3", "psycopg2==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.38.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 = [ "ruff==0.14.9", "basedpyright>=1.36.1", "pyright==1.1.407", "celery-types>=0.23.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.1.3.20251211", "types-pillow==10.2.0.20240822", "types-docutils==0.22.3.20251115", "types-six==1.17.0.20251009", ] openai = ["openai==2.13.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 = ["media", "static", "storefront"] [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.pyright] typeCheckingMode = "strict" pythonVersion = "3.12" useLibraryCodeForTypes = true reportMissingTypeStubs = true reportGeneralTypeIssues = false reportRedeclaration = false exclude = [ "**/__pycache__/**", "**/.venv/**", "**/.uv/**", "media/**", "static/**", "storefront/**", "**/migrations/**", ] extraPaths = ["./evibes", "./engine"] [tool.basedpyright] typeCheckingMode = "strict" pythonVersion = "3.12" useLibraryCodeForTypes = true reportMissingTypeStubs = true reportGeneralTypeIssues = false reportRedeclaration = false exclude = [ "**/__pycache__/**", "**/.venv/**", "**/.uv/**", "media/**", "static/**", "storefront/**", "**/migrations/**", ] extraPaths = ["./evibes", "./engine"] [tool.django-stubs] django_settings_module = "evibes.settings.__init__"