[build-system] requires = ["hatchling>=1.32.4"] build-backend = "hatchling.build" [project] name = "wger" dynamic = ["version", ] authors = [ { name = "wger team", email = "hello@wger.de" }, ] description = "FLOSS workout, fitness and weight manager/tracker" readme = "README.md" requires-python = ">=3.12" license = "AGPL-3.0-or-later" license-files = ["LICENSE.txt", "AUTHORS.md"] classifiers = [ # http://pypi.python.org/pypi?%3Aaction=list_classifiers 'Development Status :: 5 - Production/Stable', 'Environment :: Web Environment', 'Intended Audience :: Other Audience', 'Framework :: Django', 'Operating System :: OS Independent', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.12', 'Programming Language :: Python :: 3.13', 'Programming Language :: Python :: 3.14', ] dependencies = [ "boto3~=1.43.2", "celery[redis]~=5.6.0", "crispy-bootstrap5~=2026.3", "django-activity-stream~=2.0.0", "django-allauth[mfa,idp-oidc]~=65.20.0", "django-axes[ipware]~=8.3.1", "django-bootstrap-breadcrumbs2==1.0.0", "django-cors-headers~=4.9.0", "django-crispy-forms~=2.5", "django-environ~=0.14.0", "django-filter~=26.2", "django-formtools~=2.7", "django-prometheus~=2.5.0", "django-recaptcha~=4.1.0", "django-redis~=7.0.0", "django-simple-history~=3.13.0", "django-sortedm2m~=4.0.0", "django-storages~=1.14.6", "djangorestframework-simplejwt[crypto]~=5.5.1", "djangorestframework~=3.18.2", "django[argon2]~=6.0.7", "drf-spectacular[sidecar]~=0.30.0", "easy-thumbnails~=2.10.1", "flower~=2.2.0", "fontawesomefree~=6.6.0", "gevent>=26.5.0", "icalendar~=7.3.0", "invoke~=3.0.3", "lingua-language-detector~=2.2.0", "markdownify~=1.2", "markdown-it-py~=4.2", "nh3~=0.3", "openfoodfacts~=5.4.0", "packaging~=26.2", "pillow~=13.0.0", "psycopg[binary]~=3.3.2", "reportlab~=5.1.0", "requests~=2.34.0", "tqdm~=4.70.0", "tzdata~=2026.5", ] [dependency-groups] dev = [ "coverage~=7.17.0", "django-debug-toolbar~=8.0.0", "django-extensions~=4.1", "faker~=40.43.0", "hatchling~=1.32.4", "ruff~=0.17.0", "tblib~=3.2.0", ] docker = [ "gunicorn~=26.2.0", ] [project.urls] Homepage = "https://wger.de/" Documentation = "https://wger.readthedocs.io" Repository = "https://github.com/wger-project/wger" Issues = "https://github.com/wger-project/wger/issues" Changelog = "https://wger.readthedocs.io/en/latest/changelog.html" Funding = "https://buymeacoffee.com/wger" [project.scripts] wger = "wger.__main__:main" [tool.uv] # CI and Docker run on Linux: locking must fail if a version has no Linux artifacts required-environments = [ "sys_platform == 'linux' and platform_machine == 'x86_64'", "sys_platform == 'linux' and platform_machine == 'aarch64'", ] [tool.hatch.version] source = "code" path = "wger/version.py" expression = "get_version()" [tool.ty.rules] unresolved-attribute = "ignore" [tool.ruff] # Exclude a variety of commonly ignored directories. exclude = [ ".bzr", ".direnv", ".eggs", ".git", ".git-rewrite", ".hg", ".ipynb_checkpoints", ".mypy_cache", ".nox", ".pants.d", ".pyenv", ".pytest_cache", ".pytype", ".ruff_cache", ".svn", ".tox", ".vscode", "__pypackages__", "_build", "buck-out", "build", "dist", "node_modules", "site-packages", "venv", ".venv", ] line-length = 100 indent-width = 4 src = ["wger", "extras"] [tool.ruff.lint] select = [ "F", # Pyflakes "E", # Pycodestyle "W", "I", # isort ] [tool.ruff.lint.per-file-ignores] # Import sorting was historically skipped for these (isort's "skip" list) "**/migrations/*.py" = ["I", "F401", "E501"] "settings/*.py" = ["I"] "extras/**/*.py" = ["I"] "**/apps.py" = ["I"] # These re-export the models of their app, the imports are the public API "**/__init__.py" = ["F401"] # # TODO: ruff doesn't understand force_grid_wrap=2 yet, if that is ever implemented, # we should add the appropriate configurations [tool.ruff.lint.isort] known-first-party = ["wger"] section-order = ["future", "standard-library", "django", "third-party", "first-party", "local-folder"] combine-as-imports = true order-by-type = true lines-after-imports = 2 [tool.ruff.lint.isort.sections] django = ["django"] [tool.ruff.lint.isort.import-heading] future = "Future" standard-library = "Standard Library" django = "Django" third-party = "Third Party" first-party = "wger" local-folder = "Local" [tool.ruff.format] quote-style = "single" indent-style = "space" skip-magic-trailing-comma = false # Like Black, respect magic trailing commas. line-ending = "auto"