[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.24.0", "aiosmtpd==1.4.6", "channels==4.3.2", "channels-redis==4.3.0", "colorlog==6.10.1", "coverage==7.13.2", "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.2", "django-elasticsearch-dsl==8.2", "django-extensions==4.1", "django-filter==25.2", "django-health-check==3.20.8", "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-prometheus==2.4.1", "django-redis==6.0.0", "django-ratelimit==4.1.0", "django-storages==1.14.6", "django-unfold==0.76.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.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.3", "filetype==1.2.0", "graphene-django==3.2.3", "graphene-file-upload==1.3.0", "httpx==0.28.1", "paramiko==4.0.0", "pillow==12.1.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", "psycopg[binary]==3.2.9", "redis==7.1.0", "requests==2.32.5", "sentry-sdk[django,celery,opentelemetry]==2.50.0", "six==1.17.0", "swapper==1.4.0", "uvicorn==0.40.0", "zeep==4.3.2", "websockets==16.0", "whitenoise==6.11.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.13", "ruff==0.14.14", "celery-types==0.24.0", "django-stubs==5.2.9", "djangorestframework-stubs==3.16.7", "types-requests==2.32.4.20260107", "types-redis==4.6.0.20241004", "types-paramiko==4.0.0.20250822", "types-psutil==7.2.1.20260116", "types-pillow==10.2.0.20240822", "types-docutils==0.22.3.20251115", "types-six==1.17.0.20251009", ] openai = ["openai==2.15.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__"