diff --git a/.editorconfig b/.editorconfig
index 6a9a5c45d..d8719a1e5 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -12,7 +12,7 @@ trim_trailing_whitespace = true
indent_style = space
indent_size = 4
-[*.{html,css,scss,json,yml,xml}]
+[*.{html,css,scss,json,yml,xml,toml}]
indent_style = space
indent_size = 2
diff --git a/.github/contributors.json b/.github/contributors.json
index 55e8d4f38..d0f885c92 100644
--- a/.github/contributors.json
+++ b/.github/contributors.json
@@ -1693,5 +1693,10 @@
"name": "Alan Cyment",
"github_login": "acyment",
"twitter_username": ""
+ },
+ {
+ "name": "Kawsar Alam Foysal",
+ "github_login": "iamfoysal",
+ "twitter_username": ""
}
]
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index a24abcfef..14935baab 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -2,23 +2,16 @@
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
+enable-beta-ecosystems: true
updates:
# Update Python deps for the template (not the generated project)
- - package-ecosystem: "pip"
+ - package-ecosystem: "uv"
directory: "/"
schedule:
interval: "daily"
labels:
- "project infrastructure"
- # Update Python deps for the documentation
- - package-ecosystem: "pip"
- directory: "docs/"
- schedule:
- interval: "daily"
- labels:
- - "project infrastructure"
-
# Update GitHub actions in workflows
- package-ecosystem: "github-actions"
directory: "/"
@@ -36,11 +29,11 @@ updates:
- "update"
# Enable version updates for Docker
- # We need to specify each Dockerfile in a separate entry because Dependabot doesn't
- # support wildcards or recursively checking subdirectories. Check this issue for updates:
- # https://github.com/dependabot/dependabot-core/issues/2178
- package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/local/django/"
+ directories:
+ - "{{cookiecutter.project_slug}}/compose/local/django/"
+ - "{{cookiecutter.project_slug}}/compose/local/docs/"
+ - "{{cookiecutter.project_slug}}/compose/production/django/"
schedule:
interval: "daily"
ignore:
@@ -52,60 +45,12 @@ updates:
- "update"
- package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/local/docs/"
- schedule:
- interval: "daily"
- ignore:
- - dependency-name: "*"
- update-types:
- - "version-update:semver-major"
- - "version-update:semver-minor"
- labels:
- - "update"
-
- - package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/local/node/"
- schedule:
- interval: "daily"
- labels:
- - "update"
-
- - package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/production/aws/"
- schedule:
- interval: "daily"
- labels:
- - "update"
-
- - package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/production/django/"
- schedule:
- interval: "daily"
- ignore:
- - dependency-name: "*"
- update-types:
- - "version-update:semver-major"
- - "version-update:semver-minor"
- labels:
- - "update"
-
- - package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/production/postgres/"
- schedule:
- interval: "daily"
- labels:
- - "update"
-
- - package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/production/nginx/"
- schedule:
- interval: "daily"
- versioning-strategy: increase
- labels:
- - "update"
-
- - package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/production/traefik/"
+ directories:
+ - "{{cookiecutter.project_slug}}/compose/local/node/"
+ - "{{cookiecutter.project_slug}}/compose/production/aws/"
+ - "{{cookiecutter.project_slug}}/compose/production/postgres/"
+ - "{{cookiecutter.project_slug}}/compose/production/nginx/"
+ - "{{cookiecutter.project_slug}}/compose/production/traefik/"
schedule:
interval: "daily"
labels:
diff --git a/.github/workflows/align-versions.yml b/.github/workflows/align-versions.yml
index 0f2d09235..2ded34062 100644
--- a/.github/workflows/align-versions.yml
+++ b/.github/workflows/align-versions.yml
@@ -5,6 +5,8 @@ on:
paths:
- "{{cookiecutter.project_slug}}/requirements/local.txt"
- "{{cookiecutter.project_slug}}/compose/local/node/Dockerfile"
+ # Manual trigger
+ workflow_dispatch:
permissions:
contents: write
@@ -19,9 +21,13 @@ jobs:
strategy:
fail-fast: false
matrix:
- script:
- - scripts/ruff_version.py
- - scripts/node_version.py
+ job:
+ - script: scripts/ruff_version.py
+ name: Ruff
+ - script: scripts/node_version.py
+ name: Node
+
+ name: "${{ matrix.job.name }} versions"
steps:
- name: Checkout with token
uses: actions/checkout@v4
@@ -38,7 +44,7 @@ jobs:
- uses: astral-sh/setup-uv@v5
- - run: uv run ${{ matrix.script }}
+ - run: uv run ${{ matrix.job.script }}
- uses: stefanzweifel/git-auto-commit-action@v5
with:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index c1dd63d9a..fdd9438ca 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -103,6 +103,6 @@ jobs:
run: uv sync
- uses: actions/setup-node@v4
with:
- node-version: "22.13"
+ node-version: "22.14"
- name: Bare Metal ${{ matrix.script.name }}
run: sh tests/test_bare.sh ${{ matrix.script.args }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f673bc4e8..cd6863e98 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,137 @@ All enhancements and patches to Cookiecutter Django will be documented in this f
+## 2025.03.15
+
+
+### Updated
+
+- Update psycopg to 3.2.6 ([#5721](https://github.com/cookiecutter/cookiecutter-django/pull/5721))
+
+- Update ruff to 0.11.0 ([#5724](https://github.com/cookiecutter/cookiecutter-django/pull/5724))
+
+## 2025.03.08
+
+
+### Updated
+
+- Update ruff to 0.9.10 ([#5720](https://github.com/cookiecutter/cookiecutter-django/pull/5720))
+
+## 2025.03.06
+
+
+### Updated
+
+- Update django to 5.0.13 ([#5719](https://github.com/cookiecutter/cookiecutter-django/pull/5719))
+
+## 2025.03.04
+
+
+### Changed
+
+- Add groups for dependabot updates ([#5709](https://github.com/cookiecutter/cookiecutter-django/pull/5709))
+
+### Updated
+
+- Update sphinx to 8.3.0 ([#5714](https://github.com/cookiecutter/cookiecutter-django/pull/5714))
+
+- Update pytest to 8.3.5 ([#5713](https://github.com/cookiecutter/cookiecutter-django/pull/5713))
+
+## 2025.03.01
+
+
+### Updated
+
+- Update ruff to 0.9.9 ([#5711](https://github.com/cookiecutter/cookiecutter-django/pull/5711))
+
+## 2025.02.28
+
+
+### Updated
+
+- Update ruff to 0.9.8 ([#5708](https://github.com/cookiecutter/cookiecutter-django/pull/5708))
+
+- Bump babel-loader from 9.2.1 to 10.0.0 ([#5710](https://github.com/cookiecutter/cookiecutter-django/pull/5710))
+
+## 2025.02.26
+
+
+### Updated
+
+- Bump traefik from 3.3.3 to 3.3.4 ([#5705](https://github.com/cookiecutter/cookiecutter-django/pull/5705))
+
+## 2025.02.25
+
+
+### Documentation
+
+- Fix links to FAQ about `contrib.sites` directory ([#5704](https://github.com/cookiecutter/cookiecutter-django/pull/5704))
+
+## 2025.02.23
+
+
+### Changed
+
+- Group dependabot docker directories ([#5698](https://github.com/cookiecutter/cookiecutter-django/pull/5698))
+
+### Updated
+
+- Update sphinx to 8.2.1 ([#5696](https://github.com/cookiecutter/cookiecutter-django/pull/5696))
+
+- Update psycopg to 3.2.5 ([#5697](https://github.com/cookiecutter/cookiecutter-django/pull/5697))
+
+## 2025.02.21
+
+
+### Updated
+
+- Update djangorestframework-stubs to 3.15.3 ([#5695](https://github.com/cookiecutter/cookiecutter-django/pull/5695))
+
+- Update sphinx to 8.2.0 ([#5693](https://github.com/cookiecutter/cookiecutter-django/pull/5693))
+
+- Update ruff to 0.9.7 ([#5694](https://github.com/cookiecutter/cookiecutter-django/pull/5694))
+
+## 2025.02.17
+
+
+### Updated
+
+- Update sentry-sdk to 2.22.0 ([#5692](https://github.com/cookiecutter/cookiecutter-django/pull/5692))
+
+- Update django-storages to 1.14.5 ([#5690](https://github.com/cookiecutter/cookiecutter-django/pull/5690))
+
+## 2025.02.14
+
+
+### Updated
+
+- Bump node from 22.13 to 22.14 ([#5688](https://github.com/cookiecutter/cookiecutter-django/pull/5688))
+
+## 2025.02.13
+
+
+### Updated
+
+- Update sentry-sdk to 2.21.0 ([#5687](https://github.com/cookiecutter/cookiecutter-django/pull/5687))
+
+## 2025.02.11
+
+
+### Updated
+
+- Update coverage to 7.6.12 ([#5686](https://github.com/cookiecutter/cookiecutter-django/pull/5686))
+
+## 2025.02.10
+
+
+### Updated
+
+- Update pytest-django to 4.10.0 ([#5684](https://github.com/cookiecutter/cookiecutter-django/pull/5684))
+
+- Update ruff to 0.9.6 ([#5683](https://github.com/cookiecutter/cookiecutter-django/pull/5683))
+
+- Bump amazon/aws-cli from 2.23.0 to 2.24.0 ([#5682](https://github.com/cookiecutter/cookiecutter-django/pull/5682))
+
## 2025.02.08
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index f92ecba61..c2eab4073 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -1321,6 +1321,13 @@ Listed in alphabetical order.
Keith Bailey |
diff --git a/docs/conf.py b/docs/conf.py
index 82098a168..1b057bb4d 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -188,7 +188,7 @@ latex_documents = [
"cookiecutter-django Documentation",
"cookiecutter-django",
"manual",
- )
+ ),
]
# The name of an image file (relative to this directory) to place at the top of
@@ -223,7 +223,7 @@ man_pages = [
"Cookiecutter Django documentation",
["Daniel Roy Greenfeld"],
1,
- )
+ ),
]
# If true, show URL addresses after external links.
@@ -242,7 +242,7 @@ texinfo_documents = [
"Cookiecutter Django documentation",
"Daniel Roy Greenfeld",
"Cookiecutter Django",
- "A Cookiecutter template for creating production-ready " "Django projects quickly.",
+ "A Cookiecutter template for creating production-ready Django projects quickly.",
"Miscellaneous",
)
]
diff --git a/pyproject.toml b/pyproject.toml
index 0689d2d36..8ff2ef82f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "cookiecutter-django"
-version = "2025.02.08"
+version = "2025.03.15"
description = "A Cookiecutter template for creating production-ready Django projects quickly."
readme = "README.md"
keywords = [
@@ -43,7 +43,7 @@ dependencies = [
"pytest-xdist==3.6.1",
"pyyaml==6.0.2",
"requests==2.32.3",
- "ruff==0.9.6",
+ "ruff==0.11.0",
"sh==2.1; sys_platform!='win23'",
"tox==4.23.2",
"tox-uv>=1.17",
diff --git a/scripts/create_django_issue.py b/scripts/create_django_issue.py
index 2e59f18b0..e728da798 100644
--- a/scripts/create_django_issue.py
+++ b/scripts/create_django_issue.py
@@ -12,7 +12,6 @@ from __future__ import annotations
import os
import re
import sys
-from collections.abc import Iterable
from pathlib import Path
from typing import TYPE_CHECKING, Any, NamedTuple
@@ -20,6 +19,8 @@ import requests
from github import Github
if TYPE_CHECKING:
+ from collections.abc import Iterable
+
from github.Issue import Issue
CURRENT_FILE = Path(__file__)
@@ -83,7 +84,7 @@ def get_name_and_version(requirements_line: str) -> tuple[str, ...]:
def get_all_latest_django_versions(
- django_max_version: tuple[DjVersion] = None,
+ django_max_version: tuple[DjVersion] | None = None,
) -> tuple[DjVersion, list[DjVersion]]:
"""
Grabs all Django versions that are worthy of a GitHub issue.
@@ -221,8 +222,7 @@ class GitHubManager:
if supported_dj_versions:
if any(v >= needed_dj_version for v in supported_dj_versions):
return package_info["info"]["version"], "✅"
- else:
- return "", "❌"
+ return "", "❌"
# Django classifier DNE; assume it isn't a Django lib
# Great exceptions include pylint-django, where we need to do this manually...
diff --git a/scripts/node_version.py b/scripts/node_version.py
index c478c60cc..2fca03702 100644
--- a/scripts/node_version.py
+++ b/scripts/node_version.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
import json
from pathlib import Path
@@ -11,16 +13,14 @@ CI_YML = ROOT / ".github" / "workflows" / "ci.yml"
def main() -> None:
new_version = get_version_from_dockerfile()
- if new_version is None:
- raise RuntimeError(f"No version found in {DOCKERFILE}")
-
old_version = get_version_from_package_json()
if old_version != new_version:
update_package_json_version(old_version, new_version)
update_ci_node_version(old_version, new_version)
+ update_production_node_version(old_version, new_version)
-def get_version_from_dockerfile() -> str | None:
+def get_version_from_dockerfile() -> str:
# Extract version out of base image name:
# FROM docker.io/node:22.13-bookworm-slim
# -> 22.13
@@ -30,6 +30,7 @@ def get_version_from_dockerfile() -> str | None:
_, _, docker_tag = line.partition(":")
version_str, _, _ = docker_tag.partition("-")
return version_str
+ raise RuntimeError("Could not find version in Dockerfile")
def get_version_from_package_json() -> str:
diff --git a/scripts/ruff_version.py b/scripts/ruff_version.py
index acc6beb14..4b0ab965c 100644
--- a/scripts/ruff_version.py
+++ b/scripts/ruff_version.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
import subprocess
import tomllib
from pathlib import Path
@@ -9,7 +11,7 @@ PRE_COMMIT_CONFIG = TEMPLATED_ROOT / ".pre-commit-config.yaml"
PYPROJECT_TOML = ROOT / "pyproject.toml"
-def main():
+def main() -> None:
new_version = get_requirements_txt_version()
old_version = get_pyproject_toml_version()
if old_version == new_version:
@@ -19,22 +21,23 @@ def main():
subprocess.run(["uv", "lock", "--no-upgrade"], cwd=ROOT)
-def get_requirements_txt_version():
+def get_requirements_txt_version() -> str:
content = REQUIREMENTS_LOCAL_TXT.read_text()
for line in content.split("\n"):
if line.startswith("ruff"):
return line.split(" ")[0].split("==")[1]
- return None
+ raise RuntimeError("Could not find ruff version in requirements/local.txt")
-def get_pyproject_toml_version():
+def get_pyproject_toml_version() -> str:
data = tomllib.loads(PYPROJECT_TOML.read_text())
for dependency in data["project"]["dependencies"]:
if dependency.startswith("ruff=="):
return dependency.split("==")[1]
+ raise RuntimeError("Could not find ruff version in pyproject.toml")
-def update_ruff_version(old_version, new_version):
+def update_ruff_version(old_version: str, new_version: str) -> None:
# Update pyproject.toml
new_content = PYPROJECT_TOML.read_text().replace(
f"ruff=={old_version}",
diff --git a/tests/test_cookiecutter_generation.py b/tests/test_cookiecutter_generation.py
index f09d60b27..ac9e1a6fb 100755
--- a/tests/test_cookiecutter_generation.py
+++ b/tests/test_cookiecutter_generation.py
@@ -272,7 +272,7 @@ def test_djlint_check_passes(cookies, context_override):
@pytest.mark.parametrize(
- ["use_docker", "expected_test_script"],
+ ("use_docker", "expected_test_script"),
[
("n", "pytest"),
("y", "docker compose -f docker-compose.local.yml run django pytest"),
@@ -297,7 +297,7 @@ def test_travis_invokes_pytest(cookies, context, use_docker, expected_test_scrip
@pytest.mark.parametrize(
- ["use_docker", "expected_test_script"],
+ ("use_docker", "expected_test_script"),
[
("n", "pytest"),
("y", "docker compose -f docker-compose.local.yml run django pytest"),
@@ -316,7 +316,7 @@ def test_gitlab_invokes_precommit_and_pytest(cookies, context, use_docker, expec
try:
gitlab_config = yaml.safe_load(gitlab_yml)
assert gitlab_config["precommit"]["script"] == [
- "pre-commit run --show-diff-on-failure --color=always --all-files"
+ "pre-commit run --show-diff-on-failure --color=always --all-files",
]
assert gitlab_config["pytest"]["script"] == [expected_test_script]
except yaml.YAMLError as e:
@@ -324,7 +324,7 @@ def test_gitlab_invokes_precommit_and_pytest(cookies, context, use_docker, expec
@pytest.mark.parametrize(
- ["use_docker", "expected_test_script"],
+ ("use_docker", "expected_test_script"),
[
("n", "pytest"),
("y", "docker compose -f docker-compose.local.yml run django pytest"),
@@ -379,7 +379,7 @@ def test_error_if_incompatible(cookies, context, invalid_context):
@pytest.mark.parametrize(
- ["editor", "pycharm_docs_exist"],
+ ("editor", "pycharm_docs_exist"),
[
("None", False),
("PyCharm", True),
@@ -402,7 +402,7 @@ def test_trim_domain_email(cookies, context):
"use_docker": "y",
"domain_name": " example.com ",
"email": " me@example.com ",
- }
+ },
)
result = cookies.bake(extra_context=context)
diff --git a/tests/test_hooks.py b/tests/test_hooks.py
index 2ccac84b2..c8d503426 100644
--- a/tests/test_hooks.py
+++ b/tests/test_hooks.py
@@ -8,7 +8,7 @@ import pytest
from hooks.post_gen_project import append_to_gitignore_file
-@pytest.fixture()
+@pytest.fixture
def working_directory(tmp_path):
prev_cwd = Path.cwd()
os.chdir(tmp_path)
diff --git a/uv.lock b/uv.lock
index efbe9ec44..7cfc50176 100644
--- a/uv.lock
+++ b/uv.lock
@@ -182,7 +182,7 @@ wheels = [
[[package]]
name = "cookiecutter-django"
-version = "2025.2.8"
+version = "2025.3.15"
source = { virtual = "." }
dependencies = [
{ name = "binaryornot" },
@@ -229,7 +229,7 @@ requires-dist = [
{ name = "pytest-xdist", specifier = "==3.6.1" },
{ name = "pyyaml", specifier = "==6.0.2" },
{ name = "requests", specifier = "==2.32.3" },
- { name = "ruff", specifier = "==0.9.6" },
+ { name = "ruff", specifier = "==0.11.0" },
{ name = "sh", marker = "sys_platform != 'win23'", specifier = "==2.1" },
{ name = "tox", specifier = "==4.23.2" },
{ name = "tox-uv", specifier = ">=1.17" },
@@ -830,27 +830,27 @@ wheels = [
[[package]]
name = "ruff"
-version = "0.9.6"
+version = "0.11.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/2a/e1/e265aba384343dd8ddd3083f5e33536cd17e1566c41453a5517b5dd443be/ruff-0.9.6.tar.gz", hash = "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9", size = 3639454 }
+sdist = { url = "https://files.pythonhosted.org/packages/77/2b/7ca27e854d92df5e681e6527dc0f9254c9dc06c8408317893cf96c851cdd/ruff-0.11.0.tar.gz", hash = "sha256:e55c620690a4a7ee6f1cccb256ec2157dc597d109400ae75bbf944fc9d6462e2", size = 3799407 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/76/e3/3d2c022e687e18cf5d93d6bfa2722d46afc64eaa438c7fbbdd603b3597be/ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba", size = 11714128 },
- { url = "https://files.pythonhosted.org/packages/e1/22/aff073b70f95c052e5c58153cba735748c9e70107a77d03420d7850710a0/ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504", size = 11682539 },
- { url = "https://files.pythonhosted.org/packages/75/a7/f5b7390afd98a7918582a3d256cd3e78ba0a26165a467c1820084587cbf9/ruff-0.9.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83", size = 11132512 },
- { url = "https://files.pythonhosted.org/packages/a6/e3/45de13ef65047fea2e33f7e573d848206e15c715e5cd56095589a7733d04/ruff-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc", size = 11929275 },
- { url = "https://files.pythonhosted.org/packages/7d/f2/23d04cd6c43b2e641ab961ade8d0b5edb212ecebd112506188c91f2a6e6c/ruff-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b", size = 11466502 },
- { url = "https://files.pythonhosted.org/packages/b5/6f/3a8cf166f2d7f1627dd2201e6cbc4cb81f8b7d58099348f0c1ff7b733792/ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e", size = 12676364 },
- { url = "https://files.pythonhosted.org/packages/f5/c4/db52e2189983c70114ff2b7e3997e48c8318af44fe83e1ce9517570a50c6/ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666", size = 13335518 },
- { url = "https://files.pythonhosted.org/packages/66/44/545f8a4d136830f08f4d24324e7db957c5374bf3a3f7a6c0bc7be4623a37/ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5", size = 12823287 },
- { url = "https://files.pythonhosted.org/packages/c5/26/8208ef9ee7431032c143649a9967c3ae1aae4257d95e6f8519f07309aa66/ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5", size = 14592374 },
- { url = "https://files.pythonhosted.org/packages/31/70/e917781e55ff39c5b5208bda384fd397ffd76605e68544d71a7e40944945/ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217", size = 12500173 },
- { url = "https://files.pythonhosted.org/packages/84/f5/e4ddee07660f5a9622a9c2b639afd8f3104988dc4f6ba0b73ffacffa9a8c/ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6", size = 11906555 },
- { url = "https://files.pythonhosted.org/packages/f1/2b/6ff2fe383667075eef8656b9892e73dd9b119b5e3add51298628b87f6429/ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897", size = 11538958 },
- { url = "https://files.pythonhosted.org/packages/3c/db/98e59e90de45d1eb46649151c10a062d5707b5b7f76f64eb1e29edf6ebb1/ruff-0.9.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08", size = 12117247 },
- { url = "https://files.pythonhosted.org/packages/ec/bc/54e38f6d219013a9204a5a2015c09e7a8c36cedcd50a4b01ac69a550b9d9/ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656", size = 12554647 },
- { url = "https://files.pythonhosted.org/packages/a5/7d/7b461ab0e2404293c0627125bb70ac642c2e8d55bf590f6fce85f508f1b2/ruff-0.9.6-py3-none-win32.whl", hash = "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d", size = 9949214 },
- { url = "https://files.pythonhosted.org/packages/ee/30/c3cee10f915ed75a5c29c1e57311282d1a15855551a64795c1b2bbe5cf37/ruff-0.9.6-py3-none-win_amd64.whl", hash = "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa", size = 10999914 },
- { url = "https://files.pythonhosted.org/packages/e8/a8/d71f44b93e3aa86ae232af1f2126ca7b95c0f515ec135462b3e1f351441c/ruff-0.9.6-py3-none-win_arm64.whl", hash = "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a", size = 10177499 },
+ { url = "https://files.pythonhosted.org/packages/48/40/3d0340a9e5edc77d37852c0cd98c5985a5a8081fc3befaeb2ae90aaafd2b/ruff-0.11.0-py3-none-linux_armv6l.whl", hash = "sha256:dc67e32bc3b29557513eb7eeabb23efdb25753684b913bebb8a0c62495095acb", size = 10098158 },
+ { url = "https://files.pythonhosted.org/packages/ec/a9/d8f5abb3b87b973b007649ac7bf63665a05b2ae2b2af39217b09f52abbbf/ruff-0.11.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38c23fd9bdec4eb437b4c1e3595905a0a8edfccd63a790f818b28c78fe345639", size = 10879071 },
+ { url = "https://files.pythonhosted.org/packages/ab/62/aaa198614c6211677913ec480415c5e6509586d7b796356cec73a2f8a3e6/ruff-0.11.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7c8661b0be91a38bd56db593e9331beaf9064a79028adee2d5f392674bbc5e88", size = 10247944 },
+ { url = "https://files.pythonhosted.org/packages/9f/52/59e0a9f2cf1ce5e6cbe336b6dd0144725c8ea3b97cac60688f4e7880bf13/ruff-0.11.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6c0e8d3d2db7e9f6efd884f44b8dc542d5b6b590fc4bb334fdbc624d93a29a2", size = 10421725 },
+ { url = "https://files.pythonhosted.org/packages/a6/c3/dcd71acc6dff72ce66d13f4be5bca1dbed4db678dff2f0f6f307b04e5c02/ruff-0.11.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c3156d3f4b42e57247275a0a7e15a851c165a4fc89c5e8fa30ea6da4f7407b8", size = 9954435 },
+ { url = "https://files.pythonhosted.org/packages/a6/9a/342d336c7c52dbd136dee97d4c7797e66c3f92df804f8f3b30da59b92e9c/ruff-0.11.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:490b1e147c1260545f6d041c4092483e3f6d8eba81dc2875eaebcf9140b53905", size = 11492664 },
+ { url = "https://files.pythonhosted.org/packages/84/35/6e7defd2d7ca95cc385ac1bd9f7f2e4a61b9cc35d60a263aebc8e590c462/ruff-0.11.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1bc09a7419e09662983b1312f6fa5dab829d6ab5d11f18c3760be7ca521c9329", size = 12207856 },
+ { url = "https://files.pythonhosted.org/packages/22/78/da669c8731bacf40001c880ada6d31bcfb81f89cc996230c3b80d319993e/ruff-0.11.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcfa478daf61ac8002214eb2ca5f3e9365048506a9d52b11bea3ecea822bb844", size = 11645156 },
+ { url = "https://files.pythonhosted.org/packages/ee/47/e27d17d83530a208f4a9ab2e94f758574a04c51e492aa58f91a3ed7cbbcb/ruff-0.11.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fbb2aed66fe742a6a3a0075ed467a459b7cedc5ae01008340075909d819df1e", size = 13884167 },
+ { url = "https://files.pythonhosted.org/packages/9f/5e/42ffbb0a5d4b07bbc642b7d58357b4e19a0f4774275ca6ca7d1f7b5452cd/ruff-0.11.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92c0c1ff014351c0b0cdfdb1e35fa83b780f1e065667167bb9502d47ca41e6db", size = 11348311 },
+ { url = "https://files.pythonhosted.org/packages/c8/51/dc3ce0c5ce1a586727a3444a32f98b83ba99599bb1ebca29d9302886e87f/ruff-0.11.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e4fd5ff5de5f83e0458a138e8a869c7c5e907541aec32b707f57cf9a5e124445", size = 10305039 },
+ { url = "https://files.pythonhosted.org/packages/60/e0/475f0c2f26280f46f2d6d1df1ba96b3399e0234cf368cc4c88e6ad10dcd9/ruff-0.11.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:96bc89a5c5fd21a04939773f9e0e276308be0935de06845110f43fd5c2e4ead7", size = 9937939 },
+ { url = "https://files.pythonhosted.org/packages/e2/d3/3e61b7fd3e9cdd1e5b8c7ac188bec12975c824e51c5cd3d64caf81b0331e/ruff-0.11.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a9352b9d767889ec5df1483f94870564e8102d4d7e99da52ebf564b882cdc2c7", size = 10923259 },
+ { url = "https://files.pythonhosted.org/packages/30/32/cd74149ebb40b62ddd14bd2d1842149aeb7f74191fb0f49bd45c76909ff2/ruff-0.11.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:049a191969a10897fe052ef9cc7491b3ef6de79acd7790af7d7897b7a9bfbcb6", size = 11406212 },
+ { url = "https://files.pythonhosted.org/packages/00/ef/033022a6b104be32e899b00de704d7c6d1723a54d4c9e09d147368f14b62/ruff-0.11.0-py3-none-win32.whl", hash = "sha256:3191e9116b6b5bbe187447656f0c8526f0d36b6fd89ad78ccaad6bdc2fad7df2", size = 10310905 },
+ { url = "https://files.pythonhosted.org/packages/ed/8a/163f2e78c37757d035bd56cd60c8d96312904ca4a6deeab8442d7b3cbf89/ruff-0.11.0-py3-none-win_amd64.whl", hash = "sha256:c58bfa00e740ca0a6c43d41fb004cd22d165302f360aaa56f7126d544db31a21", size = 11411730 },
+ { url = "https://files.pythonhosted.org/packages/4e/f7/096f6efabe69b49d7ca61052fc70289c05d8d35735c137ef5ba5ef423662/ruff-0.11.0-py3-none-win_arm64.whl", hash = "sha256:868364fc23f5aa122b00c6f794211e85f7e78f5dffdf7c590ab90b8c4e69b657", size = 10538956 },
]
[[package]]
diff --git a/{{cookiecutter.project_slug}}/.editorconfig b/{{cookiecutter.project_slug}}/.editorconfig
index c0ce34260..4aa03505b 100644
--- a/{{cookiecutter.project_slug}}/.editorconfig
+++ b/{{cookiecutter.project_slug}}/.editorconfig
@@ -12,7 +12,7 @@ trim_trailing_whitespace = true
indent_style = space
indent_size = 4
-[*.{html,css,scss,json,yml,xml}]
+[*.{html,css,scss,json,yml,xml,toml}]
indent_style = space
indent_size = 2
diff --git a/{{cookiecutter.project_slug}}/.github/dependabot.yml b/{{cookiecutter.project_slug}}/.github/dependabot.yml
index 4ea47bd28..45f35a28e 100644
--- a/{{cookiecutter.project_slug}}/.github/dependabot.yml
+++ b/{{cookiecutter.project_slug}}/.github/dependabot.yml
@@ -9,16 +9,20 @@ updates:
# Every weekday
schedule:
interval: 'daily'
+ groups:
+ github-actions:
+ patterns:
+ - '*'
{%- if cookiecutter.use_docker == 'y' %}
# Enable version updates for Docker
- # We need to specify each Dockerfile in a separate entry because Dependabot doesn't
- # support wildcards or recursively checking subdirectories. Check this issue for updates:
- # https://github.com/dependabot/dependabot-core/issues/2178
- package-ecosystem: 'docker'
# Look for a `Dockerfile` in the `compose/local/django` directory
- directory: 'compose/local/django/'
+ directories:
+ - 'compose/local/django/'
+ - 'compose/local/docs/'
+ - 'compose/production/django/'
# Every weekday
schedule:
interval: 'daily'
@@ -28,70 +32,25 @@ updates:
update-types:
- 'version-update:semver-major'
- 'version-update:semver-minor'
+ groups:
+ docker-python:
+ patterns:
+ - '*'
+
- package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/local/docs` directory
- directory: 'compose/local/docs/'
- # Every weekday
- schedule:
- interval: 'daily'
- # Ignore minor version updates (3.10 -> 3.11) but update patch versions
- ignore:
- - dependency-name: '*'
- update-types:
- - 'version-update:semver-major'
- - 'version-update:semver-minor'
-
- - package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/local/node` directory
- directory: 'compose/local/node/'
- # Every weekday
- schedule:
- interval: 'daily'
-
- - package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/production/aws` directory
- directory: 'compose/production/aws/'
- # Every weekday
- schedule:
- interval: 'daily'
-
- - package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/production/django` directory
- directory: 'compose/production/django/'
- # Every weekday
- schedule:
- interval: 'daily'
- # Ignore minor version updates (3.10 -> 3.11) but update patch versions
- ignore:
- - dependency-name: '*'
- update-types:
- - 'version-update:semver-major'
- - 'version-update:semver-minor'
-
- - package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/production/postgres` directory
- directory: 'compose/production/postgres/'
- # Every weekday
- schedule:
- interval: 'daily'
-
- - package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/production/traefik` directory
- directory: 'compose/production/traefik/'
- # Every weekday
- schedule:
- interval: 'daily'
-
+ # Look for a `Dockerfile` in the listed directories
+ directories:
+ - 'compose/local/node/'
+ - 'compose/production/aws/'
+ - 'compose/production/postgres/'
+ - 'compose/production/traefik/'
{%- if cookiecutter.cloud_provider == 'None' %}
-
- - package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/production/nginx` directory
- directory: 'compose/production/nginx/'
+ - 'compose/production/nginx/'
+{%- endif %}
# Every weekday
schedule:
interval: 'daily'
-{%- endif %}
{%- endif %}
@@ -103,6 +62,11 @@ updates:
# Every weekday
schedule:
interval: 'daily'
+ groups:
+ python:
+ update-types:
+ - 'minor'
+ - 'patch'
{%- if cookiecutter.frontend_pipeline == 'Gulp' %}
@@ -113,5 +77,10 @@ updates:
# Every weekday
schedule:
interval: 'daily'
+ groups:
+ javascript:
+ update-types:
+ - 'minor'
+ - 'patch'
{%- endif %}
diff --git a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml
index 865174e94..9f2885110 100644
--- a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml
+++ b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml
@@ -40,7 +40,7 @@ repos:
# Run the Ruff linter.
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.9.6
+ rev: v0.11.0
hooks:
# Linter
- id: ruff
diff --git a/{{cookiecutter.project_slug}}/compose/local/node/Dockerfile b/{{cookiecutter.project_slug}}/compose/local/node/Dockerfile
index 64ef9758b..990652a3c 100644
--- a/{{cookiecutter.project_slug}}/compose/local/node/Dockerfile
+++ b/{{cookiecutter.project_slug}}/compose/local/node/Dockerfile
@@ -1,4 +1,4 @@
-FROM docker.io/node:22.13-bookworm-slim
+FROM docker.io/node:22.14-bookworm-slim
WORKDIR /app
diff --git a/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile
index 0e1d767f2..dccb81fc0 100644
--- a/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile
+++ b/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile
@@ -1,5 +1,5 @@
{% if cookiecutter.frontend_pipeline in ['Gulp', 'Webpack'] -%}
-FROM docker.io/node:22.13-bookworm-slim AS client-builder
+FROM docker.io/node:22.14-bookworm-slim AS client-builder
ARG APP_HOME=/app
WORKDIR ${APP_HOME}
diff --git a/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile
index b6188bf4a..7ec39ad20 100644
--- a/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile
+++ b/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile
@@ -1,4 +1,4 @@
-FROM docker.io/traefik:3.3.3
+FROM docker.io/traefik:3.3.4
RUN mkdir -p /etc/traefik/acme \
&& touch /etc/traefik/acme/acme.json \
&& chmod 600 /etc/traefik/acme/acme.json
diff --git a/{{cookiecutter.project_slug}}/config/asgi.py b/{{cookiecutter.project_slug}}/config/asgi.py
index edfffbbc5..302db2613 100644
--- a/{{cookiecutter.project_slug}}/config/asgi.py
+++ b/{{cookiecutter.project_slug}}/config/asgi.py
@@ -1,4 +1,3 @@
-# ruff: noqa
"""
ASGI config for {{ cookiecutter.project_name }} project.
@@ -25,12 +24,9 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
# This application object is used by any ASGI server configured to use this file.
django_application = get_asgi_application()
-# Apply ASGI middleware here.
-# from helloworld.asgi import HelloWorldApplication
-# application = HelloWorldApplication(application)
# Import websocket application here, so apps from django_application are loaded first
-from config.websocket import websocket_application
+from config.websocket import websocket_application # noqa: E402
async def application(scope, receive, send):
diff --git a/{{cookiecutter.project_slug}}/config/urls.py b/{{cookiecutter.project_slug}}/config/urls.py
index aca4352e6..8f9b5e426 100644
--- a/{{cookiecutter.project_slug}}/config/urls.py
+++ b/{{cookiecutter.project_slug}}/config/urls.py
@@ -1,4 +1,3 @@
-# ruff: noqa
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
@@ -77,4 +76,7 @@ if settings.DEBUG:
if "debug_toolbar" in settings.INSTALLED_APPS:
import debug_toolbar
- urlpatterns = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns
+ urlpatterns = [
+ path("__debug__/", include(debug_toolbar.urls)),
+ *urlpatterns,
+ ]
diff --git a/{{cookiecutter.project_slug}}/config/wsgi.py b/{{cookiecutter.project_slug}}/config/wsgi.py
index 73a6cddcb..cc82dd7f3 100644
--- a/{{cookiecutter.project_slug}}/config/wsgi.py
+++ b/{{cookiecutter.project_slug}}/config/wsgi.py
@@ -1,4 +1,3 @@
-# ruff: noqa
"""
WSGI config for {{ cookiecutter.project_name }} project.
@@ -25,16 +24,9 @@ from django.core.wsgi import get_wsgi_application
# {{ cookiecutter.project_slug }} directory.
BASE_DIR = Path(__file__).resolve(strict=True).parent.parent
sys.path.append(str(BASE_DIR / "{{ cookiecutter.project_slug }}"))
-# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
-# if running multiple sites in the same mod_wsgi process. To fix this, use
-# mod_wsgi daemon mode with each site in its own daemon process, or use
-# os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings.production"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
application = get_wsgi_application()
-# Apply WSGI middleware here.
-# from helloworld.wsgi import HelloWorldApplication
-# application = HelloWorldApplication(application)
diff --git a/{{cookiecutter.project_slug}}/docs/conf.py b/{{cookiecutter.project_slug}}/docs/conf.py
index 09f9652e8..75a513896 100644
--- a/{{cookiecutter.project_slug}}/docs/conf.py
+++ b/{{cookiecutter.project_slug}}/docs/conf.py
@@ -1,4 +1,4 @@
-# ruff: noqa
+# ruff: noqa: ERA001, PTH100
# Configuration file for the Sphinx documentation builder.
#
# This file only contains a selection of the most common options. For a full
@@ -13,9 +13,10 @@
import os
import sys
+
import django
-if os.getenv("READTHEDOCS", default=False) == "True":
+if os.getenv("READTHEDOCS", default="False") == "True":
sys.path.insert(0, os.path.abspath(".."))
os.environ["DJANGO_READ_DOT_ENV_FILE"] = "True"
os.environ["USE_DOCKER"] = "no"
@@ -32,7 +33,7 @@ django.setup()
# -- Project information -----------------------------------------------------
project = "{{ cookiecutter.project_name }}"
-copyright = """{% now 'utc', '%Y' %}, {{ cookiecutter.author_name }}"""
+copyright = """{% now 'utc', '%Y' %}, {{ cookiecutter.author_name }}""" # noqa: A001
author = "{{ cookiecutter.author_name }}"
diff --git a/{{cookiecutter.project_slug}}/manage.py b/{{cookiecutter.project_slug}}/manage.py
index a39871814..d6c4f110f 100755
--- a/{{cookiecutter.project_slug}}/manage.py
+++ b/{{cookiecutter.project_slug}}/manage.py
@@ -1,28 +1,22 @@
#!/usr/bin/env python
-# ruff: noqa
+"""Django's command-line utility for administrative tasks."""
import os
import sys
from pathlib import Path
-if __name__ == "__main__":
+
+def main():
+ """Run administrative tasks."""
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
try:
from django.core.management import execute_from_command_line
- except ImportError:
- # The above import may fail for some other reason. Ensure that the
- # issue is really that Django is missing to avoid masking other
- # exceptions on Python 2.
- try:
- import django
- except ImportError:
- raise ImportError(
- "Couldn't import Django. Are you sure it's installed and "
- "available on your PYTHONPATH environment variable? Did you "
- "forget to activate a virtual environment?"
- )
-
- raise
+ except ImportError as exc:
+ raise ImportError( # noqa: TRY003
+ "Couldn't import Django. Are you sure it's installed and " # noqa: EM101
+ "available on your PYTHONPATH environment variable? Did you "
+ "forget to activate a virtual environment?",
+ ) from exc
# This allows easy placement of apps within the interior
# {{ cookiecutter.project_slug }} directory.
@@ -30,3 +24,7 @@ if __name__ == "__main__":
sys.path.append(str(current_path / "{{ cookiecutter.project_slug }}"))
execute_from_command_line(sys.argv)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/{{cookiecutter.project_slug}}/merge_production_dotenvs_in_dotenv.py b/{{cookiecutter.project_slug}}/merge_production_dotenvs_in_dotenv.py
index c83ed7166..35139fb2e 100644
--- a/{{cookiecutter.project_slug}}/merge_production_dotenvs_in_dotenv.py
+++ b/{{cookiecutter.project_slug}}/merge_production_dotenvs_in_dotenv.py
@@ -1,4 +1,3 @@
-# ruff: noqa
import os
from collections.abc import Sequence
from pathlib import Path
diff --git a/{{cookiecutter.project_slug}}/package.json b/{{cookiecutter.project_slug}}/package.json
index 11c41cc71..d0458179b 100644
--- a/{{cookiecutter.project_slug}}/package.json
+++ b/{{cookiecutter.project_slug}}/package.json
@@ -6,7 +6,7 @@
"@babel/preset-env": "^7.16.5",
"@popperjs/core": "^2.10.2",
"autoprefixer": "^10.4.0",
- "babel-loader": "^9.1.2",
+ "babel-loader": "^10.0.0",
"bootstrap": "^5.2.3",
"browser-sync": "^3.0.2",
"css-loader": "^7.1.2",
@@ -35,7 +35,7 @@
"webpack-merge": "^6.0.1"
},
"engines": {
- "node": "22.13"
+ "node": "22.14"
},
"browserslist": [
"last 2 versions"
diff --git a/{{cookiecutter.project_slug}}/pyproject.toml b/{{cookiecutter.project_slug}}/pyproject.toml
index 4a5fb3679..f5039338c 100644
--- a/{{cookiecutter.project_slug}}/pyproject.toml
+++ b/{{cookiecutter.project_slug}}/pyproject.toml
@@ -139,7 +139,7 @@ ignore = [
# The fixes in extend-unsafe-fixes will require
# provide the `--unsafe-fixes` flag when fixing.
extend-unsafe-fixes = [
- "UP038",
+ "UP038",
]
[tool.ruff.lint.isort]
diff --git a/{{cookiecutter.project_slug}}/requirements/base.txt b/{{cookiecutter.project_slug}}/requirements/base.txt
index f0f42d516..d565dfefa 100644
--- a/{{cookiecutter.project_slug}}/requirements/base.txt
+++ b/{{cookiecutter.project_slug}}/requirements/base.txt
@@ -29,7 +29,7 @@ uvicorn-worker==0.3.0 # https://github.com/Kludex/uvicorn-worker
# Django
# ------------------------------------------------------------------------------
-django==5.0.12 # pyup: < 5.1 # https://www.djangoproject.com/
+django==5.0.13 # pyup: < 5.1 # https://www.djangoproject.com/
django-environ==0.12.0 # https://github.com/joke2k/django-environ
django-model-utils==5.0.0 # https://github.com/jazzband/django-model-utils
django-allauth[mfa]==65.4.1 # https://github.com/pennersr/django-allauth
diff --git a/{{cookiecutter.project_slug}}/requirements/local.txt b/{{cookiecutter.project_slug}}/requirements/local.txt
index f51115d75..8c53b2c17 100644
--- a/{{cookiecutter.project_slug}}/requirements/local.txt
+++ b/{{cookiecutter.project_slug}}/requirements/local.txt
@@ -3,9 +3,9 @@
Werkzeug[watchdog]==3.1.3 # https://github.com/pallets/werkzeug
ipdb==0.13.13 # https://github.com/gotcha/ipdb
{%- if cookiecutter.use_docker == 'y' %}
-psycopg[c]==3.2.4 # https://github.com/psycopg/psycopg
+psycopg[c]==3.2.6 # https://github.com/psycopg/psycopg
{%- else %}
-psycopg[binary]==3.2.4 # https://github.com/psycopg/psycopg
+psycopg[binary]==3.2.6 # https://github.com/psycopg/psycopg
{%- endif %}
{%- if cookiecutter.use_async == 'y' or cookiecutter.use_celery == 'y' %}
watchfiles==1.0.4 # https://github.com/samuelcolvin/watchfiles
@@ -15,22 +15,22 @@ watchfiles==1.0.4 # https://github.com/samuelcolvin/watchfiles
# ------------------------------------------------------------------------------
mypy==1.15.0 # https://github.com/python/mypy
django-stubs[compatible-mypy]==5.1.3 # https://github.com/typeddjango/django-stubs
-pytest==8.3.4 # https://github.com/pytest-dev/pytest
+pytest==8.3.5 # https://github.com/pytest-dev/pytest
pytest-sugar==1.0.0 # https://github.com/Frozenball/pytest-sugar
{%- if cookiecutter.use_drf == "y" %}
-djangorestframework-stubs==3.15.2 # https://github.com/typeddjango/djangorestframework-stubs
+djangorestframework-stubs==3.15.3 # https://github.com/typeddjango/djangorestframework-stubs
{%- endif %}
# Documentation
# ------------------------------------------------------------------------------
-sphinx==8.1.3 # https://github.com/sphinx-doc/sphinx
+sphinx==8.3.0 # https://github.com/sphinx-doc/sphinx
sphinx-autobuild==2024.10.3 # https://github.com/GaretJax/sphinx-autobuild
sphinx-rtd-theme==2.0.0 # https://pypi.org/project/sphinx-rtd-theme/
# Code quality
# ------------------------------------------------------------------------------
-ruff==0.9.6 # https://github.com/astral-sh/ruff
-coverage==7.6.11 # https://github.com/nedbat/coveragepy
+ruff==0.11.0 # https://github.com/astral-sh/ruff
+coverage==7.6.12 # https://github.com/nedbat/coveragepy
djlint==1.36.4 # https://github.com/Riverside-Healthcare/djLint
pre-commit==4.1.0 # https://github.com/pre-commit/pre-commit
diff --git a/{{cookiecutter.project_slug}}/requirements/production.txt b/{{cookiecutter.project_slug}}/requirements/production.txt
index 9dc093bcd..e2e22ac32 100644
--- a/{{cookiecutter.project_slug}}/requirements/production.txt
+++ b/{{cookiecutter.project_slug}}/requirements/production.txt
@@ -3,12 +3,12 @@
-r base.txt
gunicorn==23.0.0 # https://github.com/benoitc/gunicorn
-psycopg[c]==3.2.4 # https://github.com/psycopg/psycopg
+psycopg[c]==3.2.6 # https://github.com/psycopg/psycopg
{%- if cookiecutter.use_whitenoise == 'n'and cookiecutter.cloud_provider in ('AWS', 'GCP') %}
Collectfasta==3.2.1 # https://github.com/jasongi/collectfasta
{%- endif %}
{%- if cookiecutter.use_sentry == "y" %}
-sentry-sdk==2.20.0 # https://github.com/getsentry/sentry-python
+sentry-sdk==2.22.0 # https://github.com/getsentry/sentry-python
{%- endif %}
{%- if cookiecutter.use_docker == "n" and cookiecutter.windows == "y" %}
hiredis==3.1.0 # https://github.com/redis/hiredis-py
@@ -17,11 +17,11 @@ hiredis==3.1.0 # https://github.com/redis/hiredis-py
# Django
# ------------------------------------------------------------------------------
{%- if cookiecutter.cloud_provider == 'AWS' %}
-django-storages[s3]==1.14.4 # https://github.com/jschneier/django-storages
+django-storages[s3]==1.14.5 # https://github.com/jschneier/django-storages
{%- elif cookiecutter.cloud_provider == 'GCP' %}
-django-storages[google]==1.14.4 # https://github.com/jschneier/django-storages
+django-storages[google]==1.14.5 # https://github.com/jschneier/django-storages
{%- elif cookiecutter.cloud_provider == 'Azure' %}
-django-storages[azure]==1.14.4 # https://github.com/jschneier/django-storages
+django-storages[azure]==1.14.5 # https://github.com/jschneier/django-storages
{%- endif %}
{%- if cookiecutter.mail_service == 'Mailgun' %}
django-anymail[mailgun]==12.0 # https://github.com/anymail/django-anymail
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/__init__.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/__init__.py
index 1c7ecc894..6b5912444 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/__init__.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/__init__.py
@@ -1,5 +1,5 @@
"""
To understand why this file is here, please read:
-http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
+https://cookiecutter-django.readthedocs.io/en/latest/5-help/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
"""
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/__init__.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/__init__.py
index 1c7ecc894..6b5912444 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/__init__.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/__init__.py
@@ -1,5 +1,5 @@
"""
To understand why this file is here, please read:
-http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
+https://cookiecutter-django.readthedocs.io/en/latest/5-help/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
"""
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0003_set_site_domain_and_name.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0003_set_site_domain_and_name.py
index 85ee2d9c1..df7f47729 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0003_set_site_domain_and_name.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0003_set_site_domain_and_name.py
@@ -1,7 +1,7 @@
"""
To understand why this file is here, please read:
-http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
+https://cookiecutter-django.readthedocs.io/en/latest/5-help/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
"""
from django.conf import settings
from django.db import migrations
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/__init__.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/__init__.py
index 1c7ecc894..6b5912444 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/__init__.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/__init__.py
@@ -1,5 +1,5 @@
"""
To understand why this file is here, please read:
-http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
+https://cookiecutter-django.readthedocs.io/en/latest/5-help/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
"""
|