[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.8", "django-cacheops==7.2", "django-constance==4.3.4", "django-cors-headers==4.9.0", "django-dbbackup==5.0.1", "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.0", "django-mailbox==4.10.1", "django-model-utils==5.0.0", "django-modeltranslation==0.19.17", "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-stubs==5.2.8", "django-summernote==0.8.20.0", "django-unfold==0.73.1", "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-stubs==3.16.6", "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", "elasticsearch-dsl==8.18.0", "filelock==3.20.0", "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.18", "redis==7.1.0", "requests==2.32.5", "sentry-sdk[django,celery,opentelemetry]==2.47.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 = [ "isort==7.0.0", "mypy==1.19.0", "mypy-extensions==1.1.0", "ruff==0.14.8", "celery-stubs==0.1.3", "celery-types>=0.23.0", ] openai = ["openai==2.9.0"] jupyter = ["jupyter==1.1.1"] [tool.uv] package = false [tool.uv.pip] python-version = "3.13" [tool.mypy] strict = false disable_error_code = ["import-untyped", "no-redef"] exclude = "(^|[\\/])(migrations|storefront)([\\/]|$)" plugins = ["mypy_django_plugin.main", "mypy_drf_plugin.main"] [tool.django-stubs] django_settings_module = "evibes.settings" [tool.ruff] line-length = 120 target-version = "py312" exclude = ["media", "static", "storefront"] [tool.ruff.lint] select = ["E4", "E7", "E9", "F", "B", "Q"] ignore = ["RUF012", "A002", "A003"] [tool.ruff.format] quote-style = "double" indent-style = "space"