[project] name = "schon" version = "2026.1" description = "Schon — 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.25.0", "aiosmtpd==1.4.6", "channels==4.3.2", "channels-redis==4.3.0", "colorlog==6.10.1", "coverage==7.13.4", "click==8.3.1", "cryptography==46.0.5", "django==5.2.11", "django-cacheops==7.2", "django-constance==4.3.4", "django-cors-headers==4.9.0", "django-dbbackup==5.2.0", "django-elasticsearch-dsl==8.2", "django-extensions==4.1", "django-filter==25.2", "django-health-check==4.0.6", "django-import-export[all]==4.4.0", "django-json-widget==2.1.1", "django-model-utils==5.0.0", "django-md-field==0.1.0", "django-modeltranslation==0.19.19", "django-mptt==0.18.0", "django-redis==6.0.0", "django-ratelimit==4.1.0", "django-storages==1.14.6", "django-unfold==0.81.0", "django-unfold-markdown==0.1.2", "django-debug-toolbar==6.2.0", "django-widget-tweaks==1.5.1", "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.19.1", "docutils==0.22.4", "drf-spectacular==0.29.0", "drf-spectacular-websocket==1.3.1", "drf-orjson-renderer==1.8.0", "elasticsearch-dsl==8.18.0", "filelock==3.24.3", "filetype==1.2.0", "graphene-django==3.2.3", "graphene-file-upload==1.3.0", "httpx==0.28.1", "markdown==3.10.2", "opentelemetry-instrumentation-django==0.60b1", "paramiko==4.0.0", "pillow==12.1.1", "pip==26.0.1", "polib==1.2.0", "PyJWT==2.11.0", "pytest==9.0.2", "pytest-django==4.12.0", "python-slugify==8.0.4", "psutil==7.2.2", "psycopg[binary]==3.3.3", "redis==7.2.1", "requests==2.32.5", "sentry-sdk[django,celery,opentelemetry]==2.53.0", "six==1.17.0", "swapper==1.4.0", "uvicorn==0.41.0", "zeep==4.3.2", "websockets==16.0", "whitenoise==6.12.0", ] [project.optional-dependencies] worker = [ "celery==5.6.2", "django-celery-beat==2.8.1", "django-celery-results==2.6.0", ] linting = [ "ty==0.0.16", "ruff==0.15.4", "celery-types==0.24.0", "django-stubs==5.2.9", "djangorestframework-stubs==3.16.8", "types-requests==2.32.4.20260107", "types-redis==4.6.0.20241004", "types-paramiko==4.0.0.20250822", "types-psutil==7.2.2.20260130", "types-pillow==10.2.0.20240822", "types-docutils==0.22.3.20260223", "types-six==1.17.0.20251009", ] openai = ["openai==2.24.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 = ["schon", "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 = "schon.settings.__init__"