diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md index da0480f1e..d955c79d4 100644 --- a/.github/ISSUE_TEMPLATE/bug.md +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -13,7 +13,6 @@ labels: bug - Host system configuration: - - Version of cookiecutter CLI (get it with `cookiecutter --version`): - OS name and version: diff --git a/.github/contributors.json b/.github/contributors.json index df4b8f993..d70c5e371 100644 --- a/.github/contributors.json +++ b/.github/contributors.json @@ -1728,5 +1728,30 @@ "name": "Dominique Plante", "github_login": "dominiqueplante", "twitter_username": "" + }, + { + "name": "Lucas Klasa", + "github_login": "lucaskbr", + "twitter_username": "" + }, + { + "name": "DevForsure", + "github_login": "DevForsure", + "twitter_username": "" + }, + { + "name": "Vincent Leduc", + "github_login": "leducvin", + "twitter_username": "" + }, + { + "name": "Martín Blech", + "github_login": "martinblech", + "twitter_username": "" + }, + { + "name": "jlitrell", + "github_login": "jlitrell", + "twitter_username": "" } ] \ No newline at end of file diff --git a/.github/workflows/align-versions.yml b/.github/workflows/align-versions.yml index fe919b965..d6dbb5f0f 100644 --- a/.github/workflows/align-versions.yml +++ b/.github/workflows/align-versions.yml @@ -14,7 +14,7 @@ permissions: jobs: run: - if: ${{ github.actor == 'pyup-bot' }} + if: ${{ github.event_name == 'workflow_dispatch' || github.actor == 'pyup-bot' || github.actor == 'dependabot[bot]' }} runs-on: ubuntu-latest env: GH_PAT: ${{ secrets.GH_PAT }} @@ -31,14 +31,14 @@ jobs: name: "${{ matrix.job.name }} versions" steps: - name: Checkout with token - uses: actions/checkout@v4 + uses: actions/checkout@v5 if: ${{ env.GH_PAT != '' }} with: token: ${{ env.GH_PAT }} ref: ${{ github.head_ref }} - name: Checkout without token - uses: actions/checkout@v4 + uses: actions/checkout@v5 if: ${{ env.GH_PAT == '' }} with: ref: ${{ github.head_ref }} @@ -47,6 +47,6 @@ jobs: - run: uv run ${{ matrix.job.script }} - - uses: stefanzweifel/git-auto-commit-action@v5 + - uses: stefanzweifel/git-auto-commit-action@v6 with: commit_message: Align versions diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3d4d7f7f5..a156d94e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: CI on: push: - branches: ["master", "main"] + branches: ["main"] pull_request: concurrency: @@ -22,7 +22,7 @@ jobs: name: "pytest ${{ matrix.os }}" runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install uv uses: astral-sh/setup-uv@v6 - name: Install dependencies @@ -51,7 +51,7 @@ jobs: COMPOSE_DOCKER_CLI_BUILD: 1 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install uv uses: astral-sh/setup-uv@v6 - name: Install dependencies @@ -93,7 +93,7 @@ jobs: DATABASE_URL: "postgres://postgres:postgres@localhost:5432/postgres" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-python@v5 with: python-version: "3.12" @@ -103,6 +103,6 @@ jobs: run: uv sync - uses: actions/setup-node@v4 with: - node-version: "22.14" + node-version: "24.6" - name: Bare Metal ${{ matrix.script.name }} run: sh tests/test_bare.sh ${{ matrix.script.args }} diff --git a/.github/workflows/dependabot-uv-lock.yml b/.github/workflows/dependabot-uv-lock.yml index 2075fc8ca..4992c0b3d 100644 --- a/.github/workflows/dependabot-uv-lock.yml +++ b/.github/workflows/dependabot-uv-lock.yml @@ -17,17 +17,17 @@ jobs: GH_PAT: ${{ secrets.GH_PAT }} steps: - name: Checkout with token - uses: actions/checkout@v4 + uses: actions/checkout@v5 if: ${{ env.GH_PAT != '' }} with: token: ${{ env.GH_PAT }} - name: Checkout without token - uses: actions/checkout@v4 + uses: actions/checkout@v5 if: ${{ env.GH_PAT == '' }} - uses: astral-sh/setup-uv@v6 - run: uv lock - - uses: stefanzweifel/git-auto-commit-action@v5 + - uses: stefanzweifel/git-auto-commit-action@v6 with: commit_message: Regenerate uv.lock diff --git a/.github/workflows/django-issue-checker.yml b/.github/workflows/django-issue-checker.yml index 79db564e0..aa904c089 100644 --- a/.github/workflows/django-issue-checker.yml +++ b/.github/workflows/django-issue-checker.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install uv uses: astral-sh/setup-uv@v6 - name: Create Django Major Issue diff --git a/.github/workflows/pre-commit-autoupdate.yml b/.github/workflows/pre-commit-autoupdate.yml index ebd092859..42b287da8 100644 --- a/.github/workflows/pre-commit-autoupdate.yml +++ b/.github/workflows/pre-commit-autoupdate.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-python@v5 with: python-version: "3.12" diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml index 70b660471..e5eab0c85 100644 --- a/.github/workflows/update-changelog.yml +++ b/.github/workflows/update-changelog.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install uv uses: astral-sh/setup-uv@v6 - name: Set git details diff --git a/.github/workflows/update-contributors.yml b/.github/workflows/update-contributors.yml index ac0996247..136906407 100644 --- a/.github/workflows/update-contributors.yml +++ b/.github/workflows/update-contributors.yml @@ -3,7 +3,7 @@ name: Update Contributors on: push: branches: - - master + - main permissions: contents: read @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install uv uses: astral-sh/setup-uv@v6 - name: Update list @@ -26,7 +26,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Commit changes - uses: stefanzweifel/git-auto-commit-action@v5.0.1 + uses: stefanzweifel/git-auto-commit-action@v6 with: commit_message: Update Contributors file_pattern: CONTRIBUTORS.md .github/contributors.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c7eaee0ee..f160b9582 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ default_language_version: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -44,7 +44,7 @@ repos: - id: isort - repo: https://github.com/PyCQA/flake8 - rev: 7.2.0 + rev: 7.3.0 hooks: - id: flake8 diff --git a/CHANGELOG.md b/CHANGELOG.md index 9edfc3bcd..92b259c31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,390 @@ All enhancements and patches to Cookiecutter Django will be documented in this f +## 2025.08.27 + + +### Updated + +- Update django-upgrade pre-commit hook ([#5991](https://github.com/cookiecutter/cookiecutter-django/pull/5991)) + +## 2025.08.26 + + +### Updated + +- Update sentry-sdk to 2.35.1 ([#5988](https://github.com/cookiecutter/cookiecutter-django/pull/5988)) + +- Update sphinx-autobuild to 2025.8.25 ([#5989](https://github.com/cookiecutter/cookiecutter-django/pull/5989)) + +## 2025.08.25 + + +### Updated + +- Update collectfasta to 3.3.1 ([#5987](https://github.com/cookiecutter/cookiecutter-django/pull/5987)) + +- Update coverage to 7.10.5 ([#5986](https://github.com/cookiecutter/cookiecutter-django/pull/5986)) + +- Update pytest-sugar to 1.1.1 ([#5984](https://github.com/cookiecutter/cookiecutter-django/pull/5984)) + +## 2025.08.21 + + +### Updated + +- Update ruff to 0.12.10 ([#5983](https://github.com/cookiecutter/cookiecutter-django/pull/5983)) + +## 2025.08.18 + + +### Updated + +- Bump node from 24.5 to 24.6 ([#5981](https://github.com/cookiecutter/cookiecutter-django/pull/5981)) + +- Update coverage to 7.10.4 ([#5980](https://github.com/cookiecutter/cookiecutter-django/pull/5980)) + +- Update pytest-sugar to 1.1.0 ([#5979](https://github.com/cookiecutter/cookiecutter-django/pull/5979)) + +## 2025.08.15 + + +### Updated + +- Update django-allauth to 65.11.0 ([#5977](https://github.com/cookiecutter/cookiecutter-django/pull/5977)) + +- Update sentry-sdk to 2.35.0 ([#5976](https://github.com/cookiecutter/cookiecutter-django/pull/5976)) + +## 2025.08.14 + + +### Updated + +- Update ruff to 0.12.9 ([#5975](https://github.com/cookiecutter/cookiecutter-django/pull/5975)) + +## 2025.08.13 + + +### Fixed + +- Fix imagemin corruption with Gulp ([#5974](https://github.com/cookiecutter/cookiecutter-django/pull/5974)) + +## 2025.08.12 + + +### Updated + +- Update coverage to 7.10.3 ([#5972](https://github.com/cookiecutter/cookiecutter-django/pull/5972)) + +## 2025.08.10 + + +### Updated + +- Update pre-commit to 4.3.0 ([#5971](https://github.com/cookiecutter/cookiecutter-django/pull/5971)) + +- Auto-update pre-commit hooks ([#5970](https://github.com/cookiecutter/cookiecutter-django/pull/5970)) + +## 2025.08.08 + + +### Changed + +- Remove `project.css` when a bundler is used ([#5874](https://github.com/cookiecutter/cookiecutter-django/pull/5874)) + +### Updated + +- Update redis to 6.4.0 ([#5968](https://github.com/cookiecutter/cookiecutter-django/pull/5968)) + +- Update ruff to 0.12.8 ([#5969](https://github.com/cookiecutter/cookiecutter-django/pull/5969)) + +## 2025.08.07 + + +### Updated + +- Update djangorestframework to 3.16.1 ([#5966](https://github.com/cookiecutter/cookiecutter-django/pull/5966)) + +## 2025.08.06 + + +### Updated + +- Update coverage to 7.10.2 ([#5964](https://github.com/cookiecutter/cookiecutter-django/pull/5964)) + +- Update redis to 6.3.0 ([#5963](https://github.com/cookiecutter/cookiecutter-django/pull/5963)) + +## 2025.08.05 + + +### Changed + +- Rename `master` branch to `main` ([#5961](https://github.com/cookiecutter/cookiecutter-django/pull/5961)) + +### Updated + +- Bump node from 22.14 to 24.5 in local Docker image ([#5960](https://github.com/cookiecutter/cookiecutter-django/pull/5960)) + +## 2025.08.01 + + +### Updated + +- Update django-debug-toolbar to 6.0.0 ([#5945](https://github.com/cookiecutter/cookiecutter-django/pull/5945)) + +- Bump amazon/aws-cli from 2.27.12 to 2.28.0 ([#5957](https://github.com/cookiecutter/cookiecutter-django/pull/5957)) + +- Update mypy to 1.17.1 ([#5956](https://github.com/cookiecutter/cookiecutter-django/pull/5956)) + +## 2025.07.30 + + +### Changed + +- docs: remove `$` from shell command examples for easier copy-pasting ([#5948](https://github.com/cookiecutter/cookiecutter-django/pull/5948)) + +### Updated + +- Update sentry-sdk to 2.34.1 ([#5955](https://github.com/cookiecutter/cookiecutter-django/pull/5955)) + +- Update ruff to 0.12.7 ([#5952](https://github.com/cookiecutter/cookiecutter-django/pull/5952)) + +## 2025.07.27 + + +### Updated + +- Update coverage to 7.10.1 ([#5947](https://github.com/cookiecutter/cookiecutter-django/pull/5947)) + +## 2025.07.25 + + +### Updated + +- Update django-anymail to 13.0.1 ([#5946](https://github.com/cookiecutter/cookiecutter-django/pull/5946)) + +## 2025.07.24 + + +### Updated + +- Update coverage to 7.10.0 ([#5944](https://github.com/cookiecutter/cookiecutter-django/pull/5944)) + +- Update ruff to 0.12.5 ([#5943](https://github.com/cookiecutter/cookiecutter-django/pull/5943)) + +- Bump traefik from 3.4.4 to 3.5.0 ([#5942](https://github.com/cookiecutter/cookiecutter-django/pull/5942)) + +## 2025.07.22 + + +### Updated + +- Update sentry-sdk to 2.33.2 ([#5941](https://github.com/cookiecutter/cookiecutter-django/pull/5941)) + +## 2025.07.21 + + +### Updated + +- Update sentry-sdk to 2.33.1 ([#5940](https://github.com/cookiecutter/cookiecutter-django/pull/5940)) + +## 2025.07.18 + + +### Updated + +- Update mypy to 1.17.0 ([#5937](https://github.com/cookiecutter/cookiecutter-django/pull/5937)) + +- Update django-stubs to 5.2.2 ([#5936](https://github.com/cookiecutter/cookiecutter-django/pull/5936)) + +## 2025.07.17 + + +### Updated + +- Update ruff to 0.12.4 ([#5935](https://github.com/cookiecutter/cookiecutter-django/pull/5935)) + +## 2025.07.16 + + +### Updated + +- Update sentry-sdk to 2.33.0 ([#5933](https://github.com/cookiecutter/cookiecutter-django/pull/5933)) + +## 2025.07.15 + + +### Updated + +- Update mypy to 1.16.1 ([#5901](https://github.com/cookiecutter/cookiecutter-django/pull/5901)) + +- Bump traefik from 3.4.3 to 3.4.4 ([#5930](https://github.com/cookiecutter/cookiecutter-django/pull/5930)) + +## 2025.07.14 + + +### Changed + +- Fix howto docker command ([#5929](https://github.com/cookiecutter/cookiecutter-django/pull/5929)) + +## 2025.07.11 + + +### Updated + +- Update ruff to 0.12.3 ([#5928](https://github.com/cookiecutter/cookiecutter-django/pull/5928)) + +- Update django-allauth to 65.10.0 ([#5927](https://github.com/cookiecutter/cookiecutter-django/pull/5927)) + +## 2025.07.05 + + +### Updated + +- Update coverage to 7.9.2 ([#5925](https://github.com/cookiecutter/cookiecutter-django/pull/5925)) + +## 2025.07.04 + + +### Updated + +- Update ruff to 0.12.2 ([#5923](https://github.com/cookiecutter/cookiecutter-django/pull/5923)) + +## 2025.07.02 + + +### Updated + +- Update pillow to 11.3.0 ([#5921](https://github.com/cookiecutter/cookiecutter-django/pull/5921)) + +## 2025.06.30 + + +### Updated + +- Bump traefik from 3.4.1 to 3.4.3 ([#5917](https://github.com/cookiecutter/cookiecutter-django/pull/5917)) + +- Update uvicorn to 0.35.0 ([#5919](https://github.com/cookiecutter/cookiecutter-django/pull/5919)) + +- Update sentry-sdk to 2.32.0 ([#5918](https://github.com/cookiecutter/cookiecutter-django/pull/5918)) + +## 2025.06.26 + + +### Updated + +- Update ruff to 0.12.1 ([#5916](https://github.com/cookiecutter/cookiecutter-django/pull/5916)) + +## 2025.06.24 + + +### Updated + +- Update sentry-sdk to 2.31.0 ([#5912](https://github.com/cookiecutter/cookiecutter-django/pull/5912)) + +## 2025.06.19 + + +### Updated + +- Update pytest to 8.4.1 ([#5907](https://github.com/cookiecutter/cookiecutter-django/pull/5907)) + +## 2025.06.18 + + +### Updated + +- Update ruff to 0.12.0 ([#5904](https://github.com/cookiecutter/cookiecutter-django/pull/5904)) + +- Update django-stubs to 5.2.1 ([#5905](https://github.com/cookiecutter/cookiecutter-django/pull/5905)) + +- Update django-redis to 6.0.0 ([#5903](https://github.com/cookiecutter/cookiecutter-django/pull/5903)) + +- Update django-webpack-loader to 3.2.1 ([#5902](https://github.com/cookiecutter/cookiecutter-django/pull/5902)) + +## 2025.06.17 + + +### Updated + +- Update django-coverage-plugin to 3.1.1 ([#5900](https://github.com/cookiecutter/cookiecutter-django/pull/5900)) + +- Update watchfiles to 1.1.0 ([#5899](https://github.com/cookiecutter/cookiecutter-django/pull/5899)) + +## 2025.06.15 + + +### Updated + +- Update coverage to 7.9.1 ([#5898](https://github.com/cookiecutter/cookiecutter-django/pull/5898)) + +## 2025.06.13 + + +### Updated + +- Update coverage to 7.9.0 ([#5897](https://github.com/cookiecutter/cookiecutter-django/pull/5897)) + +- Update sentry-sdk to 2.30.0 ([#5896](https://github.com/cookiecutter/cookiecutter-django/pull/5896)) + +## 2025.06.11 + + +### Updated + +- Update collectfasta to 3.3.0 ([#5892](https://github.com/cookiecutter/cookiecutter-django/pull/5892)) + +## 2025.06.10 + + +### Updated + +- Update django to 5.1.11 ([#5891](https://github.com/cookiecutter/cookiecutter-django/pull/5891)) + +- Update crispy-bootstrap5 to 2025.6 ([#5888](https://github.com/cookiecutter/cookiecutter-django/pull/5888)) + +## 2025.06.06 + + +### Updated + +- Update ruff to 0.11.13 ([#5887](https://github.com/cookiecutter/cookiecutter-django/pull/5887)) + +## 2025.06.05 + + +### Updated + +- Bump python from 3.12.10 to 3.12.11 in docs Docker ([#5883](https://github.com/cookiecutter/cookiecutter-django/pull/5883)) + +- Bump python from 3.12.10 to 3.12.11 in production Docker ([#5884](https://github.com/cookiecutter/cookiecutter-django/pull/5884)) + +- Bump python from 3.12.10 3.12.11 in local Docker ([#5885](https://github.com/cookiecutter/cookiecutter-django/pull/5885)) + +- Update django to 5.1.10 ([#5882](https://github.com/cookiecutter/cookiecutter-django/pull/5882)) + +## 2025.06.04 + + +### Updated + +- Update argon2-cffi to 25.1.0 ([#5880](https://github.com/cookiecutter/cookiecutter-django/pull/5880)) + +- Update pytest to 8.4.0 ([#5881](https://github.com/cookiecutter/cookiecutter-django/pull/5881)) + +## 2025.06.02 + + +### Updated + +- Update django-allauth to 65.9.0 ([#5879](https://github.com/cookiecutter/cookiecutter-django/pull/5879)) + +- Update uvicorn to 0.34.3 ([#5878](https://github.com/cookiecutter/cookiecutter-django/pull/5878)) + +- Update celery to 5.5.3 ([#5877](https://github.com/cookiecutter/cookiecutter-django/pull/5877)) + +- Update ruff to 0.11.12 ([#5872](https://github.com/cookiecutter/cookiecutter-django/pull/5872)) + ## 2025.05.28 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e6bf04061..b8a926794 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,7 @@ Always happy to get issues identified and pull requests! 2. Clone your fork 3. Create a branch for your changes -This last step is very important, don't start developing from master, it'll cause pain if you need to send another change later. +This last step is very important, don't start developing from main, it'll cause pain if you need to send another change later. ## Testing diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index faec8b02b..86acac432 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -768,6 +768,13 @@ Listed in alphabetical order. + + DevForsure + + DevForsure + + + Diane Chen @@ -1265,6 +1272,13 @@ Listed in alphabetical order. afrowave + + jlitrell + + jlitrell + + + John @@ -1510,6 +1524,13 @@ Listed in alphabetical order. + + Lucas Klasa + + lucaskbr + + + Luis Nell @@ -1594,6 +1615,13 @@ Listed in alphabetical order. + + Martín Blech + + martinblech + + + masavini @@ -2336,6 +2364,13 @@ Listed in alphabetical order. + + Vincent Leduc + + leducvin + + + Vitaly Babiy diff --git a/README.md b/README.md index c642f7d21..71fe88904 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Cookiecutter Django -[![Build Status](https://img.shields.io/github/actions/workflow/status/cookiecutter/cookiecutter-django/ci.yml?branch=master)](https://github.com/cookiecutter/cookiecutter-django/actions/workflows/ci.yml?query=branch%3Amaster) +[![Build Status](https://img.shields.io/github/actions/workflow/status/cookiecutter/cookiecutter-django/ci.yml?branch=main)](https://github.com/cookiecutter/cookiecutter-django/actions/workflows/ci.yml?query=branch%3Amain) [![Documentation Status](https://readthedocs.org/projects/cookiecutter-django/badge/?version=latest)](https://cookiecutter-django.readthedocs.io/en/latest/?badge=latest) -[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/cookiecutter/cookiecutter-django/master.svg)](https://results.pre-commit.ci/latest/github/cookiecutter/cookiecutter-django/master) +[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/cookiecutter/cookiecutter-django/main.svg)](https://results.pre-commit.ci/latest/github/cookiecutter/cookiecutter-django/main) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) [![Updates](https://pyup.io/repos/github/cookiecutter/cookiecutter-django/shield.svg)](https://pyup.io/repos/github/cookiecutter/cookiecutter-django/) @@ -67,7 +67,7 @@ Projects that provide financial support to the maintainers: ### Two Scoops of Django -[![Cover of the book "Two Scoops of Django 3.x"](https://f004.backblazeb2.com/file/feldroycom/images/book-TSD3-800.jpg)](https://www.feldroy.com/two-scoops-press#two-scoops-of-django) +[![Cover of the book "Two Scoops of Django 3.x"](https://f004.backblazeb2.com/file/feldroycom/images/book-TSD3-800.jpg)](https://www.feldroy.com/two-scoops-of-django) Two Scoops of Django 3.x is the best ice cream-themed Django reference in the universe! @@ -175,16 +175,16 @@ Answer the prompts with your own desired [options](http://cookiecutter-django.re Enter the project and take a look around: - $ cd reddit/ - $ ls + cd reddit/ + ls Create a git repo and push it there: - $ git init - $ git add . - $ git commit -m "first awesome commit" - $ git remote add origin git@github.com:pydanny/redditclone.git - $ git push -u origin master + git init + git add . + git commit -m "first awesome commit" + git remote add origin git@github.com:pydanny/redditclone.git + git push -u origin main Now take a look at your repo. Don't forget to carefully look at the generated README. Awesome, right? diff --git a/docs/5-help/faq.rst b/docs/5-help/faq.rst index 294e6c8e1..5b4e824f5 100644 --- a/docs/5-help/faq.rst +++ b/docs/5-help/faq.rst @@ -10,7 +10,7 @@ It is there to add a migration so you don't have to manually change the ``sites. See `0003_set_site_domain_and_name.py`_. -.. _`0003_set_site_domain_and_name.py`: https://github.com/cookiecutter/cookiecutter-django/blob/master/%7B%7Bcookiecutter.project_slug%7D%7D/%7B%7Bcookiecutter.project_slug%7D%7D/contrib/sites/migrations/0003_set_site_domain_and_name.py +.. _`0003_set_site_domain_and_name.py`: https://github.com/cookiecutter/cookiecutter-django/blob/main/%7B%7Bcookiecutter.project_slug%7D%7D/%7B%7Bcookiecutter.project_slug%7D%7D/contrib/sites/migrations/0003_set_site_domain_and_name.py Why aren't you using just one configuration file (12-Factor App) diff --git a/docs/6-about/maintainer-guide.md b/docs/6-about/maintainer-guide.md index 9baac688a..fa9dfa95a 100644 --- a/docs/6-about/maintainer-guide.md +++ b/docs/6-about/maintainer-guide.md @@ -96,9 +96,9 @@ With that in mind, when merging changes, it's a good idea to set the labels and `update-contributors.yml` -Runs on each push to master branch. List the 5 most recently merged pull requests and extract their author. If any of the authors is a new one, updates the `.github/contributors.json`, regenerate the `CONTRIBUTORS.md` from it, and push back the changes to master. +Runs on each push to main branch. List the 5 most recently merged pull requests and extract their author. If any of the authors is a new one, updates the `.github/contributors.json`, regenerate the `CONTRIBUTORS.md` from it, and push back the changes to master. #### Limitations -- If you merge a pull request from a new contributor, and merge another one right after, the push to master will fail as the remote will be out of date. +- If you merge a pull request from a new contributor, and merge another one right after, the push to main will fail as the remote will be out of date. - If you merge more than 5 pull requests in a row like this, the new contributor might fail to be added. diff --git a/hooks/post_gen_project.py b/hooks/post_gen_project.py index 59bb534ae..33a299dfa 100644 --- a/hooks/post_gen_project.py +++ b/hooks/post_gen_project.py @@ -9,7 +9,7 @@ from pathlib import Path try: # Inspired by - # https://github.com/django/django/blob/master/django/utils/crypto.py + # https://github.com/django/django/blob/main/django/utils/crypto.py random = random.SystemRandom() using_sysrandom = True except NotImplementedError: @@ -109,6 +109,12 @@ def remove_vendors_js(): vendors_js_path.unlink() +def remove_project_css(): + project_css_path = Path("{{ cookiecutter.project_slug }}", "static", "css", "project.css") + if project_css_path.exists(): + project_css_path.unlink() + + def remove_packagejson_file(): file_names = ["package.json"] for file_name in file_names: @@ -470,6 +476,7 @@ def main(): if "{{ cookiecutter.use_docker }}".lower() == "y": remove_node_dockerfile() else: + remove_project_css() handle_js_runner( "{{ cookiecutter.frontend_pipeline }}", use_docker=("{{ cookiecutter.use_docker }}".lower() == "y"), diff --git a/pyproject.toml b/pyproject.toml index 34b05bafb..4b3dfc76e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cookiecutter-django" -version = "2025.05.28" +version = "2025.08.27" 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.11.11", + "ruff==0.12.10", "sh==2.1; sys_platform!='win23'", "tox==4.23.2", "tox-uv>=1.17", diff --git a/uv.lock b/uv.lock index 1c3007c40..52f984017 100644 --- a/uv.lock +++ b/uv.lock @@ -182,7 +182,7 @@ wheels = [ [[package]] name = "cookiecutter-django" -version = "2025.5.28" +version = "2025.8.27" 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.11.11" }, + { name = "ruff", specifier = "==0.12.10" }, { name = "sh", marker = "sys_platform != 'win23'", specifier = "==2.1" }, { name = "tox", specifier = "==4.23.2" }, { name = "tox-uv", specifier = ">=1.17" }, @@ -839,27 +839,28 @@ wheels = [ [[package]] name = "ruff" -version = "0.11.11" +version = "0.12.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/53/ae4857030d59286924a8bdb30d213d6ff22d8f0957e738d0289990091dd8/ruff-0.11.11.tar.gz", hash = "sha256:7774173cc7c1980e6bf67569ebb7085989a78a103922fb83ef3dfe230cd0687d", size = 4186707 } +sdist = { url = "https://files.pythonhosted.org/packages/3b/eb/8c073deb376e46ae767f4961390d17545e8535921d2f65101720ed8bd434/ruff-0.12.10.tar.gz", hash = "sha256:189ab65149d11ea69a2d775343adf5f49bb2426fc4780f65ee33b423ad2e47f9", size = 5310076 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/14/f2326676197bab099e2a24473158c21656fbf6a207c65f596ae15acb32b9/ruff-0.11.11-py3-none-linux_armv6l.whl", hash = "sha256:9924e5ae54125ed8958a4f7de320dab7380f6e9fa3195e3dc3b137c6842a0092", size = 10229049 }, - { url = "https://files.pythonhosted.org/packages/9a/f3/bff7c92dd66c959e711688b2e0768e486bbca46b2f35ac319bb6cce04447/ruff-0.11.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c8a93276393d91e952f790148eb226658dd275cddfde96c6ca304873f11d2ae4", size = 11053601 }, - { url = "https://files.pythonhosted.org/packages/e2/38/8e1a3efd0ef9d8259346f986b77de0f62c7a5ff4a76563b6b39b68f793b9/ruff-0.11.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d6e333dbe2e6ae84cdedefa943dfd6434753ad321764fd937eef9d6b62022bcd", size = 10367421 }, - { url = "https://files.pythonhosted.org/packages/b4/50/557ad9dd4fb9d0bf524ec83a090a3932d284d1a8b48b5906b13b72800e5f/ruff-0.11.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7885d9a5e4c77b24e8c88aba8c80be9255fa22ab326019dac2356cff42089fc6", size = 10581980 }, - { url = "https://files.pythonhosted.org/packages/c4/b2/e2ed82d6e2739ece94f1bdbbd1d81b712d3cdaf69f0a1d1f1a116b33f9ad/ruff-0.11.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b5ab797fcc09121ed82e9b12b6f27e34859e4227080a42d090881be888755d4", size = 10089241 }, - { url = "https://files.pythonhosted.org/packages/3d/9f/b4539f037a5302c450d7c695c82f80e98e48d0d667ecc250e6bdeb49b5c3/ruff-0.11.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e231ff3132c1119ece836487a02785f099a43992b95c2f62847d29bace3c75ac", size = 11699398 }, - { url = "https://files.pythonhosted.org/packages/61/fb/32e029d2c0b17df65e6eaa5ce7aea5fbeaed22dddd9fcfbbf5fe37c6e44e/ruff-0.11.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a97c9babe1d4081037a90289986925726b802d180cca784ac8da2bbbc335f709", size = 12427955 }, - { url = "https://files.pythonhosted.org/packages/6e/e3/160488dbb11f18c8121cfd588e38095ba779ae208292765972f7732bfd95/ruff-0.11.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8c4ddcbe8a19f59f57fd814b8b117d4fcea9bee7c0492e6cf5fdc22cfa563c8", size = 12069803 }, - { url = "https://files.pythonhosted.org/packages/ff/16/3b006a875f84b3d0bff24bef26b8b3591454903f6f754b3f0a318589dcc3/ruff-0.11.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6224076c344a7694c6fbbb70d4f2a7b730f6d47d2a9dc1e7f9d9bb583faf390b", size = 11242630 }, - { url = "https://files.pythonhosted.org/packages/65/0d/0338bb8ac0b97175c2d533e9c8cdc127166de7eb16d028a43c5ab9e75abd/ruff-0.11.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:882821fcdf7ae8db7a951df1903d9cb032bbe838852e5fc3c2b6c3ab54e39875", size = 11507310 }, - { url = "https://files.pythonhosted.org/packages/6f/bf/d7130eb26174ce9b02348b9f86d5874eafbf9f68e5152e15e8e0a392e4a3/ruff-0.11.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:dcec2d50756463d9df075a26a85a6affbc1b0148873da3997286caf1ce03cae1", size = 10441144 }, - { url = "https://files.pythonhosted.org/packages/b3/f3/4be2453b258c092ff7b1761987cf0749e70ca1340cd1bfb4def08a70e8d8/ruff-0.11.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:99c28505ecbaeb6594701a74e395b187ee083ee26478c1a795d35084d53ebd81", size = 10081987 }, - { url = "https://files.pythonhosted.org/packages/6c/6e/dfa4d2030c5b5c13db158219f2ec67bf333e8a7748dccf34cfa2a6ab9ebc/ruff-0.11.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9263f9e5aa4ff1dec765e99810f1cc53f0c868c5329b69f13845f699fe74f639", size = 11073922 }, - { url = "https://files.pythonhosted.org/packages/ff/f4/f7b0b0c3d32b593a20ed8010fa2c1a01f2ce91e79dda6119fcc51d26c67b/ruff-0.11.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:64ac6f885e3ecb2fdbb71de2701d4e34526651f1e8503af8fb30d4915a3fe345", size = 11568537 }, - { url = "https://files.pythonhosted.org/packages/d2/46/0e892064d0adc18bcc81deed9aaa9942a27fd2cd9b1b7791111ce468c25f/ruff-0.11.11-py3-none-win32.whl", hash = "sha256:1adcb9a18802268aaa891ffb67b1c94cd70578f126637118e8099b8e4adcf112", size = 10536492 }, - { url = "https://files.pythonhosted.org/packages/1b/d9/232e79459850b9f327e9f1dc9c047a2a38a6f9689e1ec30024841fc4416c/ruff-0.11.11-py3-none-win_amd64.whl", hash = "sha256:748b4bb245f11e91a04a4ff0f96e386711df0a30412b9fe0c74d5bdc0e4a531f", size = 11612562 }, - { url = "https://files.pythonhosted.org/packages/ce/eb/09c132cff3cc30b2e7244191dcce69437352d6d6709c0adf374f3e6f476e/ruff-0.11.11-py3-none-win_arm64.whl", hash = "sha256:6c51f136c0364ab1b774767aa8b86331bd8e9d414e2d107db7a2189f35ea1f7b", size = 10735951 }, + { url = "https://files.pythonhosted.org/packages/24/e7/560d049d15585d6c201f9eeacd2fd130def3741323e5ccf123786e0e3c95/ruff-0.12.10-py3-none-linux_armv6l.whl", hash = "sha256:8b593cb0fb55cc8692dac7b06deb29afda78c721c7ccfed22db941201b7b8f7b", size = 11935161 }, + { url = "https://files.pythonhosted.org/packages/d1/b0/ad2464922a1113c365d12b8f80ed70fcfb39764288ac77c995156080488d/ruff-0.12.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ebb7333a45d56efc7c110a46a69a1b32365d5c5161e7244aaf3aa20ce62399c1", size = 12660884 }, + { url = "https://files.pythonhosted.org/packages/d7/f1/97f509b4108d7bae16c48389f54f005b62ce86712120fd8b2d8e88a7cb49/ruff-0.12.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d59e58586829f8e4a9920788f6efba97a13d1fa320b047814e8afede381c6839", size = 11872754 }, + { url = "https://files.pythonhosted.org/packages/12/ad/44f606d243f744a75adc432275217296095101f83f966842063d78eee2d3/ruff-0.12.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:822d9677b560f1fdeab69b89d1f444bf5459da4aa04e06e766cf0121771ab844", size = 12092276 }, + { url = "https://files.pythonhosted.org/packages/06/1f/ed6c265e199568010197909b25c896d66e4ef2c5e1c3808caf461f6f3579/ruff-0.12.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b4a64f4062a50c75019c61c7017ff598cb444984b638511f48539d3a1c98db", size = 11734700 }, + { url = "https://files.pythonhosted.org/packages/63/c5/b21cde720f54a1d1db71538c0bc9b73dee4b563a7dd7d2e404914904d7f5/ruff-0.12.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c6f4064c69d2542029b2a61d39920c85240c39837599d7f2e32e80d36401d6e", size = 13468783 }, + { url = "https://files.pythonhosted.org/packages/02/9e/39369e6ac7f2a1848f22fb0b00b690492f20811a1ac5c1fd1d2798329263/ruff-0.12.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:059e863ea3a9ade41407ad71c1de2badfbe01539117f38f763ba42a1206f7559", size = 14436642 }, + { url = "https://files.pythonhosted.org/packages/e3/03/5da8cad4b0d5242a936eb203b58318016db44f5c5d351b07e3f5e211bb89/ruff-0.12.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bef6161e297c68908b7218fa6e0e93e99a286e5ed9653d4be71e687dff101cf", size = 13859107 }, + { url = "https://files.pythonhosted.org/packages/19/19/dd7273b69bf7f93a070c9cec9494a94048325ad18fdcf50114f07e6bf417/ruff-0.12.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f1345fbf8fb0531cd722285b5f15af49b2932742fc96b633e883da8d841896b", size = 12886521 }, + { url = "https://files.pythonhosted.org/packages/c0/1d/b4207ec35e7babaee62c462769e77457e26eb853fbdc877af29417033333/ruff-0.12.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f68433c4fbc63efbfa3ba5db31727db229fa4e61000f452c540474b03de52a9", size = 13097528 }, + { url = "https://files.pythonhosted.org/packages/ff/00/58f7b873b21114456e880b75176af3490d7a2836033779ca42f50de3b47a/ruff-0.12.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:141ce3d88803c625257b8a6debf4a0473eb6eed9643a6189b68838b43e78165a", size = 13080443 }, + { url = "https://files.pythonhosted.org/packages/12/8c/9e6660007fb10189ccb78a02b41691288038e51e4788bf49b0a60f740604/ruff-0.12.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f3fc21178cd44c98142ae7590f42ddcb587b8e09a3b849cbc84edb62ee95de60", size = 11896759 }, + { url = "https://files.pythonhosted.org/packages/67/4c/6d092bb99ea9ea6ebda817a0e7ad886f42a58b4501a7e27cd97371d0ba54/ruff-0.12.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7d1a4e0bdfafcd2e3e235ecf50bf0176f74dd37902f241588ae1f6c827a36c56", size = 11701463 }, + { url = "https://files.pythonhosted.org/packages/59/80/d982c55e91df981f3ab62559371380616c57ffd0172d96850280c2b04fa8/ruff-0.12.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e67d96827854f50b9e3e8327b031647e7bcc090dbe7bb11101a81a3a2cbf1cc9", size = 12691603 }, + { url = "https://files.pythonhosted.org/packages/ad/37/63a9c788bbe0b0850611669ec6b8589838faf2f4f959647f2d3e320383ae/ruff-0.12.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ae479e1a18b439c59138f066ae79cc0f3ee250712a873d00dbafadaad9481e5b", size = 13164356 }, + { url = "https://files.pythonhosted.org/packages/47/d4/1aaa7fb201a74181989970ebccd12f88c0fc074777027e2a21de5a90657e/ruff-0.12.10-py3-none-win32.whl", hash = "sha256:9de785e95dc2f09846c5e6e1d3a3d32ecd0b283a979898ad427a9be7be22b266", size = 11896089 }, + { url = "https://files.pythonhosted.org/packages/ad/14/2ad38fd4037daab9e023456a4a40ed0154e9971f8d6aed41bdea390aabd9/ruff-0.12.10-py3-none-win_amd64.whl", hash = "sha256:7837eca8787f076f67aba2ca559cefd9c5cbc3a9852fd66186f4201b87c1563e", size = 13004616 }, + { url = "https://files.pythonhosted.org/packages/24/3c/21cf283d67af33a8e6ed242396863af195a8a6134ec581524fd22b9811b6/ruff-0.12.10-py3-none-win_arm64.whl", hash = "sha256:cc138cc06ed9d4bfa9d667a65af7172b47840e1a98b02ce7011c391e54635ffc", size = 12074225 }, ] [[package]] diff --git a/{{cookiecutter.project_slug}}/.github/workflows/ci.yml b/{{cookiecutter.project_slug}}/.github/workflows/ci.yml index 2679a0124..536ecbec6 100644 --- a/{{cookiecutter.project_slug}}/.github/workflows/ci.yml +++ b/{{cookiecutter.project_slug}}/.github/workflows/ci.yml @@ -7,11 +7,11 @@ env: on: pull_request: - branches: ['master', 'main'] + branches: ['main'] paths-ignore: ['docs/**'] push: - branches: ['master', 'main'] + branches: ['main'] paths-ignore: ['docs/**'] concurrency: @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Code Repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up Python uses: actions/setup-python@v5 @@ -65,7 +65,7 @@ jobs: steps: - name: Checkout Code Repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 {%- if cookiecutter.use_docker == 'y' %} - name: Set up Docker Buildx diff --git a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml index ebf4f9172..ac2e47afd 100644 --- a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml +++ b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml @@ -7,7 +7,7 @@ default_language_version: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -29,17 +29,17 @@ repos: exclude: '{{cookiecutter.project_slug}}/templates/' - repo: https://github.com/adamchainz/django-upgrade - rev: '1.25.0' + rev: '1.27.0' hooks: - id: django-upgrade args: ['--target-version', '5.0'] # Run the Ruff linter. - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.11 + rev: v0.12.10 hooks: # Linter - - id: ruff + - id: ruff-check args: [--fix, --exit-non-zero-on-fix] # Formatter - id: ruff-format diff --git a/{{cookiecutter.project_slug}}/compose/local/node/Dockerfile b/{{cookiecutter.project_slug}}/compose/local/node/Dockerfile index 990652a3c..c34d3bb61 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.14-bookworm-slim +FROM docker.io/node:24.6-bookworm-slim WORKDIR /app diff --git a/{{cookiecutter.project_slug}}/compose/production/aws/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/aws/Dockerfile index db5fbda66..6cba899a2 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.27.12 +FROM docker.io/amazon/aws-cli:2.28.0 # Clear entrypoint from the base image, otherwise it's always calling the aws CLI ENTRYPOINT [] diff --git a/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile index 1f78d4591..da0a641d6 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.14-bookworm-slim AS client-builder +FROM docker.io/node:24.6-bookworm-slim AS client-builder ARG APP_HOME=/app WORKDIR ${APP_HOME} @@ -24,7 +24,7 @@ ENV DJANGO_AZURE_ACCOUNT_NAME=${DJANGO_AZURE_ACCOUNT_NAME} RUN npm run build {%- endif %} # define an alias for the specific python version used in this file. -FROM docker.io/python:3.12.10-slim-bookworm AS python +FROM docker.io/python:3.12.11-slim-bookworm AS python # Python build stage FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS python-build-stage diff --git a/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile index 62c4824d0..2a83e94bf 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.4.1 +FROM docker.io/traefik:3.5.0 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/celery_app.py b/{{cookiecutter.project_slug}}/config/celery_app.py index 836429078..f2ffac0da 100644 --- a/{{cookiecutter.project_slug}}/config/celery_app.py +++ b/{{cookiecutter.project_slug}}/config/celery_app.py @@ -17,9 +17,9 @@ app.config_from_object("django.conf:settings", namespace="CELERY") @setup_logging.connect def config_loggers(*args, **kwargs): - from logging.config import dictConfig + from logging.config import dictConfig # noqa: PLC0415 - from django.conf import settings + from django.conf import settings # noqa: PLC0415 dictConfig(settings.LOGGING) diff --git a/{{cookiecutter.project_slug}}/config/settings/local.py b/{{cookiecutter.project_slug}}/config/settings/local.py index f63151239..c42ce59cc 100644 --- a/{{cookiecutter.project_slug}}/config/settings/local.py +++ b/{{cookiecutter.project_slug}}/config/settings/local.py @@ -1,4 +1,3 @@ -# ruff: noqa: E501 from .base import * # noqa: F403 from .base import INSTALLED_APPS from .base import MIDDLEWARE @@ -79,7 +78,7 @@ if env("USE_DOCKER") == "yes": import socket hostname, _, ips = socket.gethostbyname_ex(socket.gethostname()) - INTERNAL_IPS += [".".join(ip.split(".")[:-1] + ["1"]) for ip in ips] + INTERNAL_IPS += [".".join([*ip.split(".")[:-1], "1"]) for ip in ips] {%- if cookiecutter.frontend_pipeline in ['Gulp', 'Webpack'] %} try: _, _, ips = socket.gethostbyname_ex("node") diff --git a/{{cookiecutter.project_slug}}/docs/howto.rst b/{{cookiecutter.project_slug}}/docs/howto.rst index 2ad20966b..561d93ff3 100644 --- a/{{cookiecutter.project_slug}}/docs/howto.rst +++ b/{{cookiecutter.project_slug}}/docs/howto.rst @@ -15,7 +15,7 @@ from inside the `{{cookiecutter.project_slug}}/docs` directory. {% else %} To build and serve docs, use the commands:: - docker compose -f docker-compose.local.yml up docs + docker compose -f docker-compose.docs.yml up {% endif %} diff --git a/{{cookiecutter.project_slug}}/gulpfile.mjs b/{{cookiecutter.project_slug}}/gulpfile.mjs index 70d4e5e2f..41f02b78e 100644 --- a/{{cookiecutter.project_slug}}/gulpfile.mjs +++ b/{{cookiecutter.project_slug}}/gulpfile.mjs @@ -101,7 +101,7 @@ function vendorScripts() { // Image compression async function imgCompression() { const imagemin = (await import("gulp-imagemin")).default; - return src(`${paths.images}/*`) + return src(`${paths.images}/*`, { encoding: false }) .pipe(imagemin()) // Compresses PNG, JPEG, GIF and SVG images .pipe(dest(paths.images)); } diff --git a/{{cookiecutter.project_slug}}/manage.py b/{{cookiecutter.project_slug}}/manage.py index d6c4f110f..0332cc26e 100755 --- a/{{cookiecutter.project_slug}}/manage.py +++ b/{{cookiecutter.project_slug}}/manage.py @@ -10,7 +10,7 @@ def main(): os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local") try: - from django.core.management import execute_from_command_line + from django.core.management import execute_from_command_line # noqa: PLC0415 except ImportError as exc: raise ImportError( # noqa: TRY003 "Couldn't import Django. Are you sure it's installed and " # noqa: EM101 diff --git a/{{cookiecutter.project_slug}}/package.json b/{{cookiecutter.project_slug}}/package.json index d0458179b..8f0c611e0 100644 --- a/{{cookiecutter.project_slug}}/package.json +++ b/{{cookiecutter.project_slug}}/package.json @@ -35,7 +35,7 @@ "webpack-merge": "^6.0.1" }, "engines": { - "node": "22.14" + "node": "24.6" }, "browserslist": [ "last 2 versions" diff --git a/{{cookiecutter.project_slug}}/requirements/base.txt b/{{cookiecutter.project_slug}}/requirements/base.txt index 1f81abca7..25b4b24f2 100644 --- a/{{cookiecutter.project_slug}}/requirements/base.txt +++ b/{{cookiecutter.project_slug}}/requirements/base.txt @@ -1,5 +1,5 @@ python-slugify==8.0.4 # https://github.com/un33k/python-slugify -Pillow==11.2.1 # pyup: != 11.2.0 # https://github.com/python-pillow/Pillow +Pillow==11.3.0 # pyup: != 11.2.0 # https://github.com/python-pillow/Pillow {%- if cookiecutter.frontend_pipeline == 'Django Compressor' %} {%- if cookiecutter.windows == 'y' and cookiecutter.use_docker == 'n' %} rcssmin==1.1.2 --install-option="--without-c-extensions" # https://github.com/ndparker/rcssmin @@ -7,45 +7,45 @@ rcssmin==1.1.2 --install-option="--without-c-extensions" # https://github.com/n rcssmin==1.1.2 # https://github.com/ndparker/rcssmin {%- endif %} {%- endif %} -argon2-cffi==23.1.0 # https://github.com/hynek/argon2_cffi +argon2-cffi==25.1.0 # https://github.com/hynek/argon2_cffi {%- if cookiecutter.use_whitenoise == 'y' %} whitenoise==6.9.0 # https://github.com/evansd/whitenoise {%- endif %} -redis==6.2.0 # https://github.com/redis/redis-py +redis==6.4.0 # https://github.com/redis/redis-py {%- if cookiecutter.use_docker == "y" or cookiecutter.windows == "n" %} hiredis==3.2.1 # https://github.com/redis/hiredis-py {%- endif %} {%- if cookiecutter.use_celery == "y" %} -celery==5.5.2 # pyup: < 6.0 # https://github.com/celery/celery +celery==5.5.3 # pyup: < 6.0 # https://github.com/celery/celery django-celery-beat==2.8.1 # https://github.com/celery/django-celery-beat {%- if cookiecutter.use_docker == 'y' %} flower==2.0.1 # https://github.com/mher/flower {%- endif %} {%- endif %} {%- if cookiecutter.use_async == 'y' %} -uvicorn[standard]==0.34.2 # https://github.com/encode/uvicorn +uvicorn[standard]==0.35.0 # https://github.com/encode/uvicorn uvicorn-worker==0.3.0 # https://github.com/Kludex/uvicorn-worker {%- endif %} # Django # ------------------------------------------------------------------------------ -django==5.1.9 # pyup: < 5.2 # https://www.djangoproject.com/ +django==5.1.11 # pyup: < 5.2 # 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.8.1 # https://github.com/pennersr/django-allauth +django-allauth[mfa]==65.11.1 # https://github.com/pennersr/django-allauth django-crispy-forms==2.4 # https://github.com/django-crispy-forms/django-crispy-forms -crispy-bootstrap5==2025.4 # https://github.com/django-crispy-forms/crispy-bootstrap5 +crispy-bootstrap5==2025.6 # https://github.com/django-crispy-forms/crispy-bootstrap5 {%- if cookiecutter.frontend_pipeline == 'Django Compressor' %} django-compressor==4.5.1 # https://github.com/django-compressor/django-compressor {%- endif %} -django-redis==5.4.0 # https://github.com/jazzband/django-redis +django-redis==6.0.0 # https://github.com/jazzband/django-redis {%- if cookiecutter.use_drf == 'y' %} # Django REST Framework -djangorestframework==3.16.0 # https://github.com/encode/django-rest-framework +djangorestframework==3.16.1 # https://github.com/encode/django-rest-framework django-cors-headers==4.7.0 # https://github.com/adamchainz/django-cors-headers # DRF-spectacular for api documentation drf-spectacular==0.28.0 # https://github.com/tfranzel/drf-spectacular {%- endif %} {%- if cookiecutter.frontend_pipeline == 'Webpack' %} -django-webpack-loader==3.2.0 # https://github.com/django-webpack/django-webpack-loader +django-webpack-loader==3.2.1 # https://github.com/django-webpack/django-webpack-loader {%- endif %} diff --git a/{{cookiecutter.project_slug}}/requirements/local.txt b/{{cookiecutter.project_slug}}/requirements/local.txt index 37f82144d..a32d0bfbd 100644 --- a/{{cookiecutter.project_slug}}/requirements/local.txt +++ b/{{cookiecutter.project_slug}}/requirements/local.txt @@ -6,15 +6,15 @@ psycopg[c]==3.2.9 # https://github.com/psycopg/psycopg psycopg[binary]==3.2.9 # https://github.com/psycopg/psycopg {%- endif %} {%- if cookiecutter.use_async == 'y' or cookiecutter.use_celery == 'y' %} -watchfiles==1.0.5 # https://github.com/samuelcolvin/watchfiles +watchfiles==1.1.0 # https://github.com/samuelcolvin/watchfiles {%- endif %} # Testing # ------------------------------------------------------------------------------ -mypy==1.15.0 # https://github.com/python/mypy -django-stubs[compatible-mypy]==5.2.0 # https://github.com/typeddjango/django-stubs -pytest==8.3.5 # https://github.com/pytest-dev/pytest -pytest-sugar==1.0.0 # https://github.com/Teemu/pytest-sugar +mypy==1.17.1 # https://github.com/python/mypy +django-stubs[compatible-mypy]==5.2.2 # https://github.com/typeddjango/django-stubs +pytest==8.4.1 # https://github.com/pytest-dev/pytest +pytest-sugar==1.1.1 # https://github.com/Teemu/pytest-sugar {%- if cookiecutter.use_drf == "y" %} djangorestframework-stubs==3.16.0 # https://github.com/typeddjango/djangorestframework-stubs {%- endif %} @@ -22,20 +22,20 @@ djangorestframework-stubs==3.16.0 # https://github.com/typeddjango/djangorestfr # Documentation # ------------------------------------------------------------------------------ sphinx==8.2.3 # pyup: != 8.3.0 # https://github.com/sphinx-doc/sphinx -sphinx-autobuild==2024.10.3 # https://github.com/GaretJax/sphinx-autobuild +sphinx-autobuild==2025.8.25 # https://github.com/GaretJax/sphinx-autobuild # Code quality # ------------------------------------------------------------------------------ -ruff==0.11.11 # https://github.com/astral-sh/ruff -coverage==7.8.2 # https://github.com/nedbat/coveragepy +ruff==0.12.10 # https://github.com/astral-sh/ruff +coverage==7.10.5 # https://github.com/nedbat/coveragepy djlint==1.36.4 # https://github.com/Riverside-Healthcare/djLint -pre-commit==4.2.0 # https://github.com/pre-commit/pre-commit +pre-commit==4.3.0 # https://github.com/pre-commit/pre-commit # Django # ------------------------------------------------------------------------------ factory-boy==3.3.2 # https://github.com/FactoryBoy/factory_boy -django-debug-toolbar==5.2.0 # https://github.com/jazzband/django-debug-toolbar +django-debug-toolbar==6.0.0 # https://github.com/jazzband/django-debug-toolbar django-extensions==4.1 # https://github.com/django-extensions/django-extensions -django-coverage-plugin==3.1.0 # https://github.com/nedbat/django_coverage_plugin +django-coverage-plugin==3.1.1 # https://github.com/nedbat/django_coverage_plugin pytest-django==4.11.1 # https://github.com/pytest-dev/pytest-django diff --git a/{{cookiecutter.project_slug}}/requirements/production.txt b/{{cookiecutter.project_slug}}/requirements/production.txt index 24e376d33..78a5d17fd 100644 --- a/{{cookiecutter.project_slug}}/requirements/production.txt +++ b/{{cookiecutter.project_slug}}/requirements/production.txt @@ -5,10 +5,10 @@ gunicorn==23.0.0 # https://github.com/benoitc/gunicorn psycopg[c]==3.2.9 # 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 +Collectfasta==3.3.1 # https://github.com/jasongi/collectfasta {%- endif %} {%- if cookiecutter.use_sentry == "y" %} -sentry-sdk==2.29.1 # https://github.com/getsentry/sentry-python +sentry-sdk==2.35.1 # https://github.com/getsentry/sentry-python {%- endif %} {%- if cookiecutter.use_docker == "n" and cookiecutter.windows == "y" %} hiredis==3.2.1 # https://github.com/redis/hiredis-py @@ -24,21 +24,21 @@ django-storages[google]==1.14.6 # https://github.com/jschneier/django-storages django-storages[azure]==1.14.6 # https://github.com/jschneier/django-storages {%- endif %} {%- if cookiecutter.mail_service == 'Mailgun' %} -django-anymail[mailgun]==13.0 # https://github.com/anymail/django-anymail +django-anymail[mailgun]==13.0.1 # https://github.com/anymail/django-anymail {%- elif cookiecutter.mail_service == 'Amazon SES' %} -django-anymail[amazon-ses]==13.0 # https://github.com/anymail/django-anymail +django-anymail[amazon-ses]==13.0.1 # https://github.com/anymail/django-anymail {%- elif cookiecutter.mail_service == 'Mailjet' %} -django-anymail[mailjet]==13.0 # https://github.com/anymail/django-anymail +django-anymail[mailjet]==13.0.1 # https://github.com/anymail/django-anymail {%- elif cookiecutter.mail_service == 'Mandrill' %} -django-anymail[mandrill]==13.0 # https://github.com/anymail/django-anymail +django-anymail[mandrill]==13.0.1 # https://github.com/anymail/django-anymail {%- elif cookiecutter.mail_service == 'Postmark' %} -django-anymail[postmark]==13.0 # https://github.com/anymail/django-anymail +django-anymail[postmark]==13.0.1 # https://github.com/anymail/django-anymail {%- elif cookiecutter.mail_service == 'Sendgrid' %} -django-anymail[sendgrid]==13.0 # https://github.com/anymail/django-anymail +django-anymail[sendgrid]==13.0.1 # https://github.com/anymail/django-anymail {%- elif cookiecutter.mail_service == 'Brevo' %} -django-anymail[brevo]==13.0 # https://github.com/anymail/django-anymail +django-anymail[brevo]==13.0.1 # https://github.com/anymail/django-anymail {%- elif cookiecutter.mail_service == 'SparkPost' %} -django-anymail[sparkpost]==13.0 # https://github.com/anymail/django-anymail +django-anymail[sparkpost]==13.0.1 # https://github.com/anymail/django-anymail {%- elif cookiecutter.mail_service == 'Other SMTP' %} -django-anymail==13.0 # https://github.com/anymail/django-anymail +django-anymail==13.0.1 # https://github.com/anymail/django-anymail {%- endif %} diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/apps.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/apps.py index 5c3d4fe08..6f50d5d2c 100644 --- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/apps.py +++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/apps.py @@ -10,4 +10,4 @@ class UsersConfig(AppConfig): def ready(self): with contextlib.suppress(ImportError): - import {{ cookiecutter.project_slug }}.users.signals # noqa: F401 + import {{ cookiecutter.project_slug }}.users.signals # noqa: F401, PLC0415 diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py index 3e6a41a94..485e1a838 100644 --- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py +++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py @@ -60,7 +60,7 @@ class TestUserAdmin: def _force_allauth(self, settings): settings.DJANGO_ADMIN_FORCE_ALLAUTH = True # Reload the admin module to apply the setting change - import {{ cookiecutter.project_slug }}.users.admin as users_admin + import {{ cookiecutter.project_slug }}.users.admin as users_admin # noqa: PLC0415 with contextlib.suppress(admin.sites.AlreadyRegistered): # type: ignore[attr-defined] reload(users_admin)