From 683f207d4a71ae3505b015fe4972a5a58ba0a509 Mon Sep 17 00:00:00 2001
From: Bruno Alla <alla.brunoo@gmail.com>
Date: Tue, 31 Dec 2024 13:18:39 +0000
Subject: [PATCH 01/19] Move API tests into a package

Mirroring the structure of the code being tested
---
 hooks/post_gen_project.py                                     | 4 +---
 .../{{cookiecutter.project_slug}}/users/tests/api/__init__.py | 0
 .../users/tests/{ => api}/test_swagger.py                     | 0
 .../users/tests/{test_drf_urls.py => api/test_urls.py}        | 0
 .../users/tests/{test_drf_views.py => api/test_views.py}      | 0
 5 files changed, 1 insertion(+), 3 deletions(-)
 create mode 100644 {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/__init__.py
 rename {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/{ => api}/test_swagger.py (100%)
 rename {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/{test_drf_urls.py => api/test_urls.py} (100%)
 rename {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/{test_drf_views.py => api/test_views.py} (100%)

diff --git a/hooks/post_gen_project.py b/hooks/post_gen_project.py
index ca1ffad32..c4934e637 100644
--- a/hooks/post_gen_project.py
+++ b/hooks/post_gen_project.py
@@ -433,9 +433,7 @@ def remove_aws_dockerfile():
 def remove_drf_starter_files():
     os.remove(os.path.join("config", "api_router.py"))
     shutil.rmtree(os.path.join("{{cookiecutter.project_slug}}", "users", "api"))
-    os.remove(os.path.join("{{cookiecutter.project_slug}}", "users", "tests", "test_drf_urls.py"))
-    os.remove(os.path.join("{{cookiecutter.project_slug}}", "users", "tests", "test_drf_views.py"))
-    os.remove(os.path.join("{{cookiecutter.project_slug}}", "users", "tests", "test_swagger.py"))
+    shutil.rmtree(os.path.join("{{cookiecutter.project_slug}}", "users", "tests", "api"))
 
 
 def main():
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/__init__.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_swagger.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/test_swagger.py
similarity index 100%
rename from {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_swagger.py
rename to {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/test_swagger.py
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_drf_urls.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/test_urls.py
similarity index 100%
rename from {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_drf_urls.py
rename to {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/test_urls.py
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_drf_views.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/test_views.py
similarity index 100%
rename from {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_drf_views.py
rename to {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/test_views.py

From 0434aea33f0edf54c1794d5e6e70388d7438741b Mon Sep 17 00:00:00 2001
From: Bruno Alla <alla.brunoo@gmail.com>
Date: Thu, 2 Jan 2025 20:20:08 +0000
Subject: [PATCH 02/19] Rename API docs tests to not mention Swagger

---
 .../users/tests/api/{test_swagger.py => test_openapi.py}      | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
 rename {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/{test_swagger.py => test_openapi.py} (81%)

diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/test_swagger.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/test_openapi.py
similarity index 81%
rename from {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/test_swagger.py
rename to {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/test_openapi.py
index 5db371dbe..cb3f19d3d 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/test_swagger.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/api/test_openapi.py
@@ -4,14 +4,14 @@ import pytest
 from django.urls import reverse
 
 
-def test_swagger_accessible_by_admin(admin_client):
+def test_api_docs_accessible_by_admin(admin_client):
     url = reverse("api-docs")
     response = admin_client.get(url)
     assert response.status_code == HTTPStatus.OK
 
 
 @pytest.mark.django_db
-def test_swagger_ui_not_accessible_by_normal_user(client):
+def test_api_docs_not_accessible_by_anonymous_users(client):
     url = reverse("api-docs")
     response = client.get(url)
     assert response.status_code == HTTPStatus.FORBIDDEN

From cb4a2771369b089ebce53b1c2cc998e9c93e6916 Mon Sep 17 00:00:00 2001
From: github-actions <action@github.com>
Date: Sun, 12 Jan 2025 02:31:00 +0000
Subject: [PATCH 03/19] Release 2025.01.11

---
 CHANGELOG.md   | 7 +++++++
 pyproject.toml | 2 +-
 uv.lock        | 2 +-
 3 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index ab34a56da..c07687d54 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,13 @@ All enhancements and patches to Cookiecutter Django will be documented in this f
 
 <!-- GENERATOR_PLACEHOLDER -->
 
+## 2025.01.11
+
+
+### Updated
+
+- Update ruff to 0.9.1 ([#5633](https://github.com/cookiecutter/cookiecutter-django/pull/5633))
+
 ## 2025.01.10
 
 
diff --git a/pyproject.toml b/pyproject.toml
index 80c64f142..22f4222af 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "cookiecutter-django"
-version = "2025.01.10"
+version = "2025.01.11"
 description = "A Cookiecutter template for creating production-ready Django projects quickly."
 readme = "README.md"
 keywords = [
diff --git a/uv.lock b/uv.lock
index 8d773a37f..34ad2e138 100644
--- a/uv.lock
+++ b/uv.lock
@@ -182,7 +182,7 @@ wheels = [
 
 [[package]]
 name = "cookiecutter-django"
-version = "2025.1.10"
+version = "2025.1.11"
 source = { virtual = "." }
 dependencies = [
     { name = "binaryornot" },

From d78dff4969e89488da8d148f318e69671df4540b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 13 Jan 2025 09:41:21 +0000
Subject: [PATCH 04/19] Bumps traefik from 3.3.0 to 3.3.1 (#5634)

---
 .../compose/production/traefik/Dockerfile                       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile
index c139a65b5..f1cd06ce6 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.0
+FROM docker.io/traefik:3.3.1
 RUN mkdir -p /etc/traefik/acme \
   && touch /etc/traefik/acme/acme.json \
   && chmod 600 /etc/traefik/acme/acme.json

From a8847158c9769efeec08cab8d2b4c2bd97caae64 Mon Sep 17 00:00:00 2001
From: "pyup.io bot" <github-bot@pyup.io>
Date: Mon, 13 Jan 2025 10:06:11 -0800
Subject: [PATCH 05/19] Update django-environ from 0.11.2 to 0.12.0 (#5635)

---
 {{cookiecutter.project_slug}}/requirements/base.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/{{cookiecutter.project_slug}}/requirements/base.txt b/{{cookiecutter.project_slug}}/requirements/base.txt
index 54497cf11..3f63685f9 100644
--- a/{{cookiecutter.project_slug}}/requirements/base.txt
+++ b/{{cookiecutter.project_slug}}/requirements/base.txt
@@ -30,7 +30,7 @@ uvicorn-worker==0.3.0  # https://github.com/Kludex/uvicorn-worker
 # Django
 # ------------------------------------------------------------------------------
 django==5.0.10  # pyup: < 5.1  # https://www.djangoproject.com/
-django-environ==0.11.2  # https://github.com/joke2k/django-environ
+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.3.1  # https://github.com/pennersr/django-allauth
 django-crispy-forms==2.3  # https://github.com/django-crispy-forms/django-crispy-forms

From 843f268c4dd6337929958cede5a70e92149f75b5 Mon Sep 17 00:00:00 2001
From: github-actions <action@github.com>
Date: Tue, 14 Jan 2025 02:23:40 +0000
Subject: [PATCH 06/19] Release 2025.01.13

---
 CHANGELOG.md   | 9 +++++++++
 pyproject.toml | 2 +-
 uv.lock        | 2 +-
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index c07687d54..a677e2eb4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,15 @@ All enhancements and patches to Cookiecutter Django will be documented in this f
 
 <!-- GENERATOR_PLACEHOLDER -->
 
+## 2025.01.13
+
+
+### Updated
+
+- Update django-environ to 0.12.0 ([#5635](https://github.com/cookiecutter/cookiecutter-django/pull/5635))
+
+- Bump traefik from 3.3.0 to 3.3.1 ([#5634](https://github.com/cookiecutter/cookiecutter-django/pull/5634))
+
 ## 2025.01.11
 
 
diff --git a/pyproject.toml b/pyproject.toml
index 22f4222af..b005e7fc1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "cookiecutter-django"
-version = "2025.01.11"
+version = "2025.01.13"
 description = "A Cookiecutter template for creating production-ready Django projects quickly."
 readme = "README.md"
 keywords = [
diff --git a/uv.lock b/uv.lock
index 34ad2e138..ee9c0b43b 100644
--- a/uv.lock
+++ b/uv.lock
@@ -182,7 +182,7 @@ wheels = [
 
 [[package]]
 name = "cookiecutter-django"
-version = "2025.1.11"
+version = "2025.1.13"
 source = { virtual = "." }
 dependencies = [
     { name = "binaryornot" },

From 42febc9e846e2f337f4bf85ca6c898bca17cf70b Mon Sep 17 00:00:00 2001
From: "pyup.io bot" <github-bot@pyup.io>
Date: Mon, 13 Jan 2025 23:32:51 -0800
Subject: [PATCH 07/19] Update django-debug-toolbar from 4.4.6 to 5.0.1 (#5636)

---
 {{cookiecutter.project_slug}}/requirements/local.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/{{cookiecutter.project_slug}}/requirements/local.txt b/{{cookiecutter.project_slug}}/requirements/local.txt
index 6b4bf958e..d1bbf35da 100644
--- a/{{cookiecutter.project_slug}}/requirements/local.txt
+++ b/{{cookiecutter.project_slug}}/requirements/local.txt
@@ -37,7 +37,7 @@ pre-commit==4.0.1  # https://github.com/pre-commit/pre-commit
 # ------------------------------------------------------------------------------
 factory-boy==3.3.1  # https://github.com/FactoryBoy/factory_boy
 
-django-debug-toolbar==4.4.6  # https://github.com/jazzband/django-debug-toolbar
+django-debug-toolbar==5.0.1  # https://github.com/jazzband/django-debug-toolbar
 django-extensions==3.2.3  # https://github.com/django-extensions/django-extensions
 django-coverage-plugin==3.1.0  # https://github.com/nedbat/django_coverage_plugin
 pytest-django==4.9.0  # https://github.com/pytest-dev/pytest-django

From 1ba44e9e032bb95d077ecab5522ba1038771b9e8 Mon Sep 17 00:00:00 2001
From: "pyup.io bot" <github-bot@pyup.io>
Date: Tue, 14 Jan 2025 04:05:21 -0800
Subject: [PATCH 08/19] Update sentry-sdk to 2.20.0 (#5638)

---
 {{cookiecutter.project_slug}}/requirements/production.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/{{cookiecutter.project_slug}}/requirements/production.txt b/{{cookiecutter.project_slug}}/requirements/production.txt
index 28f6d275c..4496e9914 100644
--- a/{{cookiecutter.project_slug}}/requirements/production.txt
+++ b/{{cookiecutter.project_slug}}/requirements/production.txt
@@ -8,7 +8,7 @@ psycopg[c]==3.2.3  # https://github.com/psycopg/psycopg
 Collectfasta==3.2.1  # https://github.com/jasongi/collectfasta
 {%- endif %}
 {%- if cookiecutter.use_sentry == "y" %}
-sentry-sdk==2.19.2  # https://github.com/getsentry/sentry-python
+sentry-sdk==2.20.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

From c89a45c45f1b8ad8d6a919837d6905d68826d740 Mon Sep 17 00:00:00 2001
From: "pyup.io bot" <github-bot@pyup.io>
Date: Tue, 14 Jan 2025 09:54:03 -0800
Subject: [PATCH 09/19] Update django from 5.0.10 to 5.0.11 (#5640)

---
 {{cookiecutter.project_slug}}/requirements/base.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/{{cookiecutter.project_slug}}/requirements/base.txt b/{{cookiecutter.project_slug}}/requirements/base.txt
index 3f63685f9..bb956ddc4 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.10  # pyup: < 5.1  # https://www.djangoproject.com/
+django==5.0.11  # 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.3.1  # https://github.com/pennersr/django-allauth

From 7a85931fb0ed68032cb3f0268aa34f21e99b9b59 Mon Sep 17 00:00:00 2001
From: github-actions <action@github.com>
Date: Wed, 15 Jan 2025 02:25:13 +0000
Subject: [PATCH 10/19] Release 2025.01.14

---
 CHANGELOG.md   | 11 +++++++++++
 pyproject.toml |  2 +-
 uv.lock        |  2 +-
 3 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index a677e2eb4..8eebca9b6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,17 @@ All enhancements and patches to Cookiecutter Django will be documented in this f
 
 <!-- GENERATOR_PLACEHOLDER -->
 
+## 2025.01.14
+
+
+### Updated
+
+- Update django to 5.0.11 ([#5640](https://github.com/cookiecutter/cookiecutter-django/pull/5640))
+
+- Update sentry-sdk to 2.20.0 ([#5638](https://github.com/cookiecutter/cookiecutter-django/pull/5638))
+
+- Update django-debug-toolbar to 5.0.1 ([#5636](https://github.com/cookiecutter/cookiecutter-django/pull/5636))
+
 ## 2025.01.13
 
 
diff --git a/pyproject.toml b/pyproject.toml
index b005e7fc1..d80206627 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "cookiecutter-django"
-version = "2025.01.13"
+version = "2025.01.14"
 description = "A Cookiecutter template for creating production-ready Django projects quickly."
 readme = "README.md"
 keywords = [
diff --git a/uv.lock b/uv.lock
index ee9c0b43b..e4da871f9 100644
--- a/uv.lock
+++ b/uv.lock
@@ -182,7 +182,7 @@ wheels = [
 
 [[package]]
 name = "cookiecutter-django"
-version = "2025.1.13"
+version = "2025.1.14"
 source = { virtual = "." }
 dependencies = [
     { name = "binaryornot" },

From 2dc567d13136cb3f1a4d25344dafa32a268dffb7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 15 Jan 2025 10:00:20 +0000
Subject: [PATCH 11/19] Bump traefik from 3.3.1 to 3.3.2 (#5642)

---
 .../compose/production/traefik/Dockerfile                       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile
index f1cd06ce6..e35d53f5f 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.1
+FROM docker.io/traefik:3.3.2
 RUN mkdir -p /etc/traefik/acme \
   && touch /etc/traefik/acme/acme.json \
   && chmod 600 /etc/traefik/acme/acme.json

From fbf6c886cb3924f0020505ebdc06783598245f0e Mon Sep 17 00:00:00 2001
From: "pyup.io bot" <github-bot@pyup.io>
Date: Wed, 15 Jan 2025 02:02:53 -0800
Subject: [PATCH 12/19] Update django-stubs to 5.1.2 (#5639)

---
 {{cookiecutter.project_slug}}/requirements/local.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/{{cookiecutter.project_slug}}/requirements/local.txt b/{{cookiecutter.project_slug}}/requirements/local.txt
index d1bbf35da..6f6d295d3 100644
--- a/{{cookiecutter.project_slug}}/requirements/local.txt
+++ b/{{cookiecutter.project_slug}}/requirements/local.txt
@@ -14,7 +14,7 @@ watchfiles==1.0.4  # https://github.com/samuelcolvin/watchfiles
 # Testing
 # ------------------------------------------------------------------------------
 mypy==1.13.0  # https://github.com/python/mypy
-django-stubs[compatible-mypy]==5.1.1  # https://github.com/typeddjango/django-stubs
+django-stubs[compatible-mypy]==5.1.2  # https://github.com/typeddjango/django-stubs
 pytest==8.3.4  # https://github.com/pytest-dev/pytest
 pytest-sugar==1.0.0  # https://github.com/Frozenball/pytest-sugar
 {%- if cookiecutter.use_drf == "y" %}

From 564ca18e562c42774d69afea153933901a6f860a Mon Sep 17 00:00:00 2001
From: ghazi-git <ghazi-git@users.noreply.github.com>
Date: Wed, 15 Jan 2025 20:34:23 +0100
Subject: [PATCH 13/19] update CELERYD_HIJACK_ROOT_LOGGER to
 CELERY_WORKER_HIJACK_ROOT_LOGGER (#5643)

CELERYD_HIJACK_ROOT_LOGGER was the name of the setting in celery v3
---
 {{cookiecutter.project_slug}}/config/settings/base.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/{{cookiecutter.project_slug}}/config/settings/base.py b/{{cookiecutter.project_slug}}/config/settings/base.py
index 07da3b809..ca7d6b531 100644
--- a/{{cookiecutter.project_slug}}/config/settings/base.py
+++ b/{{cookiecutter.project_slug}}/config/settings/base.py
@@ -327,8 +327,8 @@ CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler"
 CELERY_WORKER_SEND_TASK_EVENTS = True
 # https://docs.celeryq.dev/en/stable/userguide/configuration.html#std-setting-task_send_sent_event
 CELERY_TASK_SEND_SENT_EVENT = True
-# https://cheat.readthedocs.io/en/latest/django/celery.html
-CELERYD_HIJACK_ROOT_LOGGER = False
+# https://docs.celeryq.dev/en/stable/userguide/configuration.html#worker-hijack-root-logger
+CELERY_WORKER_HIJACK_ROOT_LOGGER = False
 
 {%- endif %}
 # django-allauth

From ab475a55700045fd99df60b4d7957c29918edb79 Mon Sep 17 00:00:00 2001
From: "pyup.io bot" <github-bot@pyup.io>
Date: Wed, 15 Jan 2025 15:13:38 -0800
Subject: [PATCH 14/19] Update psycopg to 3.2.4 (#5644)

---
 {{cookiecutter.project_slug}}/requirements/local.txt      | 4 ++--
 {{cookiecutter.project_slug}}/requirements/production.txt | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/{{cookiecutter.project_slug}}/requirements/local.txt b/{{cookiecutter.project_slug}}/requirements/local.txt
index 6f6d295d3..ea12c249e 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.3  # https://github.com/psycopg/psycopg
+psycopg[c]==3.2.4  # https://github.com/psycopg/psycopg
 {%- else %}
-psycopg[binary]==3.2.3  # https://github.com/psycopg/psycopg
+psycopg[binary]==3.2.4  # 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
diff --git a/{{cookiecutter.project_slug}}/requirements/production.txt b/{{cookiecutter.project_slug}}/requirements/production.txt
index 4496e9914..9dc093bcd 100644
--- a/{{cookiecutter.project_slug}}/requirements/production.txt
+++ b/{{cookiecutter.project_slug}}/requirements/production.txt
@@ -3,7 +3,7 @@
 -r base.txt
 
 gunicorn==23.0.0  # https://github.com/benoitc/gunicorn
-psycopg[c]==3.2.3  # https://github.com/psycopg/psycopg
+psycopg[c]==3.2.4  # 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 %}

From 185f18dfc014e6cdcedc6f68b96ee85be38c66ea Mon Sep 17 00:00:00 2001
From: github-actions <action@github.com>
Date: Thu, 16 Jan 2025 02:24:24 +0000
Subject: [PATCH 15/19] Release 2025.01.15

---
 CHANGELOG.md   | 15 +++++++++++++++
 pyproject.toml |  2 +-
 uv.lock        |  2 +-
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8eebca9b6..604cf7c83 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,21 @@ All enhancements and patches to Cookiecutter Django will be documented in this f
 
 <!-- GENERATOR_PLACEHOLDER -->
 
+## 2025.01.15
+
+
+### Fixed
+
+- Fix setting for to `CELERY_WORKER_HIJACK_ROOT_LOGGER` ([#5643](https://github.com/cookiecutter/cookiecutter-django/pull/5643))
+
+### Updated
+
+- Update psycopg to 3.2.4 ([#5644](https://github.com/cookiecutter/cookiecutter-django/pull/5644))
+
+- Update django-stubs to 5.1.2 ([#5639](https://github.com/cookiecutter/cookiecutter-django/pull/5639))
+
+- Bump traefik from 3.3.1 to 3.3.2 ([#5642](https://github.com/cookiecutter/cookiecutter-django/pull/5642))
+
 ## 2025.01.14
 
 
diff --git a/pyproject.toml b/pyproject.toml
index d80206627..171d07f99 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "cookiecutter-django"
-version = "2025.01.14"
+version = "2025.01.15"
 description = "A Cookiecutter template for creating production-ready Django projects quickly."
 readme = "README.md"
 keywords = [
diff --git a/uv.lock b/uv.lock
index e4da871f9..568ca1cfa 100644
--- a/uv.lock
+++ b/uv.lock
@@ -182,7 +182,7 @@ wheels = [
 
 [[package]]
 name = "cookiecutter-django"
-version = "2025.1.14"
+version = "2025.1.15"
 source = { virtual = "." }
 dependencies = [
     { name = "binaryornot" },

From 54e0ccec0cb9dff6f9d6d261639800fc41987012 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 16 Jan 2025 07:32:55 +0000
Subject: [PATCH 16/19] Bump amazon/aws-cli from 2.22.1 to 2.23.0 (#5645)

---
 {{cookiecutter.project_slug}}/compose/production/aws/Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/{{cookiecutter.project_slug}}/compose/production/aws/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/aws/Dockerfile
index b63e486fb..9c66f69c2 100644
--- a/{{cookiecutter.project_slug}}/compose/production/aws/Dockerfile
+++ b/{{cookiecutter.project_slug}}/compose/production/aws/Dockerfile
@@ -1,4 +1,4 @@
-FROM docker.io/amazon/aws-cli:2.22.1
+FROM docker.io/amazon/aws-cli:2.23.0
 
 # Clear entrypoint from the base image, otherwise it's always calling the aws CLI
 ENTRYPOINT []

From e69d77a0b99443772528e76146b8e670fff13506 Mon Sep 17 00:00:00 2001
From: "pyup.io bot" <github-bot@pyup.io>
Date: Thu, 16 Jan 2025 05:59:24 -0800
Subject: [PATCH 17/19] Update ruff to 0.9.2 (#5646)

---
 pyproject.toml                                |  2 +-
 uv.lock                                       | 40 +++++++++----------
 .../.pre-commit-config.yaml                   |  2 +-
 .../requirements/local.txt                    |  2 +-
 4 files changed, 23 insertions(+), 23 deletions(-)

diff --git a/pyproject.toml b/pyproject.toml
index 171d07f99..e1ec8bfd7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -43,7 +43,7 @@ dependencies = [
   "pytest-xdist==3.6.1",
   "pyyaml==6.0.2",
   "requests==2.32.3",
-  "ruff==0.9.1",
+  "ruff==0.9.2",
   "sh==2.1; sys_platform!='win23'",
   "tox==4.23.2",
   "tox-uv>=1.17",
diff --git a/uv.lock b/uv.lock
index 568ca1cfa..f2321853d 100644
--- a/uv.lock
+++ b/uv.lock
@@ -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.1" },
+    { name = "ruff", specifier = "==0.9.2" },
     { 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.1"
+version = "0.9.2"
 source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/67/3e/e89f736f01aa9517a97e2e7e0ce8d34a4d8207087b3cfdec95133fee13b5/ruff-0.9.1.tar.gz", hash = "sha256:fd2b25ecaf907d6458fa842675382c8597b3c746a2dde6717fe3415425df0c17", size = 3498844 }
+sdist = { url = "https://files.pythonhosted.org/packages/80/63/77ecca9d21177600f551d1c58ab0e5a0b260940ea7312195bd2a4798f8a8/ruff-0.9.2.tar.gz", hash = "sha256:b5eceb334d55fae5f316f783437392642ae18e16dcf4f1858d55d3c2a0f8f5d0", size = 3553799 }
 wheels = [
-    { url = "https://files.pythonhosted.org/packages/dc/05/c3a2e0feb3d5d394cdfd552de01df9d3ec8a3a3771bbff247fab7e668653/ruff-0.9.1-py3-none-linux_armv6l.whl", hash = "sha256:84330dda7abcc270e6055551aca93fdde1b0685fc4fd358f26410f9349cf1743", size = 10645241 },
-    { url = "https://files.pythonhosted.org/packages/dd/da/59f0a40e5f88ee5c054ad175caaa2319fc96571e1d29ab4730728f2aad4f/ruff-0.9.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3cae39ba5d137054b0e5b472aee3b78a7c884e61591b100aeb544bcd1fc38d4f", size = 10391066 },
-    { url = "https://files.pythonhosted.org/packages/b7/fe/85e1c1acf0ba04a3f2d54ae61073da030f7a5dc386194f96f3c6ca444a78/ruff-0.9.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:50c647ff96f4ba288db0ad87048257753733763b409b2faf2ea78b45c8bb7fcb", size = 10012308 },
-    { url = "https://files.pythonhosted.org/packages/6f/9b/780aa5d4bdca8dcea4309264b8faa304bac30e1ce0bcc910422bfcadd203/ruff-0.9.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0c8b149e9c7353cace7d698e1656ffcf1e36e50f8ea3b5d5f7f87ff9986a7ca", size = 10881960 },
-    { url = "https://files.pythonhosted.org/packages/12/f4/dac4361afbfe520afa7186439e8094e4884ae3b15c8fc75fb2e759c1f267/ruff-0.9.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:beb3298604540c884d8b282fe7625651378e1986c25df51dec5b2f60cafc31ce", size = 10414803 },
-    { url = "https://files.pythonhosted.org/packages/f0/a2/057a3cb7999513cb78d6cb33a7d1cc6401c82d7332583786e4dad9e38e44/ruff-0.9.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39d0174ccc45c439093971cc06ed3ac4dc545f5e8bdacf9f067adf879544d969", size = 11464929 },
-    { url = "https://files.pythonhosted.org/packages/eb/c6/1ccfcc209bee465ced4874dcfeaadc88aafcc1ea9c9f31ef66f063c187f0/ruff-0.9.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:69572926c0f0c9912288915214ca9b2809525ea263603370b9e00bed2ba56dbd", size = 12170717 },
-    { url = "https://files.pythonhosted.org/packages/84/97/4a524027518525c7cf6931e9fd3b2382be5e4b75b2b61bec02681a7685a5/ruff-0.9.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:937267afce0c9170d6d29f01fcd1f4378172dec6760a9f4dface48cdabf9610a", size = 11708921 },
-    { url = "https://files.pythonhosted.org/packages/a6/a4/4e77cf6065c700d5593b25fca6cf725b1ab6d70674904f876254d0112ed0/ruff-0.9.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:186c2313de946f2c22bdf5954b8dd083e124bcfb685732cfb0beae0c47233d9b", size = 13058074 },
-    { url = "https://files.pythonhosted.org/packages/f9/d6/fcb78e0531e863d0a952c4c5600cc5cd317437f0e5f031cd2288b117bb37/ruff-0.9.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f94942a3bb767675d9a051867c036655fe9f6c8a491539156a6f7e6b5f31831", size = 11281093 },
-    { url = "https://files.pythonhosted.org/packages/e4/3b/7235bbeff00c95dc2d073cfdbf2b871b5bbf476754c5d277815d286b4328/ruff-0.9.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:728d791b769cc28c05f12c280f99e8896932e9833fef1dd8756a6af2261fd1ab", size = 10882610 },
-    { url = "https://files.pythonhosted.org/packages/2a/66/5599d23257c61cf038137f82999ca8f9d0080d9d5134440a461bef85b461/ruff-0.9.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2f312c86fb40c5c02b44a29a750ee3b21002bd813b5233facdaf63a51d9a85e1", size = 10489273 },
-    { url = "https://files.pythonhosted.org/packages/78/85/de4aa057e2532db0f9761e2c2c13834991e087787b93e4aeb5f1cb10d2df/ruff-0.9.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ae017c3a29bee341ba584f3823f805abbe5fe9cd97f87ed07ecbf533c4c88366", size = 11003314 },
-    { url = "https://files.pythonhosted.org/packages/00/42/afedcaa089116d81447347f76041ff46025849fedb0ed2b187d24cf70fca/ruff-0.9.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5dc40a378a0e21b4cfe2b8a0f1812a6572fc7b230ef12cd9fac9161aa91d807f", size = 11342982 },
-    { url = "https://files.pythonhosted.org/packages/39/c6/fe45f3eb27e3948b41a305d8b768e949bf6a39310e9df73f6c576d7f1d9f/ruff-0.9.1-py3-none-win32.whl", hash = "sha256:46ebf5cc106cf7e7378ca3c28ce4293b61b449cd121b98699be727d40b79ba72", size = 8819750 },
-    { url = "https://files.pythonhosted.org/packages/38/8d/580db77c3b9d5c3d9479e55b0b832d279c30c8f00ab0190d4cd8fc67831c/ruff-0.9.1-py3-none-win_amd64.whl", hash = "sha256:342a824b46ddbcdddd3abfbb332fa7fcaac5488bf18073e841236aadf4ad5c19", size = 9701331 },
-    { url = "https://files.pythonhosted.org/packages/b2/94/0498cdb7316ed67a1928300dd87d659c933479f44dec51b4f62bfd1f8028/ruff-0.9.1-py3-none-win_arm64.whl", hash = "sha256:1cd76c7f9c679e6e8f2af8f778367dca82b95009bc7b1a85a47f1521ae524fa7", size = 9145708 },
+    { url = "https://files.pythonhosted.org/packages/af/b9/0e168e4e7fb3af851f739e8f07889b91d1a33a30fca8c29fa3149d6b03ec/ruff-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:80605a039ba1454d002b32139e4970becf84b5fee3a3c3bf1c2af6f61a784347", size = 11652408 },
+    { url = "https://files.pythonhosted.org/packages/2c/22/08ede5db17cf701372a461d1cb8fdde037da1d4fa622b69ac21960e6237e/ruff-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9aab82bb20afd5f596527045c01e6ae25a718ff1784cb92947bff1f83068b00", size = 11587553 },
+    { url = "https://files.pythonhosted.org/packages/42/05/dedfc70f0bf010230229e33dec6e7b2235b2a1b8cbb2a991c710743e343f/ruff-0.9.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fbd337bac1cfa96be615f6efcd4bc4d077edbc127ef30e2b8ba2a27e18c054d4", size = 11020755 },
+    { url = "https://files.pythonhosted.org/packages/df/9b/65d87ad9b2e3def67342830bd1af98803af731243da1255537ddb8f22209/ruff-0.9.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b35259b0cbf8daa22a498018e300b9bb0174c2bbb7bcba593935158a78054d", size = 11826502 },
+    { url = "https://files.pythonhosted.org/packages/93/02/f2239f56786479e1a89c3da9bc9391120057fc6f4a8266a5b091314e72ce/ruff-0.9.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b6a9701d1e371bf41dca22015c3f89769da7576884d2add7317ec1ec8cb9c3c", size = 11390562 },
+    { url = "https://files.pythonhosted.org/packages/c9/37/d3a854dba9931f8cb1b2a19509bfe59e00875f48ade632e95aefcb7a0aee/ruff-0.9.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cc53e68b3c5ae41e8faf83a3b89f4a5d7b2cb666dff4b366bb86ed2a85b481f", size = 12548968 },
+    { url = "https://files.pythonhosted.org/packages/fa/c3/c7b812bb256c7a1d5553433e95980934ffa85396d332401f6b391d3c4569/ruff-0.9.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8efd9da7a1ee314b910da155ca7e8953094a7c10d0c0a39bfde3fcfd2a015684", size = 13187155 },
+    { url = "https://files.pythonhosted.org/packages/bd/5a/3c7f9696a7875522b66aa9bba9e326e4e5894b4366bd1dc32aa6791cb1ff/ruff-0.9.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3292c5a22ea9a5f9a185e2d131dc7f98f8534a32fb6d2ee7b9944569239c648d", size = 12704674 },
+    { url = "https://files.pythonhosted.org/packages/be/d6/d908762257a96ce5912187ae9ae86792e677ca4f3dc973b71e7508ff6282/ruff-0.9.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a605fdcf6e8b2d39f9436d343d1f0ff70c365a1e681546de0104bef81ce88df", size = 14529328 },
+    { url = "https://files.pythonhosted.org/packages/2d/c2/049f1e6755d12d9cd8823242fa105968f34ee4c669d04cac8cea51a50407/ruff-0.9.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547f7f256aa366834829a08375c297fa63386cbe5f1459efaf174086b564247", size = 12385955 },
+    { url = "https://files.pythonhosted.org/packages/91/5a/a9bdb50e39810bd9627074e42743b00e6dc4009d42ae9f9351bc3dbc28e7/ruff-0.9.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d18bba3d3353ed916e882521bc3e0af403949dbada344c20c16ea78f47af965e", size = 11810149 },
+    { url = "https://files.pythonhosted.org/packages/e5/fd/57df1a0543182f79a1236e82a79c68ce210efb00e97c30657d5bdb12b478/ruff-0.9.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b338edc4610142355ccf6b87bd356729b62bf1bc152a2fad5b0c7dc04af77bfe", size = 11479141 },
+    { url = "https://files.pythonhosted.org/packages/dc/16/bc3fd1d38974f6775fc152a0554f8c210ff80f2764b43777163c3c45d61b/ruff-0.9.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:492a5e44ad9b22a0ea98cf72e40305cbdaf27fac0d927f8bc9e1df316dcc96eb", size = 12014073 },
+    { url = "https://files.pythonhosted.org/packages/47/6b/e4ca048a8f2047eb652e1e8c755f384d1b7944f69ed69066a37acd4118b0/ruff-0.9.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:af1e9e9fe7b1f767264d26b1075ac4ad831c7db976911fa362d09b2d0356426a", size = 12435758 },
+    { url = "https://files.pythonhosted.org/packages/c2/40/4d3d6c979c67ba24cf183d29f706051a53c36d78358036a9cd21421582ab/ruff-0.9.2-py3-none-win32.whl", hash = "sha256:71cbe22e178c5da20e1514e1e01029c73dc09288a8028a5d3446e6bba87a5145", size = 9796916 },
+    { url = "https://files.pythonhosted.org/packages/c3/ef/7f548752bdb6867e6939489c87fe4da489ab36191525fadc5cede2a6e8e2/ruff-0.9.2-py3-none-win_amd64.whl", hash = "sha256:c5e1d6abc798419cf46eed03f54f2e0c3adb1ad4b801119dedf23fcaf69b55b5", size = 10773080 },
+    { url = "https://files.pythonhosted.org/packages/0e/4e/33df635528292bd2d18404e4daabcd74ca8a9853b2e1df85ed3d32d24362/ruff-0.9.2-py3-none-win_arm64.whl", hash = "sha256:a1b63fa24149918f8b37cef2ee6fff81f24f0d74b6f0bdc37bc3e1f2143e41c6", size = 10001738 },
 ]
 
 [[package]]
diff --git a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml
index 036bb664a..71e092dd8 100644
--- a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml
+++ b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml
@@ -36,7 +36,7 @@ repos:
 
   # Run the Ruff linter.
   - repo: https://github.com/astral-sh/ruff-pre-commit
-    rev: v0.9.1
+    rev: v0.9.2
     hooks:
       # Linter
       - id: ruff
diff --git a/{{cookiecutter.project_slug}}/requirements/local.txt b/{{cookiecutter.project_slug}}/requirements/local.txt
index ea12c249e..704d9e3a5 100644
--- a/{{cookiecutter.project_slug}}/requirements/local.txt
+++ b/{{cookiecutter.project_slug}}/requirements/local.txt
@@ -28,7 +28,7 @@ sphinx-autobuild==2024.10.3 # https://github.com/GaretJax/sphinx-autobuild
 
 # Code quality
 # ------------------------------------------------------------------------------
-ruff==0.9.1  # https://github.com/astral-sh/ruff
+ruff==0.9.2  # https://github.com/astral-sh/ruff
 coverage==7.6.10  # https://github.com/nedbat/coveragepy
 djlint==1.36.4  # https://github.com/Riverside-Healthcare/djLint
 pre-commit==4.0.1  # https://github.com/pre-commit/pre-commit

From 2193a661c5a57805a35a2ef03df73f5d5c0abc9a Mon Sep 17 00:00:00 2001
From: github-actions <action@github.com>
Date: Fri, 17 Jan 2025 02:23:58 +0000
Subject: [PATCH 18/19] Release 2025.01.16

---
 CHANGELOG.md   | 9 +++++++++
 pyproject.toml | 2 +-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 604cf7c83..ad8ec678f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,15 @@ All enhancements and patches to Cookiecutter Django will be documented in this f
 
 <!-- GENERATOR_PLACEHOLDER -->
 
+## 2025.01.16
+
+
+### Updated
+
+- Update ruff to 0.9.2 ([#5646](https://github.com/cookiecutter/cookiecutter-django/pull/5646))
+
+- Bump amazon/aws-cli from 2.22.1 to 2.23.0 ([#5645](https://github.com/cookiecutter/cookiecutter-django/pull/5645))
+
 ## 2025.01.15
 
 
diff --git a/pyproject.toml b/pyproject.toml
index e1ec8bfd7..f5df2e072 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "cookiecutter-django"
-version = "2025.01.15"
+version = "2025.01.16"
 description = "A Cookiecutter template for creating production-ready Django projects quickly."
 readme = "README.md"
 keywords = [

From 7f4211ab16ae735fdf7a35e84b177f0c85cc2909 Mon Sep 17 00:00:00 2001
From: Bruno Alla <browniebroke@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:28:59 +0000
Subject: [PATCH 19/19] Migrate test generation to pathlib (#5649)

---
 tests/test_cookiecutter_generation.py | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/tests/test_cookiecutter_generation.py b/tests/test_cookiecutter_generation.py
index 9669d78ba..1c03015c4 100755
--- a/tests/test_cookiecutter_generation.py
+++ b/tests/test_cookiecutter_generation.py
@@ -2,6 +2,8 @@ import glob
 import os
 import re
 import sys
+from collections.abc import Iterable
+from pathlib import Path
 
 import pytest
 
@@ -146,19 +148,19 @@ def _fixture_id(ctx):
     return "-".join(f"{key}:{value}" for key, value in ctx.items())
 
 
-def build_files_list(base_dir):
+def build_files_list(base_path: Path):
     """Build a list containing absolute paths to the generated files."""
-    return [os.path.join(dirpath, file_path) for dirpath, subdirs, files in os.walk(base_dir) for file_path in files]
+    return [dirpath / file_path for dirpath, subdirs, files in base_path.walk() for file_path in files]
 
 
-def check_paths(paths):
+def check_paths(paths: Iterable[Path]):
     """Method to check all paths have correct substitutions."""
     # Assert that no match is found in any of the files
     for path in paths:
-        if is_binary(path):
+        if is_binary(str(path)):
             continue
 
-        for line in open(path):
+        for line in path.open():
             match = RE_OBJ.search(line)
             assert match is None, f"cookiecutter variable not replaced in {path}"
 
@@ -173,7 +175,7 @@ def test_project_generation(cookies, context, context_override):
     assert result.project_path.name == context["project_slug"]
     assert result.project_path.is_dir()
 
-    paths = build_files_list(str(result.project_path))
+    paths = build_files_list(result.project_path)
     assert paths
     check_paths(paths)
 
@@ -286,7 +288,7 @@ def test_travis_invokes_pytest(cookies, context, use_docker, expected_test_scrip
     assert result.project_path.name == context["project_slug"]
     assert result.project_path.is_dir()
 
-    with open(f"{result.project_path}/.travis.yml") as travis_yml:
+    with (result.project_path / ".travis.yml").open() as travis_yml:
         try:
             yml = yaml.safe_load(travis_yml)["jobs"]["include"]
             assert yml[0]["script"] == ["ruff check ."]
@@ -311,7 +313,7 @@ def test_gitlab_invokes_precommit_and_pytest(cookies, context, use_docker, expec
     assert result.project_path.name == context["project_slug"]
     assert result.project_path.is_dir()
 
-    with open(f"{result.project_path}/.gitlab-ci.yml") as gitlab_yml:
+    with (result.project_path / ".gitlab-ci.yml").open() as gitlab_yml:
         try:
             gitlab_config = yaml.safe_load(gitlab_yml)
             assert gitlab_config["precommit"]["script"] == [
@@ -338,7 +340,7 @@ def test_github_invokes_linter_and_pytest(cookies, context, use_docker, expected
     assert result.project_path.name == context["project_slug"]
     assert result.project_path.is_dir()
 
-    with open(f"{result.project_path}/.github/workflows/ci.yml") as github_yml:
+    with (result.project_path / ".github" / "workflows" / "ci.yml").open() as github_yml:
         try:
             github_config = yaml.safe_load(github_yml)
             linter_present = False
@@ -389,9 +391,9 @@ def test_pycharm_docs_removed(cookies, context, editor, pycharm_docs_exist):
     context.update({"editor": editor})
     result = cookies.bake(extra_context=context)
 
-    with open(f"{result.project_path}/docs/index.rst") as f:
-        has_pycharm_docs = "pycharm/configuration" in f.read()
-        assert has_pycharm_docs is pycharm_docs_exist
+    index_rst = result.project_path / "docs" / "index.rst"
+    has_pycharm_docs = "pycharm/configuration" in index_rst.read_text()
+    assert has_pycharm_docs is pycharm_docs_exist
 
 
 def test_trim_domain_email(cookies, context):