[project] name = "cookiecutter-django" version = "2025.09.11" 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.28.0", "djlint==1.36.4", "gitpython==3.1.45", "jinja2==3.1.6", "pre-commit==4.3.0", "pygithub==2.8.1", "pytest==8.4.2", "pytest-cookies==0.7", "pytest-instafail==0.5", "pytest-xdist==3.8.0", "pyyaml==6.0.2", "requests==2.32.5", "ruff==0.13.0", "sh==2.2.2; sys_platform!='win23'", "tox==4.30.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 = "py39" line-length = 119 # Exclude the template content as most files aren't parseable extend-exclude = [ "[{]{2}cookiecutter.project_slug[}]{2}/*", "docs/*", ] lint.select = [ "A", # "ANN", # flake8-annotations: we should support this in the future but many 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", "PERF", "PGH", "PIE", "PL", "PT", # "ARG", # Unused function argument "PTH", "PYI", "Q", "RET", "RSE", # "FURB", # "LOG", "RUF", "S", "SIM", "SLF", "SLOT", "T10", "TC", "TID", "TRY", "UP", "W", "YTT", ] lint.ignore = [ "EM101", "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 "TRY003", # Avoid specifying long messages outside the exception class ] lint.isort.force-single-line = true [tool.pyproject-fmt] keep_full_version = true # ==== pytest ==== [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