[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "membersystem" description = '' readme = "README.md" requires-python = ">=3.11" keywords = [] authors = [ { name = "Víðir Valberg Guðmundsson", email = "valberg@orn.li" }, ] dependencies = [ "Django~=5.1", "django-allauth~=0.63", "django-money~=3.5", "django-oauth-toolkit~=2.4", "django-registries==0.0.3", "django-view-decorator==0.0.4", "django-oauth-toolkit~=2.4", "django-ratelimit~=4.1", "django-zen-queries~=2.1", "django_stubs_ext~=5.0", "environs[django]>=11,<12", "psycopg[binary]~=3.2", "stripe~=10.5", "uvicorn~=0.30", "whitenoise~=6.7", ] version = "0.0.1" [tool.hatch.build.targets.wheel] packages = ["src"] [tool.hatch.env] requires = ["hatch-pip-compile"] [tool.hatch.envs.default] type = "pip-compile" pip-compile-resolver = "uv" [tool.hatch.envs.dev] type = "pip-compile" pip-compile-resolver = "uv" dependencies = [ "coverage[toml]==7.3.0", "pytest==7.2.2", "pytest-cov", "pytest-django==4.5.2", "mypy==1.1.1", "django-stubs==1.16.0", "pip-tools==7.3.0", "django-debug-toolbar==4.2.0", "django-browser-reload==1.7.0", "model-bakery==1.17.0", ] [[tool.hatch.envs.tests.matrix]] python = ["3.12"] django = ["5.1"] [tool.hatch.envs.tests.overrides] matrix.django.dependencies = [ { value = "django~={matrix:django}" }, ] [tool.hatch.envs.default.scripts] cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=src --cov=tests --cov=append {args}" no-cov = "cov --no-cov {args}" typecheck = "mypy --config-file=pyproject.toml ." requirements = "hatch env run --env default -- python --version; hatch env run --env dev -- python --version" server = "./src/manage.py runserver 0.0.0.0:8000" migrate = "./src/manage.py migrate" makemigrations = "./src/manage.py makemigrations" createsuperuser = "./src/manage.py createsuperuser" shell = "./src/manage.py shell" # You need to install Stripe CLI from here to run this: https://github.com/stripe/stripe-cli/releases stripe_cli = "stripe listen --forward-to 0.0.0.0:8000/order/stripe/webhook/" [tool.pytest.ini_options] DJANGO_SETTINGS_MODULE="tests.settings" addopts = "--reuse-db" norecursedirs = "build dist docs .eggs/* *.egg-info htmlcov .git" python_files = "test*.py" testpaths = "tests" pythonpath = ". tests" [tool.coverage.run] branch = true parallel = true [tool.coverage.report] exclude_lines = [ "no cov", "if __name__ == .__main__.:", "if TYPE_CHECKING:", ] [tool.mypy] mypy_path = "src/" exclude = [ "venv/", "dist/", "docs/", ] namespace_packages = false show_error_codes = true strict = true warn_unreachable = true follow_imports = "normal" plugins = ["mypy_django_plugin.main"] [tool.django-stubs] django_settings_module = "project.settings" [[tool.mypy.overrides]] module = "tests.*" allow_untyped_defs = true [tool.ruff] target-version = "py312" extend-exclude = [ ".git", "__pycache__", "manage.py", "asgi.py", "wsgi.py", ] line-length = 120 [tool.ruff.lint] select = ["ALL"] ignore = [ "G004", # Logging statement uses f-string "ANN101", # Missing type annotation for `self` in method "ANN102", # Missing type annotation for `cls` in classmethod "EM101", # Exception must not use a string literal, assign to variable first "EM102", # Exception must not use a f-string literal, assign to variable first "COM812", # missing-trailing-comma (https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules) "ISC001", # single-line-implicit-string-concatenation (https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules) "D100", # Missing docstring in public module "D101", # Missing docstring in public class "D102", # Missing docstring in public method "D105", # Missing docstring in magic method "D106", # Missing docstring in public nested class "D107", # Missing docstring in `__init__` "FIX", # TODO, FIXME, XXX "TD", # TODO, FIXME, XXX "ANN002", # Missing type annotation for `*args` "ANN003", # Missing type annotation for `**kwargs` "FBT001", # Misbehaves: Boolean-typed positional argument in function definition "FBT002", # Misbehaves: Boolean-typed positional argument in function definition "TRY003", # Avoid specifying long messages outside the exception class ] [tool.ruff.lint.isort] force-single-line = true [tool.ruff.lint.per-file-ignores] "tests.py" = [ "S101", # Use of assert "SLF001", # Private member access "D100", # Docstrings "D103", # Docstrings ]