[project]
name = "cookiecutter-django"
version = "2024.12.27"
description = "A Cookiecutter template for creating production-ready Django projects quickly."
readme = "README.md"
keywords = [
  "cookiecutter",
  "django",
  "project template",
  "scaffolding",
  "skeleton",
]
license = { text = "BSD" }
authors = [
  { name = "Daniel Roy Greenfeld", email = "pydanny@gmail.com" },
]
requires-python = ">=3.12,<3.13"
classifiers = [
  "Development Status :: 4 - Beta",
  "Environment :: Console",
  "Framework :: Django :: 5.0",
  "Intended Audience :: Developers",
  "License :: OSI Approved :: BSD License",
  "Natural Language :: English",
  "Programming Language :: Python",
  "Programming Language :: Python :: 3 :: Only",
  "Programming Language :: Python :: 3.12",
  "Programming Language :: Python :: Implementation :: CPython",
  "Topic :: Software Development",
]
dependencies = [
  "binaryornot==0.4.4",
  "cookiecutter==2.6",
  "django-upgrade==1.22.2",
  "djlint==1.36.4",
  "gitpython==3.1.43",
  "jinja2==3.1.5",
  "pre-commit==3.8",
  "pygithub==2.5",
  "pytest==8.3.4",
  "pytest-cookies==0.7",
  "pytest-instafail==0.5",
  "pytest-xdist==3.6.1",
  "pyyaml==6.0.2",
  "requests==2.32.3",
  "ruff==0.8.4",
  "sh==2.1; sys_platform!='win23'",
  "tox==4.23.2",
  "tox-uv>=1.17",
]
urls = { Repository = "https://github.com/cookiecutter/cookiecutter-django" }

[dependency-groups]
docs = [
  "myst-parser>=4",
  "sphinx>=8.0.2",
  "sphinx-autobuild>=2024.10.3",
  "sphinx-rtd-theme>=3",
]

[tool.ruff]
target-version = "py312"
# Exclude the template content as most files aren't parseable
extend-exclude = [
  "{{cookiecutter.project_slug}}/*",
]

lint.select = [
  "A",
  # "ANN", # flake8-annotations: we should support this in the future but 100+ errors atm
  "ASYNC",
  "B",
  "BLE",
  "C4",
  "C90",
  "COM",
  "DTZ",
  "E",
  "EM",
  "ERA",
  "EXE",
  "F",
  "FA",
  "FBT",
  "FLY",
  "G",
  "I",
  "ICN",
  "INP",
  "INT",
  "ISC",
  "N",
  "PD",
  # "NPY",
  # "AIR",
  "PERF",
  "PGH",
  "PIE",
  "PL",
  "PT",
  # "ARG", # Unused function argument
  "PTH",
  "PYI",
  "Q",
  "RET",
  "RSE",
  # "FURB",
  # "LOG",
  "RUF",
  "S",
  "SIM",
  "SLF",
  "SLOT",
  "T10",
  "T20",
  "TCH",
  "TID",
  "TRY",
  "UP",
  "W",
  "YTT",
]
lint.ignore = [
  "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar`
  "S101",   # Use of assert detected https://docs.astral.sh/ruff/rules/assert/
  "SIM102", # sometimes it's better to nest
  "UP038",  # Checks for uses of isinstance/issubclass that take a tuple
  # of types for comparison.
  # Deactivated because it can make the code slow:
  # https://github.com/astral-sh/ruff/issues/7871
]
# The fixes in extend-unsafe-fixes will require
# provide the `--unsafe-fixes` flag when fixing.
lint.extend-unsafe-fixes = [
  "UP038",
]
lint.isort.force-single-line = true

[tool.pytest.ini_options]
addopts = "-v --tb=short"
norecursedirs = [
  ".tox",
  ".git",
  "*/migrations/*",
  "*/static/*",
  "docs",
  "venv",
  "*/{{cookiecutter.project_slug}}/*",
]

# ==== djLint ====

[tool.djlint]
blank_line_after_tag = "load,extends"
close_void_tags = true
format_css = true
format_js = true
# TODO: remove T002 when fixed https://github.com/Riverside-Healthcare/djLint/issues/687
ignore = "H006,H030,H031,T002,T028"
ignore_blocks = "raw"
include = "H017,H035"
indent = 2
max_line_length = 119
profile = "jinja"

[tool.djlint.css]
indent_size = 2

[tool.djlint.js]
indent_size = 2
