Compare commits

..

373 Commits

Author SHA1 Message Date
github-actions
71f6c8ac09 Release 2025.04.05 2025-04-06 02:33:35 +00:00
browniebroke
22fb3141a1 Update Contributors 2025-04-05 10:42:33 +00:00
Aidos Kanapyanov
458a21ee5c
Add Docker build caching on GitHub Actions (#5700) 2025-04-05 11:42:17 +01:00
pyup.io bot
06c0cd2bf8
Update ruff to 0.11.4 (#5767) 2025-04-05 11:03:17 +01:00
browniebroke
10d80a2ff9 Update Contributors 2025-04-05 09:58:43 +00:00
Pepa
6455b39c07
Pin Pillow and Sphinx to non yanked release (#5765) 2025-04-05 10:58:27 +01:00
Bruno Alla
bf9ac68fed
Skip align-versions workflow (#5766)
* Skip align-versions workflow on forks

* Update repo link in local.txt

* Update condition to restrict on GitHub actor
2025-04-04 14:03:23 +01:00
github-actions
bb2d056a15 Release 2025.04.03 2025-04-04 02:31:57 +00:00
pyup.io bot
7ba49c9dc5
Update django-anymail to 13.0 (#5763) 2025-04-03 23:23:35 +01:00
pyup.io bot
b4590cf8d9
Update pytest-django from 4.11.0 to 4.11.1 (#5762) 2025-04-03 21:42:46 +01:00
pyup.io bot
8f1b488069
Update ruff to 0.11.3 (#5761) 2025-04-03 16:12:24 +01:00
pyup.io bot
9085f602fa
Update django-allauth from 65.6.0 to 65.7.0 (#5760) 2025-04-03 14:18:33 +01:00
github-actions
1e19553ded Release 2025.04.02 2025-04-03 02:32:18 +00:00
pyup.io bot
285e86bf71
Update crispy-bootstrap5 from 2024.10 to 2025.4 (#5756) 2025-04-02 19:49:33 +01:00
Pulse-Mind
7d8dabb813
Update Django from 5.0 to 5.1 (#5740) 2025-04-02 19:47:59 +01:00
pyup.io bot
b4f95514aa
Update sentry-sdk from 2.25.0 to 2.25.1 (#5757) 2025-04-02 18:06:12 +01:00
browniebroke
97c363bf9e Update Contributors 2025-04-02 13:43:00 +00:00
Igor Jerosimić
6ea1f3c718
Fix line endings for dotenv merge script on Windows (#5754) 2025-04-02 14:42:43 +01:00
pyup.io bot
a802ac491c
Update django-storages to 1.14.6 (#5753) 2025-04-02 08:45:13 +01:00
pyup.io bot
f1760fb835
Update pytest-django from 4.10.0 to 4.11.0 (#5752) 2025-04-02 08:44:28 +01:00
github-actions
5c5ec3a2ba Release 2025.04.01 2025-04-02 02:32:29 +00:00
pyup.io bot
dd24cdb036
Update pillow from 11.1.0 to 11.2.0 (#5751) 2025-04-01 16:13:09 +01:00
dependabot[bot]
0c1a349bfa
Bump traefik from 3.3.4 to 3.3.5 (#5750) 2025-04-01 10:38:01 +01:00
pyup.io bot
54c70edf39
Update celery from 5.4.0 to 5.5.0 (#5748) 2025-04-01 08:23:00 +01:00
github-actions
c550acd874 Release 2025.03.31 2025-04-01 02:35:59 +00:00
pyup.io bot
3e95ca6d8f
Update django-allauth from 65.5.0 to 65.6.0 (#5741) 2025-03-31 15:32:12 +01:00
pyup.io bot
9910a2bb91
Update sentry-sdk from 2.24.1 to 2.25.0 (#5747) 2025-03-31 15:31:44 +01:00
pyup.io bot
179e4846a5
Update coverage from 7.7.1 to 7.8.0 (#5745) 2025-03-31 15:31:31 +01:00
github-actions[bot]
23747ef0f4
Auto-update flake8 pre-commit hook (#5744) 2025-03-31 15:31:14 +01:00
github-actions
2504a349af Release 2025.03.28 2025-03-29 02:30:51 +00:00
pyup.io bot
31f7901060
Update djangorestframework from 3.15.2 to 3.16.0 (#5743) 2025-03-28 17:49:10 +00:00
github-actions[bot]
28aa085015
Update django-upgrade pre-commit hook to v1.24.0 (#5742) 2025-03-28 10:41:11 +00:00
github-actions
8459a36369 Release 2025.03.24 2025-03-25 02:31:51 +00:00
pyup.io bot
7fbcc652f1
Update django-allauth to 65.5.0 (#5723) 2025-03-24 23:00:28 +00:00
pyup.io bot
c04a8e39f9
Update sentry-sdk from 2.24.0 to 2.24.1 (#5739) 2025-03-24 13:01:17 +00:00
github-actions
9c68c8f3db Release 2025.03.22 2025-03-23 02:33:26 +00:00
pyup.io bot
e1a7d93d09
Update coverage from 7.7.0 to 7.7.1 (#5736) 2025-03-22 12:53:46 +00:00
github-actions
6d5fdb7e04 Release 2025.03.21 2025-03-22 02:29:44 +00:00
pyup.io bot
0822b46c2f
Update sentry-sdk from 2.23.1 to 2.24.0 (#5734) 2025-03-21 14:10:42 +00:00
pyup.io bot
1e22b0b987
Update django-debug-toolbar from 5.0.1 to 5.1.0 (#5732) 2025-03-21 14:10:31 +00:00
pyup.io bot
29c70dfd0d
Update ruff to 0.11.2 (#5735) 2025-03-21 14:10:00 +00:00
dependabot[bot]
1696a9d277
Bump amazon/aws-cli (#5733) 2025-03-21 11:04:02 +00:00
github-actions[bot]
100271e7e1
Auto-update pre-commit hooks (#5657) 2025-03-21 11:03:41 +00:00
pyup.io bot
b37fa9c79f
Update ruff to 0.11.1 (#5731) 2025-03-21 10:58:14 +00:00
github-actions
3f3bc529ae Release 2025.03.19 2025-03-20 02:30:33 +00:00
pyup.io bot
e5c315bbc7
Update pre-commit from 4.1.0 to 4.2.0 (#5730) 2025-03-19 08:42:49 +00:00
github-actions
05ce556006 Release 2025.03.17 2025-03-18 02:31:28 +00:00
pyup.io bot
e6fac6075d
Update sentry-sdk from 2.22.0 to 2.23.1 (#5727) 2025-03-17 14:34:51 +00:00
pyup.io bot
ffb6f616a7
Update coverage from 7.6.12 to 7.7.0 (#5725) 2025-03-17 10:11:32 +00:00
github-actions
aa5308e82a Release 2025.03.15 2025-03-16 02:32:10 +00:00
pyup-bot
0849bb518d Update psycopg from 3.2.5 to 3.2.6 2025-03-15 08:43:43 -03:00
pyup-bot
3ea0666650 Update psycopg from 3.2.5 to 3.2.6 2025-03-15 08:43:43 -03:00
pyup-bot
9691dc10c8 Update psycopg from 3.2.5 to 3.2.6 2025-03-15 08:43:43 -03:00
pyup.io bot
51d1c5bb5f
Update ruff to 0.11.0 (#5724) 2025-03-15 10:23:52 +00:00
github-actions
fb5fcdbcaf Release 2025.03.08 2025-03-09 02:17:53 +00:00
pyup.io bot
4443eb41c2
Update ruff to 0.9.10 (#5720) 2025-03-08 10:17:26 +00:00
github-actions
c85e2f57f5 Release 2025.03.06 2025-03-07 02:30:27 +00:00
pyup.io bot
50ddc282d7
Update django from 5.0.12 to 5.0.13 (#5719) 2025-03-06 18:34:55 +00:00
github-actions
dfc2fb134b Release 2025.03.04 2025-03-05 02:29:49 +00:00
Bruno Alla
e4ee6565ef
Enable uv updates for Dependabot (#5716) 2025-03-04 13:33:42 +00:00
pyup.io bot
16488dd0cf
Update sphinx to 8.3.0 (#5714) 2025-03-04 12:35:15 +00:00
pyup.io bot
d506d38f2e
Update pytest to 8.3.5 (#5713) 2025-03-04 12:34:21 +00:00
Matthew Foster Walsh
b3389579c1
Add groups for dependabot updates (#5709)
* Add groups for docker prs

* development update group doesn't work

* Remove docker group and exclude major package updates
2025-03-04 12:33:30 +00:00
github-actions
7c9f6a75af Release 2025.03.01 2025-03-02 02:30:47 +00:00
pyup.io bot
0b90ecf4bf
Update ruff to 0.9.9 (#5711) 2025-03-01 09:20:09 +00:00
github-actions
79f572c010 Release 2025.02.28 2025-03-01 02:31:13 +00:00
Bruno Alla
2d5d84f61a Minor styling tweaks 2025-02-28 10:41:42 +00:00
pyup.io bot
4c8ab6b4ba
Update ruff to 0.9.8 (#5708) 2025-02-28 10:36:26 +00:00
dependabot[bot]
ee40ae6119
Bump babel-loader from 9.2.1 to 10.0.0 (#5710) 2025-02-28 10:35:38 +00:00
github-actions
8bc53f538c Release 2025.02.26 2025-02-27 02:29:19 +00:00
dependabot[bot]
6e9d2de035
Bump traefik from 3.3.3 to 3.3.4 (#5705) 2025-02-26 09:40:10 +00:00
github-actions
e6f16d424f Release 2025.02.25 2025-02-26 02:28:48 +00:00
browniebroke
e7cad8f1c6 Update Contributors 2025-02-25 13:56:16 +00:00
Kawsar Alam Foysal
e8d328b283
Fix links to FAQ about contrib.sites directory (#5704) 2025-02-25 13:55:52 +00:00
github-actions
fedf1f34d6 Release 2025.02.23 2025-02-24 02:30:01 +00:00
pyup.io bot
90d55a3a48
Update sphinx to 8.2.1 (#5696) 2025-02-23 20:08:00 +00:00
pyup.io bot
c898ed0dc8
Update psycopg to 3.2.5 (#5697) 2025-02-23 20:07:48 +00:00
Matthew Foster Walsh
fcef872763
Group dependabot docker directories (#5698) 2025-02-23 20:07:15 +00:00
github-actions
697e8e40ce Release 2025.02.21 2025-02-22 02:25:06 +00:00
pyup.io bot
70f5a984b4
Update djangorestframework-stubs to 3.15.3 (#5695) 2025-02-21 17:09:51 +00:00
pyup.io bot
ccbb1d3afc
Update sphinx to 8.2.0 (#5693) 2025-02-21 17:09:32 +00:00
pyup.io bot
7e736503ee
Update ruff to 0.9.7 (#5694)
Co-authored-by: pyup-bot <16239342+pyup-bot@users.noreply.github.com>
2025-02-21 17:09:09 +00:00
Bruno Alla
cc0bd38eff Port some changes from Ruff 2025-02-18 22:40:22 +00:00
Bruno Alla
425520956d Use 2 spaces indentation in toml files 2025-02-18 22:38:20 +00:00
Bruno Alla
ec4e519795 Fix indentation in generated pyproject.toml 2025-02-18 22:37:16 +00:00
Bruno Alla
907ee6a607 Fix issues from Ruff in docs config 2025-02-18 22:36:17 +00:00
Bruno Alla
f30c3c036c Fix issues from Ruff in scripts 2025-02-18 22:35:10 +00:00
github-actions
1a81521ae8 Release 2025.02.17 2025-02-18 02:26:25 +00:00
pyup.io bot
0299f98693
Update sentry-sdk from 2.21.0 to 2.22.0 (#5692) 2025-02-17 19:28:34 +00:00
pyup.io bot
c448ff5ae6
Update django-storages to 1.14.5 (#5690) 2025-02-17 08:45:59 +00:00
github-actions
65b16c82c0 Release 2025.02.14 2025-02-15 02:25:44 +00:00
dependabot[bot]
08d1a3ba61
Bump node from 22.13 to 22.14 (#5688) 2025-02-14 07:58:21 +00:00
Bruno Alla
d8f3ad04f4 Allow to run workflow manually 2025-02-14 07:18:14 +00:00
github-actions
39f882ffb0 Release 2025.02.13 2025-02-14 02:26:43 +00:00
pyup.io bot
9653f1df97
Update sentry-sdk to 2.21.0 (#5687) 2025-02-13 10:50:07 +00:00
github-actions
4978690ae1 Release 2025.02.11 2025-02-12 02:26:33 +00:00
pyup.io bot
0e35c6f3b1
Update coverage to 7.6.12 (#5686) 2025-02-11 18:04:54 +00:00
github-actions
1ec8ef58dd Release 2025.02.10 2025-02-11 02:27:17 +00:00
pyup.io bot
a76b8fe8c8
Update pytest-django to 4.10.0 (#5684) 2025-02-10 16:53:01 +00:00
pyup.io bot
eb2daaa132
Update ruff to 0.9.6 (#5683)
Co-authored-by: pyup-bot <16239342+pyup-bot@users.noreply.github.com>
2025-02-10 15:28:24 +00:00
dependabot[bot]
ecbcd763a8
Bump amazon/aws-cli from 2.23.0 to 2.24.0 (#5682) 2025-02-10 08:59:04 +00:00
github-actions
7977437563 Release 2025.02.08 2025-02-09 02:28:01 +00:00
pyup.io bot
9544a2243b
Update coverage from 7.6.10 to 7.6.11 (#5681) 2025-02-08 22:03:33 +00:00
github-actions
431a4bd10c Release 2025.02.07 2025-02-08 02:23:22 +00:00
Bruno Alla
a06ed7ae76 Replace local pre-commit hook by GH action 2025-02-07 23:19:12 +00:00
pyup.io bot
13acd682cc
Update mypy to 1.15.0 (#5664)
Co-authored-by: Bruno Alla <browniebroke@users.noreply.github.com>
2025-02-07 23:17:51 +00:00
pyup.io bot
67b3a7b9f3
Update django-stubs to 5.1.3 (#5680) 2025-02-07 23:10:08 +00:00
dependabot[bot]
1962169f57
Bump python from 3.12.8 to 3.12.9 in local Docker image (#5678)
Bumps python from 3.12.8-slim-bookworm to 3.12.9-slim-bookworm.

---
updated-dependencies:
- dependency-name: python
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-07 23:09:13 +00:00
dependabot[bot]
bcf96d432f
Bump python from 3.12.8 to 3.12.9 in production Docker image (#5677)
Bumps python from 3.12.8-slim-bookworm to 3.12.9-slim-bookworm.

---
updated-dependencies:
- dependency-name: python
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-07 23:08:38 +00:00
dependabot[bot]
d04d3802f3
Bump python from 3.12.8 to 3.12.9 in docs Docker image (#5676)
Bumps python from 3.12.8-slim-bookworm to 3.12.9-slim-bookworm.

---
updated-dependencies:
- dependency-name: python
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-07 23:07:51 +00:00
pyup.io bot
978455aa94
Update django-allauth to 65.4.1 (#5679)
Co-authored-by: Bruno Alla <alla.brunoo@gmail.com>
2025-02-07 11:08:49 +00:00
Bruno Alla
08cf6f72e5 Update node version in production docker file 2025-02-07 10:12:43 +00:00
pyup.io bot
f79dbf9e17
Update django-cors-headers to 4.7.0 (#5675) 2025-02-07 10:03:58 +00:00
pyup.io bot
36b7e7754d
Update whitenoise to 6.9.0 (#5674) 2025-02-07 10:03:48 +00:00
github-actions
c37b46e5cf Release 2025.02.06 2025-02-07 02:27:02 +00:00
pyup.io bot
17e5ad3f17
Update ruff to 0.9.5 (#5673)
* Update ruff from 0.9.4 to 0.9.5

* Align Ruff versions

---------

Co-authored-by: pyup-bot <16239342+pyup-bot@users.noreply.github.com>
2025-02-06 22:55:52 +00:00
browniebroke
bde74225a3 Update Contributors 2025-02-06 22:23:31 +00:00
Alan Cyment
8a019b40cf
Bumped node version of Django Dockerfile to 22.13 (#5672) 2025-02-06 22:23:12 +00:00
github-actions
6b8545a95d Release 2025.02.05 2025-02-06 02:26:42 +00:00
pyup-bot
0be2d9c919 Update django from 5.0.11 to 5.0.12 2025-02-05 14:14:38 -03:00
Hana Belay
7c6dff3b70
Add missing trailing slash in test MEDIA_URL (#5666) 2025-02-05 10:57:30 +00:00
github-actions
e0da2963c3 Release 2025.02.03 2025-02-04 02:25:06 +00:00
dependabot[bot]
bcd27ef206
Bumps traefik from 3.3.2 to 3.3.3 (#5660) 2025-02-03 11:13:09 +00:00
pyup.io bot
7371becfcf
Update factory-boy to 3.3.2 (#5661) 2025-02-03 11:11:47 +00:00
github-actions
633762d9d5 Release 2025.01.30 2025-01-31 02:24:55 +00:00
pyup.io bot
0299266df9
Update ruff to 0.9.4 (#5659) 2025-01-30 20:54:37 +00:00
github-actions
bf2a3c5d84 Release 2025.01.26 2025-01-27 02:26:26 +00:00
Ed Morley
f95ef4f8dc
Update Heroku deployment guide (#5656)
* Remove setting of `PYTHONHASHSEED` env var, since it's defaulted to `random` since Python 3.3. See: 
  https://docs.python.org/3.13/whatsnew/3.3.html#builtin-functions-and-types
* Remove setting of `WEB_CONCURRENCY` env var to a hardcoded value, since on Heroku the Python buildpack dynamically sets the value at container boot based on the available CPUs, so it's best to not override the default with a value that might not match the size of the dyno. See: 
  https://devcenter.heroku.com/articles/python-concurrency#default-settings-and-behavior
2025-01-26 13:38:08 +00:00
browniebroke
b5b24db9d2 Update Contributors 2025-01-26 13:35:23 +00:00
Ed Morley
827d35708b
Migrate generated project from runtime.txt to .python-version (#5652)
Heroku now supports the `.python-version` file as an alternative to the
Heroku-specific (and now deprecated) `runtime.txt` file, and recommends
apps switch to using the former since it's more widely supported by other
tooling.

The `.python-version` file is supported by pyenv, uv, the GitHub Actions
`setup-python` action and many others.

In addition, the `.python-version` file supports the version being specified
as just the major version (eg `3.12` vs `3.12.N`) which means will pick up
Python patch updates automatically (which is the recommended usage on
Heroku).

See:
https://devcenter.heroku.com/changelog-items/3005
https://github.com/heroku/heroku-buildpack-python/issues/1642
https://github.com/actions/setup-python/blob/main/docs/advanced-usage.md#using-the-python-version-file-input
2025-01-26 13:35:04 +00:00
github-actions
70bd35d398 Release 2025.01.24 2025-01-25 02:21:10 +00:00
pyup.io bot
d7c995b873
Update ruff to 0.9.3 (#5654)
* Update ruff from 0.9.2 to 0.9.3

* Align Ruff versions

* Align Ruff versions

---------

Co-authored-by: pyup-bot <16239342+pyup-bot@users.noreply.github.com>
Co-authored-by: browniebroke <861044+browniebroke@users.noreply.github.com>
2025-01-24 07:50:53 +00:00
github-actions
bb6e4085c7 Release 2025.01.21 2025-01-22 02:26:55 +00:00
ghazi-git
723a388f3d
Update the linter error code from TCH to TC (#5651) 2025-01-21 19:50:33 +00:00
pyup.io bot
3e1e6cb41b
Update pre-commit to 4.1.0 (#5650)
* Update pre-commit from 4.0.1 to 4.1.0

* Update pre-commit version in template

---------

Co-authored-by: Bruno Alla <alla.brunoo@gmail.com>
2025-01-21 10:08:29 +00:00
github-actions
a691219456 Release 2025.01.20 2025-01-21 02:24:53 +00:00
Bruno Alla
a1105d9010
Migrate post-generation hook to pathlib (#5648)
* Migrate post-generation hook to pathlib

* Fix typo in folder name
2025-01-20 19:06:28 +00:00
Bruno Alla
7f4211ab16
Migrate test generation to pathlib (#5649) 2025-01-20 13:28:59 +00:00
Jelmer
1cad7df6cc
Merge pull request #5615 from browniebroke/refactor/move-api-tests
Group all API tests under a `tests.api` namespace
2025-01-20 14:00:31 +01:00
github-actions
2193a661c5 Release 2025.01.16 2025-01-17 02:23:58 +00:00
pyup.io bot
e69d77a0b9
Update ruff to 0.9.2 (#5646) 2025-01-16 13:59:24 +00:00
dependabot[bot]
54e0ccec0c
Bump amazon/aws-cli from 2.22.1 to 2.23.0 (#5645) 2025-01-16 07:32:55 +00:00
github-actions
185f18dfc0 Release 2025.01.15 2025-01-16 02:24:24 +00:00
pyup.io bot
ab475a5570
Update psycopg to 3.2.4 (#5644) 2025-01-15 23:13:38 +00:00
ghazi-git
564ca18e56
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
2025-01-15 19:34:23 +00:00
pyup.io bot
fbf6c886cb
Update django-stubs to 5.1.2 (#5639) 2025-01-15 10:02:53 +00:00
dependabot[bot]
2dc567d131
Bump traefik from 3.3.1 to 3.3.2 (#5642) 2025-01-15 10:00:20 +00:00
github-actions
7a85931fb0 Release 2025.01.14 2025-01-15 02:25:13 +00:00
pyup.io bot
c89a45c45f
Update django from 5.0.10 to 5.0.11 (#5640) 2025-01-14 17:54:03 +00:00
pyup.io bot
1ba44e9e03
Update sentry-sdk to 2.20.0 (#5638) 2025-01-14 12:05:21 +00:00
pyup.io bot
42febc9e84
Update django-debug-toolbar from 4.4.6 to 5.0.1 (#5636) 2025-01-14 07:32:51 +00:00
github-actions
843f268c4d Release 2025.01.13 2025-01-14 02:23:40 +00:00
pyup.io bot
a8847158c9
Update django-environ from 0.11.2 to 0.12.0 (#5635) 2025-01-13 18:06:11 +00:00
dependabot[bot]
d78dff4969
Bumps traefik from 3.3.0 to 3.3.1 (#5634) 2025-01-13 09:41:21 +00:00
github-actions
cb4a277136 Release 2025.01.11 2025-01-12 02:31:00 +00:00
pyup.io bot
35dacd8718
Update ruff to 0.9.1 (#5633) 2025-01-11 12:08:23 +00:00
browniebroke
01650ddc1b Align Ruff versions 2025-01-11 12:00:31 +00:00
Bruno Alla
e7edde03ba Add workflow to keep Ruff version up to date 2025-01-11 12:00:31 +00:00
Bruno Alla
33aa0c0639 Add script to automatically keep ruff versions up-to-date 2025-01-11 12:00:31 +00:00
Bruno Alla
6047eeff3d Keep full version in pyproject-fmt 2025-01-11 12:00:31 +00:00
pyup-bot
8fd6404901 Update ruff from 0.8.6 to 0.9.0 2025-01-11 12:00:31 +00:00
github-actions
5eba578860 Release 2025.01.10 2025-01-11 02:27:14 +00:00
pyup.io bot
0d6de8f23b
Update watchfiles to 1.0.4 (#5631) 2025-01-10 14:17:10 +00:00
github-actions
9cd3d10776 Release 2025.01.09 2025-01-10 02:29:16 +00:00
Bruno Alla
1dbaeaa09d
Merge pull request #5627 from cookiecutter/dependabot/docker/{{cookiecutter.project_slug}}/compose/local/node/node-22.13-bookworm-slim
Bump node from 22.12 to 22.13
2025-01-09 22:29:48 +00:00
pre-commit-ci[bot]
2d54690d34 [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2025-01-09 21:24:10 +00:00
Bruno Alla
d39bb8ae16 Add pre-commit hook to keep node version up to date 2025-01-09 21:22:21 +00:00
Bruno Alla
bb7bffec63 Add script to automatically keep node version up-to-date 2025-01-09 21:21:42 +00:00
Bruno Alla
c5b60d27cf
Merge pull request #5614 from browniebroke/drop-python-2-hooks
Drop support for Python 2 in template generation hooks
2025-01-09 20:52:46 +00:00
dependabot[bot]
cee86b68b1
Bump node in /{{cookiecutter.project_slug}}/compose/local/node
Bumps node from 22.12-bookworm-slim to 22.13-bookworm-slim.

---
updated-dependencies:
- dependency-name: node
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-08 05:52:28 +00:00
github-actions
7324393b15 Release 2025.01.07 2025-01-08 02:27:20 +00:00
dependabot[bot]
38639e251e
Bump traefik from 3.2.3 to 3.3.0 (#5625) 2025-01-07 09:55:30 +00:00
Bruno Alla
b9eb7c8eca
Set minimum_pre_commit_version in pre-commit config (#5626) 2025-01-07 09:54:39 +00:00
github-actions
d50dd24e90 Release 2025.01.06 2025-01-07 02:28:28 +00:00
browniebroke
6e46acc466 Update Contributors 2025-01-06 14:49:24 +00:00
Hana Belay
570763e7ce
Add justfile for use with docker (#5621) 2025-01-06 14:49:01 +00:00
github-actions
e4b00c26d7 Release 2025.01.04 2025-01-05 02:30:04 +00:00
pyup.io bot
95c3772b3e
Update ruff to 0.8.6 (#5622) 2025-01-04 19:35:10 +00:00
github-actions
3ef84f1a26 Release 2025.01.02 2025-01-03 02:27:46 +00:00
browniebroke
b0e12c9cea Update Contributors 2025-01-02 20:44:26 +00:00
Pulse-Mind
411e92cf9d
Fix logging configuration for Celery tasks (#5563) 2025-01-02 20:44:08 +00:00
Bruno Alla
0434aea33f Rename API docs tests to not mention Swagger 2025-01-02 20:20:08 +00:00
pyup.io bot
df2bd97a24
Update ruff to 0.8.5 (#5619) 2025-01-02 18:13:06 +00:00
pyup.io bot
f8d267a78c
Update pillow to 11.1.0 (#5617) 2025-01-02 10:57:12 +00:00
Bruno Alla
683f207d4a Move API tests into a package
Mirroring the structure of the code being tested
2024-12-31 13:27:02 +00:00
Bruno Alla
a623f7bbc6 Drop support for Python 2 in template generation hooks 2024-12-31 12:58:13 +00:00
Bruno Alla
5b4e769354
Update a bunch of dependencies in the template project (#5612) 2024-12-31 10:47:47 +00:00
Bruno Alla
33f32b06d9
Fix missing update from uv.lock during release process (#5611) 2024-12-31 09:57:53 +00:00
Bruno Alla
7e0f4c165d
Bump Jinja from 3.1.4 to 3.1.5 (#5610) 2024-12-31 09:50:08 +00:00
github-actions
e3929b15e4 Release 2024.12.27 2024-12-28 02:25:06 +00:00
pyup.io bot
f9298f9b99
Update coverage from 7.6.9 to 7.6.10 (#5608) 2024-12-27 11:19:22 +00:00
pyup.io bot
4dcc9e786f
Update uvicorn-worker from 0.2.0 to 0.3.0 (#5607) 2024-12-27 11:19:02 +00:00
github-actions
2b09e6bb41 Release 2024.12.26 2024-12-27 02:27:37 +00:00
pyup-bot
fd9dd32d28 Update collectfasta from 3.2.0 to 3.2.1 2024-12-26 08:48:10 -03:00
pyup.io bot
e9f4ba8ae5
Update django-allauth from 65.3.0 to 65.3.1 (#5605) 2024-12-26 09:50:26 +00:00
github-actions
250a28bca8 Release 2024.12.24 2024-12-25 02:26:31 +00:00
pyup.io bot
61ffcbf163
Update djlint to 1.36.4 (#5603) 2024-12-24 14:27:11 +00:00
pyup.io bot
1787fe31d2
Update uvicorn from 0.32.1 to 0.34.0 (#5592) 2024-12-24 14:22:18 +00:00
github-actions
a7362a0838 Release 2024.12.23 2024-12-24 02:27:39 +00:00
dependabot[bot]
fc68927672
Bump astral-sh/setup-uv from 4 to 5 (#5602) 2024-12-23 09:31:31 +00:00
dependabot[bot]
df7fcce28f
Bump webpack-cli from 5.1.4 to 6.0.1 (#5601) 2024-12-23 09:27:51 +00:00
github-actions
b1bc92ff2c Release 2024.12.20 2024-12-21 02:25:40 +00:00
pyup.io bot
92491bc4ad
Update ruff to 0.8.4 (#5595) 2024-12-20 11:04:28 +00:00
github-actions
fb7b05afae Release 2024.12.17 2024-12-18 02:30:48 +00:00
pyup.io bot
6c20b26773
Update djangorestframework-stubs from 3.15.1 to 3.15.2 (#5591) 2024-12-17 08:42:47 +00:00
dependabot[bot]
a40c4e8588
Bump traefik from 3.2.2 to 3.2.3 (#5594) 2024-12-17 08:40:25 +00:00
github-actions[bot]
8245b0c147
Auto-update pyupgrade pre-commit hook (#5593) 2024-12-17 08:39:08 +00:00
github-actions
c17fef651f Release 2024.12.12 2024-12-13 02:33:08 +00:00
pyup.io bot
35bed843b8
Update ruff to 0.8.3 (#5587) 2024-12-12 23:17:39 +00:00
github-actions
72cb463ace Release 2024.12.11 2024-12-12 02:32:46 +00:00
dependabot[bot]
1b62f5b329
Bump traefik (#5586) 2024-12-11 14:33:28 +00:00
github-actions
1702b79b8c Release 2024.12.10 2024-12-11 02:32:47 +00:00
pyup.io bot
bb38f34c70
Update watchfiles from 1.0.0 to 1.0.3 (#5585) 2024-12-10 23:42:34 +00:00
dependabot[bot]
736ff7659d
Bump node from 22.11 to 22.12 (#5583) 2024-12-10 23:42:16 +00:00
github-actions
9ce93909a3 Release 2024.12.08 2024-12-09 02:34:03 +00:00
pyup.io bot
277bb8f475
Update ruff to 0.8.2 (#5576) 2024-12-08 15:20:23 +00:00
pyup.io bot
8ce5908229
Update coverage to 7.6.9 (#5581) 2024-12-08 14:49:57 +00:00
pyup.io bot
c187975e1d
Update sentry-sdk to 2.19.2 (#5579) 2024-12-08 14:49:40 +00:00
dependabot[bot]
402fd66165
Bump python in /{{cookiecutter.project_slug}}/compose/production/django (#5575) 2024-12-08 14:48:59 +00:00
dependabot[bot]
2c835f0ed5
Bump python from 3.12.7 to 3.12.8 in local Docker image (#5574) 2024-12-08 14:48:42 +00:00
dependabot[bot]
47bc51274d
Bump python from 3.12.7 to 3.12.8 in docs Docker image (#5573) 2024-12-08 14:48:19 +00:00
pyup.io bot
8c02bf8f93
Update hiredis to 3.1.0 (#5571) 2024-12-08 14:48:05 +00:00
pyup.io bot
f63daa7eb1
Update redis to 5.2.1 (#5580)
Co-authored-by: Bruno Alla <browniebroke@users.noreply.github.com>
2024-12-08 14:47:45 +00:00
Bruno Alla
cedbcbd0bf
Merge pull request #5572 from cookiecutter/pyup-update-django-5.0.9-to-5.0.10
Update django to 5.0.10
2024-12-08 15:39:13 +01:00
Bruno Alla
da24b3aa3f
Merge branch 'master' into pyup-update-django-5.0.9-to-5.0.10 2024-12-08 15:32:18 +01:00
pyup.io bot
a41bbee492
Update drf-spectacular to 0.28.0 (#5564) 2024-12-08 14:32:03 +00:00
Bruno Alla
b25ab14385
Pin node to version 22.11 (#5582)
* Add --rm to all docker run commands in CI

* Pin node 22 version to 22.11
2024-12-08 13:30:39 +01:00
pyup-bot
7e4ba42e6e Update django from 5.0.9 to 5.0.10 2024-12-04 15:46:56 +00:00
github-actions
857bcb6895 Release 2024.12.03 2024-12-04 02:32:42 +00:00
github-actions[bot]
eee987e1b4
Update django-upgrade to 1.22.2 (#5567) 2024-12-03 07:16:10 +00:00
github-actions
d43c73aeb6 Release 2024.12.02 2024-12-03 02:32:54 +00:00
pyup.io bot
3eacd55bf7
Update pytest to 8.3.4 (#5566) 2024-12-02 08:31:15 +00:00
github-actions
d7fe509ce9 Release 2024.12.01 2024-12-02 02:33:35 +00:00
pyup.io bot
9f34c18ffe
Update django-allauth to 65.3.0 (#5565) 2024-12-01 16:42:42 +00:00
github-actions
9465a18868 Release 2024.11.29 2024-11-30 02:29:43 +00:00
pyup.io bot
017c9ae6f8
Update ruff to 0.8.1 (#5557) 2024-11-29 09:20:53 +00:00
pyup.io bot
4dd166267d
Update djlint to 1.36.3 (#5558) 2024-11-29 08:51:35 +00:00
github-actions
7675287041 Release 2024.11.28 2024-11-29 02:31:54 +00:00
github-actions[bot]
606db119cd
Update djlint pre-commit hook to 1.36.2 (#5556) 2024-11-28 14:20:39 +00:00
pyup-bot
f0b50fb735 Update djlint from 1.36.1 to 1.36.2 2024-11-28 10:27:33 -03:00
github-actions
054eebf510 Release 2024.11.27 2024-11-28 02:31:56 +00:00
Bruno Alla
6a526ac633
Pin dart-sass to 1.77.6 to avoid deprecation warnings (#5552)
https://github.com/twbs/bootstrap/issues/40962
https://github.com/twbs/bootstrap/issues/40849
2024-11-27 21:18:33 +00:00
dependabot[bot]
88ba893524
Bump gulp-imagemin from 7.1.0 to 9.1.0 (#5052) 2024-11-27 18:37:39 +00:00
dependabot[bot]
0de4a2f6eb
Bump gulp from 4.0.2 to 5.0.0 (#4949) 2024-11-27 18:27:50 +00:00
github-actions
c02a16d6bf Release 2024.11.26 2024-11-27 02:32:12 +00:00
pyup.io bot
07061b6e2f
Update coverage to 7.6.8 (#5547) 2024-11-26 17:52:16 +00:00
pyup.io bot
c05770a4dc
Update watchfiles to 1.0.0 (#5548) 2024-11-26 17:51:57 +00:00
dependabot[bot]
575d4c3809
Bump astral-sh/setup-uv from 3 to 4 (#5549) 2024-11-25 12:47:25 +00:00
github-actions
4617cd2212 Release 2024.11.22 2024-11-23 02:28:37 +00:00
pyup.io bot
b09ee5be8a
Update ruff to 0.8.0 (#5545) 2024-11-22 12:48:20 +00:00
github-actions
be2fdb2984 Release 2024.11.21 2024-11-22 02:30:53 +00:00
pyup.io bot
aca580df00
Update sentry-sdk to 2.19.0 (#5543) 2024-11-21 18:16:44 +00:00
browniebroke
cbead91fdc Update Contributors 2024-11-21 12:55:15 +00:00
qwerrrqw
7fc33c2a23
Add support for secure Redis (TLS support) (#5526) 2024-11-21 12:54:50 +00:00
pyup.io bot
d00cd42e6c
Update uvicorn to 0.32.1 (#5539) 2024-11-21 12:29:46 +00:00
dependabot[bot]
dc8a470a8f
Bump traefik from 3.2.0 to 3.2.1 (#5541) 2024-11-21 12:29:07 +00:00
github-actions
b1de740dff Release 2024.11.20 2024-11-21 02:30:23 +00:00
browniebroke
6215f17382 Update Contributors 2024-11-20 16:25:27 +00:00
Denis Darii
f440144fde
Fix typos in translation instructions in README (#5538) 2024-11-20 16:25:04 +00:00
dependabot[bot]
c97df5f755
Bump amazon/aws-cli (#5537) 2024-11-20 08:50:57 +00:00
Bruno Alla
28ec065561
Fix broken links in README
Fix #5535
2024-11-19 07:42:58 +00:00
github-actions
3b490ffd2f Release 2024.11.16 2024-11-17 02:31:56 +00:00
pyup.io bot
c357d9ef33
Update ruff to 0.7.4 (#5531) 2024-11-16 11:00:01 +00:00
github-actions
0bb37a3f1f Release 2024.11.15 2024-11-16 02:29:26 +00:00
pyup.io bot
1b9f3e7a48
Update coverage to 7.6.5 (#5529) 2024-11-15 09:46:37 +00:00
github-actions
d3ffe31bd0 Release 2024.11.14 2024-11-15 02:30:57 +00:00
dependabot[bot]
e03b0b0c7e
Bump amazon/aws-cli (#5528) 2024-11-14 07:56:59 +00:00
github-actions
08ba595f87 Release 2024.11.13 2024-11-14 02:28:06 +00:00
pyup.io bot
c5988b5c3c
Update werkzeug to 3.1.3 (#5524) 2024-11-13 10:38:33 +00:00
pyup.io bot
73f41e2425
Update ruff to 0.7.3 (#5521) 2024-11-13 10:05:52 +00:00
dependabot[bot]
555872e1c9
Bump amazon/aws-cli from 2.19.0 to 2.20.0 (#5527) 2024-11-13 10:04:53 +00:00
Bruno Alla
868db771f3
Merge pull request #5523 from cookiecutter/pyup-update-django-allauth-65.1.0-to-65.2.0 2024-11-13 10:04:32 +00:00
github-actions
cf375e934b Release 2024.11.08 2024-11-09 02:23:39 +00:00
pyup-bot
b932c9bf15 Update django-allauth from 65.1.0 to 65.2.0 2024-11-08 13:51:11 +00:00
github-actions
4e506b44f1 Release 2024.11.07 2024-11-08 02:26:52 +00:00
pyup.io bot
8d6c8ebed1
Update djlint to 1.36.1 (#5519) 2024-11-07 19:43:37 +00:00
github-actions
f8954e8a47 Release 2024.11.05 2024-11-06 02:26:15 +00:00
pyup.io bot
1e0c9ff2c1
Update djlint to 1.36.0 (#5517) 2024-11-05 08:21:05 +00:00
github-actions
06bfd2ebaa Release 2024.11.04 2024-11-05 02:26:45 +00:00
pyup.io bot
dd98112051
Update sentry-sdk to 2.18.0 (#5515) 2024-11-04 18:09:28 +00:00
github-actions
51ce542796 Release 2024.11.02 2024-11-03 02:30:16 +00:00
pyup.io bot
5136d3da99
Update ruff to 0.7.2 (#5510) 2024-11-02 18:51:49 +00:00
github-actions
f2a45a3ee7 Release 2024.11.01 2024-11-02 02:26:45 +00:00
pyup.io bot
33a7478559
Update djlint to 1.35.4 (#5508)
Co-authored-by: browniebroke <861044+browniebroke@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-11-01 12:21:39 +00:00
dependabot[bot]
8d5a4269fc
Bump amazon/aws-cli from 2.18.1 to 2.19.0 (#5507)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-01 09:55:01 +00:00
Bruno Alla
6b8d4dc856
Replace docs extra by docs dependency group from PEP 735 (#5493) 2024-10-31 19:57:08 +00:00
github-actions
4c95392321 Release 2024.10.30 2024-10-31 02:29:26 +00:00
github-actions[bot]
6b7c4aebda
Update pyproject-fmt pre-commit hook to v2.5.0 (#5505)
Co-authored-by: browniebroke <861044+browniebroke@users.noreply.github.com>
2024-10-30 17:01:41 +00:00
pyup.io bot
14ba82423e
Update djlint to 1.35.3 (#5503) 2024-10-30 13:19:12 +00:00
pyup.io bot
46795883b5
Update whitenoise from 6.8.1 to 6.8.2 (#5501) 2024-10-30 07:47:48 +00:00
browniebroke
5f9acfdf47 Update Contributors 2024-10-30 07:13:42 +00:00
Christian Jensen
9bef46c198
Small spelling correction (#5502)
Mimicing > Mimicking
2024-10-30 07:13:20 +00:00
github-actions
571f8787eb Release 2024.10.29 2024-10-30 02:28:45 +00:00
Bruno Alla
a062a146df
Merge pull request #5499 from cookiecutter/pyup-update-django-cors-headers-4.5.0-to-4.6.0
Update django-cors-headers to 4.6.0
2024-10-29 12:28:31 +00:00
pyup-bot
b40566e401 Update django-cors-headers from 4.5.0 to 4.6.0 2024-10-29 12:00:39 +00:00
Bruno Alla
63044a04cd
Merge pull request #5497 from cookiecutter/pyup-update-whitenoise-6.7.0-to-6.8.1 2024-10-29 08:45:01 +00:00
Bruno Alla
ab7f01c4d1
Merge pull request #5498 from cookiecutter/dependabot/docker/{{cookiecutter.project_slug}}/compose/production/traefik/traefik-3.2.0 2024-10-29 08:44:44 +00:00
dependabot[bot]
272ef407d6
Bump traefik
Bumps traefik from 3.1.6 to 3.2.0.

---
updated-dependencies:
- dependency-name: traefik
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-29 05:09:08 +00:00
pyup-bot
4377481f32 Update whitenoise from 6.7.0 to 6.8.1 2024-10-28 15:57:36 +00:00
github-actions
fb27881b33 Release 2024.10.26 2024-10-27 02:30:32 +00:00
Bruno Alla
d40abd321e
Merge pull request #5495 from cookiecutter/pyup-update-django-stubs-5.1.0-to-5.1.1
Update django-stubs to 5.1.1
2024-10-27 00:50:48 +01:00
Bruno Alla
f4afaf5ba3
Merge branch 'pyup-update-mypy-1.11.2-to-1.13.0' into pyup-update-django-stubs-5.1.0-to-5.1.1 2024-10-27 00:43:31 +01:00
Bruno Alla
231940644e
Merge branch 'master' into pyup-update-mypy-1.11.2-to-1.13.0 2024-10-27 00:39:35 +01:00
pyup-bot
e86fd33633 Update django-stubs from 5.1.0 to 5.1.1 2024-10-26 20:41:35 +01:00
pyup.io bot
19294ef8a0
Update werkzeug to 3.0.6 (#5492) 2024-10-26 12:57:56 +01:00
github-actions
60cc312918 Release 2024.10.25 2024-10-26 02:25:46 +00:00
Jelmer
17a1bf7e38
Merge pull request #5489 from cookiecutter/pyup-update-werkzeug-3.0.4-to-3.0.5
Update werkzeug to 3.0.5 and unpin watchdog<5
2024-10-25 10:15:51 +02:00
Bruno Alla
428fac8776
Remove watchdog pin <4
The issue that lead to this pinning should be fixed now: https://github.com/pallets/werkzeug/issues/2945
2024-10-25 09:01:28 +01:00
github-actions[bot]
0384b8f001
Auto-update pre-commit hooks (#5490)
Co-authored-by: browniebroke <861044+browniebroke@users.noreply.github.com>
2024-10-25 08:57:01 +01:00
github-actions
33a707dd9f Release 2024.10.24 2024-10-25 02:28:42 +00:00
pyup-bot
fb6549dc4d Update werkzeug from 3.0.4 to 3.0.5 2024-10-25 03:25:21 +01:00
pyup.io bot
109238f746
Update ruff to 0.7.1 (#5487) 2024-10-24 19:48:35 +01:00
pyup.io bot
244d7ac9cd
Update redis to 5.2.0 (#5486) 2024-10-24 17:30:20 +01:00
pyup.io bot
ceafff014e
Update django-allauth from 65.0.2 to 65.1.0 (#5485) 2024-10-24 07:44:01 +01:00
github-actions
b4737acb6d Release 2024.10.22 2024-10-23 02:28:14 +00:00
pyup-bot
fd05b1de21 Update mypy from 1.11.2 to 1.13.0 2024-10-23 01:14:36 +01:00
github-actions[bot]
edd8a8b315
Auto-update pre-commit hooks (#5483)
Co-authored-by: browniebroke <861044+browniebroke@users.noreply.github.com>
2024-10-22 07:39:35 +01:00
browniebroke
2533f72d61 Update Contributors 2024-10-22 06:39:29 +00:00
Mariot Tsitoara
020639f86f
Fix broken links in generated README.md (#5482) 2024-10-22 07:39:07 +01:00
github-actions
a829571997 Release 2024.10.21 2024-10-22 02:28:34 +00:00
Jelmer
9806ba7a36
Merge pull request #4861 from foarsitter/remove_celery_broker_url
Remove CELERY_BROKER_URL in favor of REDIS_URL
2024-10-21 22:21:25 +02:00
Jelmer Draaijer
8bf9a8c278 Add a default for REDIS_URL and add it as a variable to the settings 2024-10-21 22:10:42 +02:00
pyup.io bot
02f6336d74
Update coverage to 7.6.4 (#5480) 2024-10-21 10:12:40 +01:00
Bruno Alla
6f5f1b8576
Fix a number of issues with Azure storage (#5476) 2024-10-21 10:12:29 +01:00
github-actions
1b83a472ec Release 2024.10.17 2024-10-18 02:28:50 +00:00
Bruno Alla
8c1fac1b2e
Run uv lock when updating template version (#5478) 2024-10-17 21:38:22 +01:00
pyup.io bot
abc199d5ef
Update ruff to 0.7.0 (#5474) 2024-10-17 21:29:12 +01:00
github-actions[bot]
ca405049ad
Auto-update pre-commit hooks (#5475)
Co-authored-by: browniebroke <861044+browniebroke@users.noreply.github.com>
2024-10-17 19:10:50 +01:00
pyup.io bot
ae86e01779
Update uvicorn to 0.32.0 (#5471) 2024-10-17 12:52:53 +01:00
pyup.io bot
dc4d102477
Update pillow to 11.0.0 (#5470) 2024-10-17 12:52:42 +01:00
pyup.io bot
ff7874b316
Update sentry-sdk to 2.17.0 (#5473) 2024-10-17 12:52:13 +01:00
github-actions
67af42be0c Release 2024.10.15 2024-10-16 02:29:09 +00:00
github-actions[bot]
16b2c16b52
Auto-update pre-commit hooks (#5469)
Co-authored-by: browniebroke <861044+browniebroke@users.noreply.github.com>
2024-10-15 09:27:16 +01:00
github-actions
deb813ca05 Release 2024.10.14 2024-10-15 02:28:45 +00:00
Jelmer Draaijer
4709a30bd7 Remove CELERY_BROKER_URL in favor of REDIS_URL 2024-10-14 20:38:32 +02:00
Jelmer
62f39cda5e
Merge pull request #5463 from cookiecutter/pyup-update-sphinx-8.1.1-to-8.1.3
Update sphinx to 8.1.3
2024-10-14 20:34:10 +02:00
Jelmer
8831a8bd11
Merge pull request #5464 from cookiecutter/pyup-update-coverage-7.6.2-to-7.6.3
Update coverage to 7.6.3
2024-10-14 20:34:00 +02:00
pyup-bot
057562bf26 Update sphinx from 8.1.1 to 8.1.3 2024-10-14 19:33:59 +02:00
pyup-bot
04d6620733 Update coverage from 7.6.2 to 7.6.3 2024-10-14 19:33:48 +02:00
Jelmer
ccb0d974ed
Merge pull request #5467 from cookiecutter/5465-missing-os-requirements-for-ubuntu-latest
Add requirements for ubuntu 24.04
2024-10-14 19:33:17 +02:00
Jelmer Draaijer
b042b212b6 Add requirements for ubuntu 24.04 2024-10-14 19:12:10 +02:00
github-actions
a0c8863a9c Release 2024.10.12 2024-10-13 02:30:03 +00:00
Bruno Alla
931e300b63
Pin Python version to 3.12 (#5456)
* Pin Python version to 3.12

* Add back actions/setup-python to bare metal tests

* Revert "Add back actions/setup-python to bare metal tests"

This reverts commit cdee7e2da7.

* Update test_bare.sh to run commands via uv

* Skip uv lock on PRs from forks

* Revert "Update test_bare.sh to run commands via uv"

This reverts commit 56f839e2b4.

* Add back actions/setup-python to bare metal tests

* Only run uv lock workflow on dependabot PRs
2024-10-12 17:46:45 +01:00
Jelmer
822c1c0327
Merge pull request #5457 from cookiecutter/pyup-update-sphinx-8.0.2-to-8.1.1
Update sphinx to 8.1.1
2024-10-12 16:44:16 +02:00
Jelmer
98f4863a25
Merge pull request #5458 from cookiecutter/update/pre-commit-autoupdate
Auto-update pre-commit hooks
2024-10-12 16:44:06 +02:00
Jelmer
c1092f5194
Merge pull request #5459 from cookiecutter/pyup-update-django-cors-headers-4.4.0-to-4.5.0
Update django-cors-headers to 4.5.0
2024-10-12 16:43:58 +02:00
pyup-bot
abfc6b0ee2 Update django-cors-headers from 4.4.0 to 4.5.0 2024-10-12 10:59:48 +01:00
browniebroke
3f2155ab6e Auto-update pre-commit hooks 2024-10-12 02:36:29 +00:00
github-actions
92cf1daaf4 Release 2024.10.11 2024-10-12 02:25:39 +00:00
pyup-bot
209b54a628 Update sphinx from 8.0.2 to 8.1.1 2024-10-12 01:41:04 +01:00
Fábio C. Barrionuevo da Luz
54247e783e Update Nginx dependabot versioning-strategy
as a way to fix #5345 and #5344
2024-10-11 21:40:58 -03:00
luzfcb
6994914572 Update Contributors 2024-10-11 13:21:16 +00:00
Francisco Navarro Morales
b96e118f86 Update README.md broken links
Closes https://github.com/cookiecutter/cookiecutter-django/issues/5453
2024-10-11 10:20:56 -03:00
Jelmer
5fead041df
Merge pull request #5450 from cookiecutter/update/pre-commit-autoupdate
Auto-update pre-commit hooks
2024-10-11 11:45:32 +02:00
Jelmer
2eb0b22530
Merge pull request #5452 from foarsitter/wait-for-it
wait-for-it as dependency in the run stage
2024-10-11 11:45:18 +02:00
jelmert
dcde07d0ca wait-for-it as dependency in the run stage 2024-10-11 09:40:50 +02:00
pre-commit-ci[bot]
bee41248a4 Regenerate uv.lock 2024-10-11 02:39:02 +00:00
pre-commit-ci[bot]
4696302b22 [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2024-10-11 02:38:44 +00:00
browniebroke
ed184d460a Auto-update pre-commit hooks 2024-10-11 02:38:35 +00:00
github-actions
1ebaddc204 Release 2024.10.10 2024-10-11 02:27:43 +00:00
pyup-bot
f3d4a9fcc7 Update sentry-sdk from 2.15.0 to 2.16.0 2024-10-10 09:42:32 -03:00
dependabot[bot]
44dc46997a
Bump traefik from 3.1.5 to 3.1.6 (#5449)
Bumps traefik from 3.1.5 to 3.1.6.

---
updated-dependencies:
- dependency-name: traefik
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-10 09:50:04 +01:00
github-actions
a0c599d978 Release 2024.10.09 2024-10-10 02:28:06 +00:00
pyup.io bot
0bd606922c
Update coverage to 7.6.2 (#5448) 2024-10-09 18:06:49 +01:00
github-actions
8fb90ab02a Release 2024.10.08 2024-10-09 02:28:04 +00:00
pyup.io bot
b66960ed2d
Update pre-commit to 4.0.1 (#5445) 2024-10-08 21:23:15 +01:00
Jelmer
9ada7ab125
Merge pull request #5443 from cookiecutter/dependabot/docker/{{cookiecutter.project_slug}}/compose/production/aws/amazon/aws-cli-2.18.1
Bump amazon/aws-cli from 2.18.0 to 2.18.1 in /{{cookiecutter.project_slug}}/compose/production/aws
2024-10-08 07:55:01 +02:00
Jelmer
c3ec0b020e
Merge pull request #5441 from cookiecutter/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
2024-10-08 07:54:52 +02:00
Jelmer
6a2effb67c
Merge pull request #5442 from cookiecutter/update/pre-commit-autoupdate
Auto-update pre-commit hooks
2024-10-08 07:54:41 +02:00
Bruno Alla
214e5f5d34
Use uv sync & uv run in docs build (#5440)
* Use uv sync to build the docs with Sphinx
2024-10-08 07:54:24 +02:00
dependabot[bot]
30295fefd2
Bump amazon/aws-cli
Bumps amazon/aws-cli from 2.18.0 to 2.18.1.

---
updated-dependencies:
- dependency-name: amazon/aws-cli
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 05:46:01 +00:00
browniebroke
c2caf522b5 Auto-update pre-commit hooks 2024-10-08 02:39:47 +00:00
pre-commit-ci[bot]
49ed4a0267
[pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/psf/black: 24.8.0 → 24.10.0](https://github.com/psf/black/compare/24.8.0...24.10.0)
2024-10-08 00:48:03 +00:00
79 changed files with 1897 additions and 752 deletions

View File

@ -12,7 +12,7 @@ trim_trailing_whitespace = true
indent_style = space
indent_size = 4
[*.{html,css,scss,json,yml,xml}]
[*.{html,css,scss,json,yml,xml,toml}]
indent_style = space
indent_size = 2

View File

@ -1648,5 +1648,70 @@
"name": "LJFP",
"github_login": "ljfp",
"twitter_username": ""
},
{
"name": "Francisco Navarro Morales ",
"github_login": "spothound",
"twitter_username": ""
},
{
"name": "Mariot Tsitoara",
"github_login": "mariot",
"twitter_username": ""
},
{
"name": "Christian Jensen",
"github_login": "jensenbox",
"twitter_username": "cjensen"
},
{
"name": "Denis Darii",
"github_login": "DNX",
"twitter_username": ""
},
{
"name": "qwerrrqw",
"github_login": "qwerrrqw",
"twitter_username": ""
},
{
"name": "Pulse-Mind",
"github_login": "pulse-mind",
"twitter_username": ""
},
{
"name": "Hana Belay",
"github_login": "earthcomfy",
"twitter_username": ""
},
{
"name": "Ed Morley",
"github_login": "edmorley",
"twitter_username": ""
},
{
"name": "Alan Cyment",
"github_login": "acyment",
"twitter_username": ""
},
{
"name": "Kawsar Alam Foysal",
"github_login": "iamfoysal",
"twitter_username": ""
},
{
"name": "Igor Jerosimić",
"github_login": "igor-wl",
"twitter_username": ""
},
{
"name": "Pepa",
"github_login": "07pepa",
"twitter_username": ""
},
{
"name": "Aidos Kanapyanov",
"github_login": "aidoskanapyanov",
"twitter_username": ""
}
]

View File

@ -2,23 +2,16 @@
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
enable-beta-ecosystems: true
updates:
# Update Python deps for the template (not the generated project)
- package-ecosystem: "pip"
- package-ecosystem: "uv"
directory: "/"
schedule:
interval: "daily"
labels:
- "project infrastructure"
# Update Python deps for the documentation
- package-ecosystem: "pip"
directory: "docs/"
schedule:
interval: "daily"
labels:
- "project infrastructure"
# Update GitHub actions in workflows
- package-ecosystem: "github-actions"
directory: "/"
@ -36,11 +29,11 @@ updates:
- "update"
# Enable version updates for Docker
# We need to specify each Dockerfile in a separate entry because Dependabot doesn't
# support wildcards or recursively checking subdirectories. Check this issue for updates:
# https://github.com/dependabot/dependabot-core/issues/2178
- package-ecosystem: "docker"
directory: "{{cookiecutter.project_slug}}/compose/local/django/"
directories:
- "{{cookiecutter.project_slug}}/compose/local/django/"
- "{{cookiecutter.project_slug}}/compose/local/docs/"
- "{{cookiecutter.project_slug}}/compose/production/django/"
schedule:
interval: "daily"
ignore:
@ -52,59 +45,12 @@ updates:
- "update"
- package-ecosystem: "docker"
directory: "{{cookiecutter.project_slug}}/compose/local/docs/"
schedule:
interval: "daily"
ignore:
- dependency-name: "*"
update-types:
- "version-update:semver-major"
- "version-update:semver-minor"
labels:
- "update"
- package-ecosystem: "docker"
directory: "{{cookiecutter.project_slug}}/compose/local/node/"
schedule:
interval: "daily"
labels:
- "update"
- package-ecosystem: "docker"
directory: "{{cookiecutter.project_slug}}/compose/production/aws/"
schedule:
interval: "daily"
labels:
- "update"
- package-ecosystem: "docker"
directory: "{{cookiecutter.project_slug}}/compose/production/django/"
schedule:
interval: "daily"
ignore:
- dependency-name: "*"
update-types:
- "version-update:semver-major"
- "version-update:semver-minor"
labels:
- "update"
- package-ecosystem: "docker"
directory: "{{cookiecutter.project_slug}}/compose/production/postgres/"
schedule:
interval: "daily"
labels:
- "update"
- package-ecosystem: "docker"
directory: "{{cookiecutter.project_slug}}/compose/production/nginx/"
schedule:
interval: "daily"
labels:
- "update"
- package-ecosystem: "docker"
directory: "{{cookiecutter.project_slug}}/compose/production/traefik/"
directories:
- "{{cookiecutter.project_slug}}/compose/local/node/"
- "{{cookiecutter.project_slug}}/compose/production/aws/"
- "{{cookiecutter.project_slug}}/compose/production/postgres/"
- "{{cookiecutter.project_slug}}/compose/production/nginx/"
- "{{cookiecutter.project_slug}}/compose/production/traefik/"
schedule:
interval: "daily"
labels:

52
.github/workflows/align-versions.yml vendored Normal file
View File

@ -0,0 +1,52 @@
name: align versions
on:
pull_request:
paths:
- "{{cookiecutter.project_slug}}/requirements/local.txt"
- "{{cookiecutter.project_slug}}/compose/local/node/Dockerfile"
# Manual trigger
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
run:
if: ${{ github.actor == 'pyup-bot' }}
runs-on: ubuntu-latest
env:
GH_PAT: ${{ secrets.GH_PAT }}
strategy:
fail-fast: false
matrix:
job:
- script: scripts/ruff_version.py
name: Ruff
- script: scripts/node_version.py
name: Node
name: "${{ matrix.job.name }} versions"
steps:
- name: Checkout with token
uses: actions/checkout@v4
if: ${{ env.GH_PAT != '' }}
with:
token: ${{ env.GH_PAT }}
ref: ${{ github.head_ref }}
- name: Checkout without token
uses: actions/checkout@v4
if: ${{ env.GH_PAT == '' }}
with:
ref: ${{ github.head_ref }}
- uses: astral-sh/setup-uv@v5
- run: uv run ${{ matrix.job.script }}
- uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: Align versions

View File

@ -24,9 +24,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v3
with:
enable-cache: "true"
uses: astral-sh/setup-uv@v5
- name: Install dependencies
run: uv sync
- name: Run tests
@ -55,9 +53,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v3
with:
enable-cache: "true"
uses: astral-sh/setup-uv@v5
- name: Install dependencies
run: uv sync
- name: Docker ${{ matrix.script.name }}
@ -85,27 +81,28 @@ jobs:
ports:
- 6379:6379
postgres:
image: postgres:12
image: postgres:13
ports:
- 5432:5432
env:
POSTGRES_PASSWORD: postgres
env:
CELERY_BROKER_URL: "redis://localhost:6379/0"
REDIS_URL: "redis://localhost:6379/0"
# postgres://user:password@host:port/database
DATABASE_URL: "postgres://postgres:postgres@localhost:5432/postgres"
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v3
- uses: actions/setup-python@v5
with:
enable-cache: "true"
python-version: "3.12"
- name: Install uv
uses: astral-sh/setup-uv@v5
- name: Install dependencies
run: uv sync
- uses: actions/setup-node@v4
with:
node-version: "22"
node-version: "22.14"
- name: Bare Metal ${{ matrix.script.name }}
run: sh tests/test_bare.sh ${{ matrix.script.args }}

View File

@ -11,6 +11,7 @@ permissions:
jobs:
lock:
if: ${{ github.actor == 'dependabot[bot]' }}
runs-on: ubuntu-latest
env:
GH_PAT: ${{ secrets.GH_PAT }}
@ -25,9 +26,7 @@ jobs:
uses: actions/checkout@v4
if: ${{ env.GH_PAT == '' }}
- uses: astral-sh/setup-uv@v3
with:
enable-cache: true
- uses: astral-sh/setup-uv@v5
- run: uv lock
- uses: stefanzweifel/git-auto-commit-action@v5
with:

View File

@ -18,9 +18,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v3
with:
enable-cache: "true"
uses: astral-sh/setup-uv@v5
- name: Create Django Major Issue
run: uv run --frozen scripts/create_django_issue.py
env:

View File

@ -16,14 +16,12 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v3
with:
enable-cache: "true"
uses: astral-sh/setup-uv@v5
- name: Set git details
run: |
git config --global user.name "github-actions"
git config --global user.email "action@github.com"
- name: Update list
- name: Update changelog
run: uv run --frozen scripts/update_changelog.py
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -19,9 +19,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v3
with:
enable-cache: "true"
uses: astral-sh/setup-uv@v5
- name: Update list
run: uv run --frozen scripts/update_contributors.py
env:

View File

@ -1,5 +1,6 @@
exclude: "{{cookiecutter.project_slug}}|.github/contributors.json|CHANGELOG.md|CONTRIBUTORS.md"
default_stages: [pre-commit]
minimum_pre_commit_version: "3.2.0"
default_language_version:
python: python3.12
@ -26,29 +27,29 @@ repos:
args: ["--tab-width", "2"]
- repo: https://github.com/asottile/pyupgrade
rev: v3.17.0
rev: v3.19.1
hooks:
- id: pyupgrade
args: [--py312-plus]
exclude: hooks/
- repo: https://github.com/psf/black
rev: 24.8.0
rev: 25.1.0
hooks:
- id: black
- repo: https://github.com/PyCQA/isort
rev: 5.13.2
rev: 6.0.1
hooks:
- id: isort
- repo: https://github.com/PyCQA/flake8
rev: 7.1.1
rev: 7.2.0
hooks:
- id: flake8
- repo: https://github.com/tox-dev/pyproject-fmt
rev: "2.2.4"
rev: "v2.5.1"
hooks:
- id: pyproject-fmt

View File

@ -13,9 +13,8 @@ build:
- asdf plugin add uv
- asdf install uv latest
- asdf global uv latest
- uv venv
- uv pip install .[docs]
- .venv/bin/python -m sphinx -T -b html -d docs/_build/doctrees -D language=en docs $READTHEDOCS_OUTPUT/html
- uv sync --only-group docs --frozen
- uv run -m sphinx -T -b html -d docs/_build/doctrees -D language=en docs $READTHEDOCS_OUTPUT/html
# Build documentation in the docs/ directory with Sphinx
sphinx:

View File

@ -3,6 +3,914 @@ All enhancements and patches to Cookiecutter Django will be documented in this f
<!-- GENERATOR_PLACEHOLDER -->
## 2025.04.05
### Changed
- Add Docker build caching on GitHub Actions ([#5700](https://github.com/cookiecutter/cookiecutter-django/pull/5700))
- Pin Pillow and Sphinx to non yanked release ([#5765](https://github.com/cookiecutter/cookiecutter-django/pull/5765))
### Updated
- Update ruff to 0.11.4 ([#5767](https://github.com/cookiecutter/cookiecutter-django/pull/5767))
## 2025.04.03
### Updated
- Update django-anymail to 13.0 ([#5763](https://github.com/cookiecutter/cookiecutter-django/pull/5763))
- Update pytest-django to 4.11.1 ([#5762](https://github.com/cookiecutter/cookiecutter-django/pull/5762))
- Update ruff to 0.11.3 ([#5761](https://github.com/cookiecutter/cookiecutter-django/pull/5761))
- Update django-allauth to 65.7.0 ([#5760](https://github.com/cookiecutter/cookiecutter-django/pull/5760))
## 2025.04.02
### Fixed
- Fix line endings for dotenv merge script on Windows ([#5754](https://github.com/cookiecutter/cookiecutter-django/pull/5754))
### Updated
- Update crispy-bootstrap5 to 2025.4 ([#5756](https://github.com/cookiecutter/cookiecutter-django/pull/5756))
- Update Django from 5.0 to 5.1 ([#5740](https://github.com/cookiecutter/cookiecutter-django/pull/5740))
- Update sentry-sdk to 2.25.1 ([#5757](https://github.com/cookiecutter/cookiecutter-django/pull/5757))
- Update django-storages to 1.14.6 ([#5753](https://github.com/cookiecutter/cookiecutter-django/pull/5753))
- Update pytest-django to 4.11.0 ([#5752](https://github.com/cookiecutter/cookiecutter-django/pull/5752))
## 2025.04.01
### Updated
- Update pillow to 11.2.0 ([#5751](https://github.com/cookiecutter/cookiecutter-django/pull/5751))
- Bump traefik from 3.3.4 to 3.3.5 ([#5750](https://github.com/cookiecutter/cookiecutter-django/pull/5750))
- Update celery to 5.5.0 ([#5748](https://github.com/cookiecutter/cookiecutter-django/pull/5748))
## 2025.03.31
### Updated
- Update django-allauth to 65.6.0 ([#5741](https://github.com/cookiecutter/cookiecutter-django/pull/5741))
- Update sentry-sdk to 2.25.0 ([#5747](https://github.com/cookiecutter/cookiecutter-django/pull/5747))
- Update coverage to 7.8.0 ([#5745](https://github.com/cookiecutter/cookiecutter-django/pull/5745))
## 2025.03.28
### Updated
- Update djangorestframework to 3.16.0 ([#5743](https://github.com/cookiecutter/cookiecutter-django/pull/5743))
- Update django-upgrade pre-commit hook to v1.24.0 ([#5742](https://github.com/cookiecutter/cookiecutter-django/pull/5742))
## 2025.03.24
### Updated
- Update django-allauth to 65.5.0 ([#5723](https://github.com/cookiecutter/cookiecutter-django/pull/5723))
- Update sentry-sdk to 2.24.1 ([#5739](https://github.com/cookiecutter/cookiecutter-django/pull/5739))
## 2025.03.22
### Updated
- Update coverage to 7.7.1 ([#5736](https://github.com/cookiecutter/cookiecutter-django/pull/5736))
## 2025.03.21
### Updated
- Update sentry-sdk to 2.24.0 ([#5734](https://github.com/cookiecutter/cookiecutter-django/pull/5734))
- Update django-debug-toolbar to 5.1.0 ([#5732](https://github.com/cookiecutter/cookiecutter-django/pull/5732))
- Update ruff to 0.11.2 ([#5735](https://github.com/cookiecutter/cookiecutter-django/pull/5735))
- Bump amazon/aws-cli from 2.24.0 to 2.25.0 ([#5733](https://github.com/cookiecutter/cookiecutter-django/pull/5733))
- Auto-update pre-commit hooks ([#5657](https://github.com/cookiecutter/cookiecutter-django/pull/5657))
## 2025.03.19
### Updated
- Update pre-commit to 4.2.0 ([#5730](https://github.com/cookiecutter/cookiecutter-django/pull/5730))
## 2025.03.17
### Updated
- Update sentry-sdk to 2.23.1 ([#5727](https://github.com/cookiecutter/cookiecutter-django/pull/5727))
- Update coverage to 7.7.0 ([#5725](https://github.com/cookiecutter/cookiecutter-django/pull/5725))
## 2025.03.15
### Updated
- Update psycopg to 3.2.6 ([#5721](https://github.com/cookiecutter/cookiecutter-django/pull/5721))
- Update ruff to 0.11.0 ([#5724](https://github.com/cookiecutter/cookiecutter-django/pull/5724))
## 2025.03.08
### Updated
- Update ruff to 0.9.10 ([#5720](https://github.com/cookiecutter/cookiecutter-django/pull/5720))
## 2025.03.06
### Updated
- Update django to 5.0.13 ([#5719](https://github.com/cookiecutter/cookiecutter-django/pull/5719))
## 2025.03.04
### Changed
- Add groups for dependabot updates ([#5709](https://github.com/cookiecutter/cookiecutter-django/pull/5709))
### Updated
- Update sphinx to 8.3.0 ([#5714](https://github.com/cookiecutter/cookiecutter-django/pull/5714))
- Update pytest to 8.3.5 ([#5713](https://github.com/cookiecutter/cookiecutter-django/pull/5713))
## 2025.03.01
### Updated
- Update ruff to 0.9.9 ([#5711](https://github.com/cookiecutter/cookiecutter-django/pull/5711))
## 2025.02.28
### Updated
- Update ruff to 0.9.8 ([#5708](https://github.com/cookiecutter/cookiecutter-django/pull/5708))
- Bump babel-loader from 9.2.1 to 10.0.0 ([#5710](https://github.com/cookiecutter/cookiecutter-django/pull/5710))
## 2025.02.26
### Updated
- Bump traefik from 3.3.3 to 3.3.4 ([#5705](https://github.com/cookiecutter/cookiecutter-django/pull/5705))
## 2025.02.25
### Documentation
- Fix links to FAQ about `contrib.sites` directory ([#5704](https://github.com/cookiecutter/cookiecutter-django/pull/5704))
## 2025.02.23
### Changed
- Group dependabot docker directories ([#5698](https://github.com/cookiecutter/cookiecutter-django/pull/5698))
### Updated
- Update sphinx to 8.2.1 ([#5696](https://github.com/cookiecutter/cookiecutter-django/pull/5696))
- Update psycopg to 3.2.5 ([#5697](https://github.com/cookiecutter/cookiecutter-django/pull/5697))
## 2025.02.21
### Updated
- Update djangorestframework-stubs to 3.15.3 ([#5695](https://github.com/cookiecutter/cookiecutter-django/pull/5695))
- Update sphinx to 8.2.0 ([#5693](https://github.com/cookiecutter/cookiecutter-django/pull/5693))
- Update ruff to 0.9.7 ([#5694](https://github.com/cookiecutter/cookiecutter-django/pull/5694))
## 2025.02.17
### Updated
- Update sentry-sdk to 2.22.0 ([#5692](https://github.com/cookiecutter/cookiecutter-django/pull/5692))
- Update django-storages to 1.14.5 ([#5690](https://github.com/cookiecutter/cookiecutter-django/pull/5690))
## 2025.02.14
### Updated
- Bump node from 22.13 to 22.14 ([#5688](https://github.com/cookiecutter/cookiecutter-django/pull/5688))
## 2025.02.13
### Updated
- Update sentry-sdk to 2.21.0 ([#5687](https://github.com/cookiecutter/cookiecutter-django/pull/5687))
## 2025.02.11
### Updated
- Update coverage to 7.6.12 ([#5686](https://github.com/cookiecutter/cookiecutter-django/pull/5686))
## 2025.02.10
### Updated
- Update pytest-django to 4.10.0 ([#5684](https://github.com/cookiecutter/cookiecutter-django/pull/5684))
- Update ruff to 0.9.6 ([#5683](https://github.com/cookiecutter/cookiecutter-django/pull/5683))
- Bump amazon/aws-cli from 2.23.0 to 2.24.0 ([#5682](https://github.com/cookiecutter/cookiecutter-django/pull/5682))
## 2025.02.08
### Updated
- Update coverage to 7.6.11 ([#5681](https://github.com/cookiecutter/cookiecutter-django/pull/5681))
## 2025.02.07
### Updated
- Update mypy to 1.15.0 ([#5664](https://github.com/cookiecutter/cookiecutter-django/pull/5664))
- Update django-stubs to 5.1.3 ([#5680](https://github.com/cookiecutter/cookiecutter-django/pull/5680))
- Bump python from 3.12.8 to 3.12.9 in local Docker image ([#5678](https://github.com/cookiecutter/cookiecutter-django/pull/5678))
- Bump python from 3.12.8 to 3.12.9 in production Docker image ([#5677](https://github.com/cookiecutter/cookiecutter-django/pull/5677))
- Bump python from 3.12.8 to 3.12.9 in docs Docker image ([#5676](https://github.com/cookiecutter/cookiecutter-django/pull/5676))
- Update django-allauth to 65.4.1 ([#5679](https://github.com/cookiecutter/cookiecutter-django/pull/5679))
- Update django-cors-headers to 4.7.0 ([#5675](https://github.com/cookiecutter/cookiecutter-django/pull/5675))
- Update whitenoise to 6.9.0 ([#5674](https://github.com/cookiecutter/cookiecutter-django/pull/5674))
## 2025.02.06
### Fixed
- Bump node version in production Dockerfile from 20 to 22.13 ([#5672](https://github.com/cookiecutter/cookiecutter-django/pull/5672))
### Updated
- Update ruff to 0.9.5 ([#5673](https://github.com/cookiecutter/cookiecutter-django/pull/5673))
## 2025.02.05
### Changed
- Add missing trailing slash in test `MEDIA_URL` ([#5666](https://github.com/cookiecutter/cookiecutter-django/pull/5666))
### Updated
- Update django to 5.0.12 ([#5667](https://github.com/cookiecutter/cookiecutter-django/pull/5667))
## 2025.02.03
### Updated
- Bump traefik from 3.3.2 to 3.3.3 ([#5660](https://github.com/cookiecutter/cookiecutter-django/pull/5660))
- Update factory-boy to 3.3.2 ([#5661](https://github.com/cookiecutter/cookiecutter-django/pull/5661))
## 2025.01.30
### Updated
- Update ruff to 0.9.4 ([#5659](https://github.com/cookiecutter/cookiecutter-django/pull/5659))
## 2025.01.26
### Changed
- Migrate generated project from `runtime.txt` to `.python-version` ([#5652](https://github.com/cookiecutter/cookiecutter-django/pull/5652))
### Documentation
- Update Heroku deployment guide ([#5656](https://github.com/cookiecutter/cookiecutter-django/pull/5656))
## 2025.01.24
### Updated
- Update ruff to 0.9.3 ([#5654](https://github.com/cookiecutter/cookiecutter-django/pull/5654))
## 2025.01.21
### Changed
- Update linter error code from TCH to TC ([#5651](https://github.com/cookiecutter/cookiecutter-django/pull/5651))
### Updated
- Update pre-commit to 4.1.0 ([#5650](https://github.com/cookiecutter/cookiecutter-django/pull/5650))
## 2025.01.20
### Changed
- Group all API tests under a `tests.api` namespace ([#5615](https://github.com/cookiecutter/cookiecutter-django/pull/5615))
- Migrate post-generation hook to pathlib ([#5648](https://github.com/cookiecutter/cookiecutter-django/pull/5648))
## 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
### 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
### 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
### 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
### Updated
- Update ruff to 0.9.1 ([#5633](https://github.com/cookiecutter/cookiecutter-django/pull/5633))
## 2025.01.10
### Updated
- Update watchfiles to 1.0.4 ([#5631](https://github.com/cookiecutter/cookiecutter-django/pull/5631))
## 2025.01.09
### Changed
- Drop support for Python 2 in template generation hooks ([#5614](https://github.com/cookiecutter/cookiecutter-django/pull/5614))
### Updated
- Bump node from 22.12 to 22.13 ([#5627](https://github.com/cookiecutter/cookiecutter-django/pull/5627))
## 2025.01.07
### Fixed
- Set `minimum_pre_commit_version` in pre-commit config ([#5626](https://github.com/cookiecutter/cookiecutter-django/pull/5626))
### Updated
- Bump traefik from 3.2.3 to 3.3.0 ([#5625](https://github.com/cookiecutter/cookiecutter-django/pull/5625))
## 2025.01.06
### Changed
- Add justfile for use with docker ([#5621](https://github.com/cookiecutter/cookiecutter-django/pull/5621))
## 2025.01.04
### Updated
- Update ruff to 0.8.6 ([#5622](https://github.com/cookiecutter/cookiecutter-django/pull/5622))
## 2025.01.02
### Fixed
- Fix logging configuration for Celery tasks ([#5563](https://github.com/cookiecutter/cookiecutter-django/pull/5563))
### Updated
- Update ruff to 0.8.5 ([#5619](https://github.com/cookiecutter/cookiecutter-django/pull/5619))
- Update pillow to 11.1.0 ([#5617](https://github.com/cookiecutter/cookiecutter-django/pull/5617))
## 2024.12.27
### Updated
- Update coverage to 7.6.10 ([#5608](https://github.com/cookiecutter/cookiecutter-django/pull/5608))
- Update uvicorn-worker to 0.3.0 ([#5607](https://github.com/cookiecutter/cookiecutter-django/pull/5607))
## 2024.12.26
### Updated
- Update collectfasta to 3.2.1 ([#5606](https://github.com/cookiecutter/cookiecutter-django/pull/5606))
- Update django-allauth to 65.3.1 ([#5605](https://github.com/cookiecutter/cookiecutter-django/pull/5605))
## 2024.12.24
### Updated
- Update djlint to 1.36.4 ([#5603](https://github.com/cookiecutter/cookiecutter-django/pull/5603))
- Update uvicorn to 0.34.0 ([#5592](https://github.com/cookiecutter/cookiecutter-django/pull/5592))
## 2024.12.23
### Updated
- Bump webpack-cli from 5.1.4 to 6.0.1 ([#5601](https://github.com/cookiecutter/cookiecutter-django/pull/5601))
## 2024.12.20
### Updated
- Update ruff to 0.8.4 ([#5595](https://github.com/cookiecutter/cookiecutter-django/pull/5595))
## 2024.12.17
### Updated
- Update djangorestframework-stubs to 3.15.2 ([#5591](https://github.com/cookiecutter/cookiecutter-django/pull/5591))
- Bump traefik from 3.2.2 to 3.2.3 ([#5594](https://github.com/cookiecutter/cookiecutter-django/pull/5594))
## 2024.12.12
### Updated
- Update ruff to 0.8.3 ([#5587](https://github.com/cookiecutter/cookiecutter-django/pull/5587))
## 2024.12.11
### Updated
- Bump traefik from 3.2.1 to 3.2.2 ([#5586](https://github.com/cookiecutter/cookiecutter-django/pull/5586))
## 2024.12.10
### Updated
- Update watchfiles to 1.0.3 ([#5585](https://github.com/cookiecutter/cookiecutter-django/pull/5585))
- Bump node from 22.11 to 22.12 ([#5583](https://github.com/cookiecutter/cookiecutter-django/pull/5583))
## 2024.12.08
### Fixed
- Pin node to version 22.11 ([#5582](https://github.com/cookiecutter/cookiecutter-django/pull/5582))
### Updated
- Update ruff to 0.8.2 ([#5576](https://github.com/cookiecutter/cookiecutter-django/pull/5576))
- Update coverage to 7.6.9 ([#5581](https://github.com/cookiecutter/cookiecutter-django/pull/5581))
- Update sentry-sdk to 2.19.2 ([#5579](https://github.com/cookiecutter/cookiecutter-django/pull/5579))
- Bump python from 3.12.7 to 3.12.8 in production Docker image ([#5575](https://github.com/cookiecutter/cookiecutter-django/pull/5575))
- Bump python from 3.12.7 to 3.12.8 in local Docker image ([#5574](https://github.com/cookiecutter/cookiecutter-django/pull/5574))
- Bump python from 3.12.7 to 3.12.8 in docs Docker image ([#5573](https://github.com/cookiecutter/cookiecutter-django/pull/5573))
- Update hiredis to 3.1.0 ([#5571](https://github.com/cookiecutter/cookiecutter-django/pull/5571))
- Update redis to 5.2.1 ([#5580](https://github.com/cookiecutter/cookiecutter-django/pull/5580))
- Update django to 5.0.10 ([#5572](https://github.com/cookiecutter/cookiecutter-django/pull/5572))
- Update drf-spectacular to 0.28.0 ([#5564](https://github.com/cookiecutter/cookiecutter-django/pull/5564))
## 2024.12.03
### Updated
- Update django-upgrade to 1.22.2 ([#5567](https://github.com/cookiecutter/cookiecutter-django/pull/5567))
## 2024.12.02
### Updated
- Update pytest to 8.3.4 ([#5566](https://github.com/cookiecutter/cookiecutter-django/pull/5566))
## 2024.12.01
### Updated
- Update django-allauth to 65.3.0 ([#5565](https://github.com/cookiecutter/cookiecutter-django/pull/5565))
## 2024.11.29
### Updated
- Update ruff to 0.8.1 ([#5557](https://github.com/cookiecutter/cookiecutter-django/pull/5557))
- Update djlint to 1.36.3 ([#5558](https://github.com/cookiecutter/cookiecutter-django/pull/5558))
## 2024.11.28
### Updated
- Update djlint to 1.36.2 ([#5555](https://github.com/cookiecutter/cookiecutter-django/pull/5555))
## 2024.11.27
### Fixed
- Pin dart-sass to 1.77.6 to avoid deprecation warnings ([#5552](https://github.com/cookiecutter/cookiecutter-django/pull/5552))
### Updated
- Bump gulp-imagemin from 7.1.0 to 9.1.0 ([#5052](https://github.com/cookiecutter/cookiecutter-django/pull/5052))
- Bump gulp from 4.0.2 to 5.0.0 ([#4949](https://github.com/cookiecutter/cookiecutter-django/pull/4949))
## 2024.11.26
### Updated
- Update coverage to 7.6.8 ([#5547](https://github.com/cookiecutter/cookiecutter-django/pull/5547))
- Update watchfiles to 1.0.0 ([#5548](https://github.com/cookiecutter/cookiecutter-django/pull/5548))
## 2024.11.22
### Updated
- Update ruff to 0.8.0 ([#5545](https://github.com/cookiecutter/cookiecutter-django/pull/5545))
## 2024.11.21
### Changed
- Add support for secure Redis (TLS support) ([#5526](https://github.com/cookiecutter/cookiecutter-django/pull/5526))
### Updated
- Update sentry-sdk to 2.19.0 ([#5543](https://github.com/cookiecutter/cookiecutter-django/pull/5543))
- Update uvicorn to 0.32.1 ([#5539](https://github.com/cookiecutter/cookiecutter-django/pull/5539))
- Bump traefik from 3.2.0 to 3.2.1 ([#5541](https://github.com/cookiecutter/cookiecutter-django/pull/5541))
## 2024.11.20
### Fixed
- Fix typos in translation instructions in README ([#5538](https://github.com/cookiecutter/cookiecutter-django/pull/5538))
### Updated
- Bump amazon/aws-cli from 2.21.0 to 2.22.1 ([#5537](https://github.com/cookiecutter/cookiecutter-django/pull/5537))
## 2024.11.16
### Updated
- Update ruff to 0.7.4 ([#5531](https://github.com/cookiecutter/cookiecutter-django/pull/5531))
## 2024.11.15
### Updated
- Update coverage to 7.6.5 ([#5529](https://github.com/cookiecutter/cookiecutter-django/pull/5529))
## 2024.11.14
### Updated
- Bump amazon/aws-cli from 2.20.0 to 2.21.0 ([#5528](https://github.com/cookiecutter/cookiecutter-django/pull/5528))
## 2024.11.13
### Updated
- Update werkzeug to 3.1.3 ([#5524](https://github.com/cookiecutter/cookiecutter-django/pull/5524))
- Update ruff to 0.7.3 ([#5521](https://github.com/cookiecutter/cookiecutter-django/pull/5521))
- Bump amazon/aws-cli from 2.19.0 to 2.20.0 ([#5527](https://github.com/cookiecutter/cookiecutter-django/pull/5527))
- Update django-allauth to 65.2.0 ([#5523](https://github.com/cookiecutter/cookiecutter-django/pull/5523))
## 2024.11.08
### Updated
- Update ruff pre-commit hook to 0.7.3 ([#5522](https://github.com/cookiecutter/cookiecutter-django/pull/5522))
## 2024.11.07
### Updated
- Update djlint to 1.36.1 ([#5519](https://github.com/cookiecutter/cookiecutter-django/pull/5519))
## 2024.11.05
### Updated
- Update djlint to 1.36.0 ([#5517](https://github.com/cookiecutter/cookiecutter-django/pull/5517))
## 2024.11.04
### Updated
- Update sentry-sdk to 2.18.0 ([#5515](https://github.com/cookiecutter/cookiecutter-django/pull/5515))
## 2024.11.02
### Updated
- Update ruff to 0.7.2 ([#5510](https://github.com/cookiecutter/cookiecutter-django/pull/5510))
## 2024.11.01
### Updated
- Update djlint to 1.35.4 ([#5508](https://github.com/cookiecutter/cookiecutter-django/pull/5508))
- Bump amazon/aws-cli from 2.18.1 to 2.19.0 ([#5507](https://github.com/cookiecutter/cookiecutter-django/pull/5507))
## 2024.10.30
### Documentation
- Small spelling correction in comment ([#5502](https://github.com/cookiecutter/cookiecutter-django/pull/5502))
### Updated
- Update djlint to 1.35.3 ([#5503](https://github.com/cookiecutter/cookiecutter-django/pull/5503))
- Update whitenoise to 6.8.2 ([#5501](https://github.com/cookiecutter/cookiecutter-django/pull/5501))
## 2024.10.29
### Updated
- Update django-cors-headers to 4.6.0 ([#5499](https://github.com/cookiecutter/cookiecutter-django/pull/5499))
- Update whitenoise to 6.8.1 ([#5497](https://github.com/cookiecutter/cookiecutter-django/pull/5497))
- Bump traefik from 3.1.6 to 3.2.0 ([#5498](https://github.com/cookiecutter/cookiecutter-django/pull/5498))
## 2024.10.26
### Updated
- Update django-stubs to 5.1.1 ([#5495](https://github.com/cookiecutter/cookiecutter-django/pull/5495))
- Update mypy to 1.13.0 ([#5484](https://github.com/cookiecutter/cookiecutter-django/pull/5484))
- Update werkzeug to 3.0.6 ([#5492](https://github.com/cookiecutter/cookiecutter-django/pull/5492))
## 2024.10.25
### Updated
- Update werkzeug to 3.0.5 and unpin watchdog&lt;5 ([#5489](https://github.com/cookiecutter/cookiecutter-django/pull/5489))
## 2024.10.24
### Updated
- Update ruff to 0.7.1 ([#5487](https://github.com/cookiecutter/cookiecutter-django/pull/5487))
- Update redis to 5.2.0 ([#5486](https://github.com/cookiecutter/cookiecutter-django/pull/5486))
- Update django-allauth to 65.1.0 ([#5485](https://github.com/cookiecutter/cookiecutter-django/pull/5485))
## 2024.10.22
### Changed
- Fix broken links in generated README ([#5482](https://github.com/cookiecutter/cookiecutter-django/pull/5482))
### Updated
- Auto-update pre-commit hooks ([#5483](https://github.com/cookiecutter/cookiecutter-django/pull/5483))
## 2024.10.21
### Changed
- Remove CELERY_BROKER_URL in favor of REDIS_URL ([#4861](https://github.com/cookiecutter/cookiecutter-django/pull/4861))
### Fixed
- Fix a number of issues with Azure storage ([#5476](https://github.com/cookiecutter/cookiecutter-django/pull/5476))
### Updated
- Update coverage to 7.6.4 ([#5480](https://github.com/cookiecutter/cookiecutter-django/pull/5480))
## 2024.10.17
### Updated
- Update ruff to 0.7.0 ([#5474](https://github.com/cookiecutter/cookiecutter-django/pull/5474))
- Update uvicorn to 0.32.0 ([#5471](https://github.com/cookiecutter/cookiecutter-django/pull/5471))
- Update pillow to 11.0.0 ([#5470](https://github.com/cookiecutter/cookiecutter-django/pull/5470))
- Update sentry-sdk to 2.17.0 ([#5473](https://github.com/cookiecutter/cookiecutter-django/pull/5473))
## 2024.10.15
### Changed
- [pre-commit.ci] pre-commit autoupdate ([#5468](https://github.com/cookiecutter/cookiecutter-django/pull/5468))
## 2024.10.14
### Changed
- Add requirements for ubuntu 24.04 ([#5467](https://github.com/cookiecutter/cookiecutter-django/pull/5467))
### Updated
- Update sphinx to 8.1.3 ([#5463](https://github.com/cookiecutter/cookiecutter-django/pull/5463))
- Update coverage to 7.6.3 ([#5464](https://github.com/cookiecutter/cookiecutter-django/pull/5464))
## 2024.10.12
### Changed
- Pin Python version to 3.12 ([#5456](https://github.com/cookiecutter/cookiecutter-django/pull/5456))
### Updated
- Update sphinx to 8.1.1 ([#5457](https://github.com/cookiecutter/cookiecutter-django/pull/5457))
- Auto-update pre-commit hooks ([#5458](https://github.com/cookiecutter/cookiecutter-django/pull/5458))
- Update django-cors-headers to 4.5.0 ([#5459](https://github.com/cookiecutter/cookiecutter-django/pull/5459))
## 2024.10.11
### Changed
- Update README.md broken links ([#5454](https://github.com/cookiecutter/cookiecutter-django/pull/5454))
- wait-for-it as dependency in the run stage ([#5452](https://github.com/cookiecutter/cookiecutter-django/pull/5452))
### Updated
- Auto-update pre-commit hooks ([#5450](https://github.com/cookiecutter/cookiecutter-django/pull/5450))
## 2024.10.10
### Updated
- Update sentry-sdk to 2.16.0 ([#5444](https://github.com/cookiecutter/cookiecutter-django/pull/5444))
- Bump traefik from 3.1.5 to 3.1.6 ([#5449](https://github.com/cookiecutter/cookiecutter-django/pull/5449))
## 2024.10.09
### Updated
- Update coverage to 7.6.2 ([#5448](https://github.com/cookiecutter/cookiecutter-django/pull/5448))
## 2024.10.08
### Changed
- [pre-commit.ci] pre-commit autoupdate ([#5441](https://github.com/cookiecutter/cookiecutter-django/pull/5441))
### Updated
- Update pre-commit to 4.0.1 ([#5445](https://github.com/cookiecutter/cookiecutter-django/pull/5445))
- Bump amazon/aws-cli from 2.18.0 to 2.18.1 in /{{cookiecutter.project_slug}}/compose/production/aws ([#5443](https://github.com/cookiecutter/cookiecutter-django/pull/5443))
- Auto-update pre-commit hooks ([#5442](https://github.com/cookiecutter/cookiecutter-django/pull/5442))
## 2024.10.07

View File

@ -201,6 +201,20 @@ Listed in alphabetical order.
</td>
<td></td>
</tr>
<tr>
<td>Aidos Kanapyanov</td>
<td>
<a href="https://github.com/aidoskanapyanov">aidoskanapyanov</a>
</td>
<td></td>
</tr>
<tr>
<td>Alan Cyment</td>
<td>
<a href="https://github.com/acyment">acyment</a>
</td>
<td></td>
</tr>
<tr>
<td>Alberto Sanchez</td>
<td>
@ -544,6 +558,13 @@ Listed in alphabetical order.
</td>
<td></td>
</tr>
<tr>
<td>Christian Jensen</td>
<td>
<a href="https://github.com/jensenbox">jensenbox</a>
</td>
<td>cjensen</td>
</tr>
<tr>
<td>Christopher Clarke</td>
<td>
@ -726,6 +747,13 @@ Listed in alphabetical order.
</td>
<td></td>
</tr>
<tr>
<td>Denis Darii</td>
<td>
<a href="https://github.com/DNX">DNX</a>
</td>
<td></td>
</tr>
<tr>
<td>Denis Orehovsky</td>
<td>
@ -789,6 +817,13 @@ Listed in alphabetical order.
</td>
<td></td>
</tr>
<tr>
<td>Ed Morley</td>
<td>
<a href="https://github.com/edmorley">edmorley</a>
</td>
<td></td>
</tr>
<tr>
<td>Emanuel Calso</td>
<td>
@ -880,6 +915,13 @@ Listed in alphabetical order.
</td>
<td></td>
</tr>
<tr>
<td>Francisco Navarro Morales </td>
<td>
<a href="https://github.com/spothound">spothound</a>
</td>
<td></td>
</tr>
<tr>
<td>Freddy</td>
<td>
@ -978,6 +1020,13 @@ Listed in alphabetical order.
</td>
<td></td>
</tr>
<tr>
<td>Hana Belay</td>
<td>
<a href="https://github.com/earthcomfy">earthcomfy</a>
</td>
<td></td>
</tr>
<tr>
<td>Hana Quadara</td>
<td>
@ -1062,6 +1111,13 @@ Listed in alphabetical order.
</td>
<td></td>
</tr>
<tr>
<td>Igor Jerosimić</td>
<td>
<a href="https://github.com/igor-wl">igor-wl</a>
</td>
<td></td>
</tr>
<tr>
<td>Imran Rahman</td>
<td>
@ -1279,6 +1335,13 @@ Listed in alphabetical order.
</td>
<td></td>
</tr>
<tr>
<td>Kawsar Alam Foysal</td>
<td>
<a href="https://github.com/iamfoysal">iamfoysal</a>
</td>
<td></td>
</tr>
<tr>
<td>Keith Bailey</td>
<td>
@ -1482,6 +1545,13 @@ Listed in alphabetical order.
</td>
<td></td>
</tr>
<tr>
<td>Mariot Tsitoara</td>
<td>
<a href="https://github.com/mariot">mariot</a>
</td>
<td></td>
</tr>
<tr>
<td>Marlon Castillo</td>
<td>
@ -1818,6 +1888,13 @@ Listed in alphabetical order.
</td>
<td></td>
</tr>
<tr>
<td>Pepa</td>
<td>
<a href="https://github.com/07pepa">07pepa</a>
</td>
<td></td>
</tr>
<tr>
<td>Peter Bittner</td>
<td>
@ -1860,6 +1937,13 @@ Listed in alphabetical order.
</td>
<td></td>
</tr>
<tr>
<td>Pulse-Mind</td>
<td>
<a href="https://github.com/pulse-mind">pulse-mind</a>
</td>
<td></td>
</tr>
<tr>
<td>quroom</td>
<td>
@ -1867,6 +1951,13 @@ Listed in alphabetical order.
</td>
<td></td>
</tr>
<tr>
<td>qwerrrqw</td>
<td>
<a href="https://github.com/qwerrrqw">qwerrrqw</a>
</td>
<td></td>
</tr>
<tr>
<td>Raony Guimarães Corrêa</td>
<td>

View File

@ -13,13 +13,13 @@ Powered by [Cookiecutter](https://github.com/cookiecutter/cookiecutter), Cookiec
production-ready Django projects quickly.
- Documentation: <https://cookiecutter-django.readthedocs.io/en/latest/>
- See [Troubleshooting](https://cookiecutter-django.readthedocs.io/en/latest/troubleshooting.html) for common errors and obstacles
- See [Troubleshooting](https://cookiecutter-django.readthedocs.io/en/latest/5-help/troubleshooting.html) for common errors and obstacles
- If you have problems with Cookiecutter Django, please open [issues](https://github.com/cookiecutter/cookiecutter-django/issues/new) don't send
emails to the maintainers.
## Features
- For Django 5.0
- For Django 5.1
- Works with Python 3.12
- Renders Django projects with 100% starting test coverage
- Twitter [Bootstrap](https://github.com/twbs/bootstrap) v5
@ -51,7 +51,7 @@ _These features can be enabled during initial project setup._
## Constraints
- Only maintained 3rd party libraries are used.
- Uses PostgreSQL everywhere: 12 - 16 ([MySQL fork](https://github.com/mabdullahadeel/cookiecutter-django-mysql) also available).
- Uses PostgreSQL everywhere: 13 - 16 ([MySQL fork](https://github.com/mabdullahadeel/cookiecutter-django-mysql) also available).
- Environment variables for configuration (This won't work with Apache/mod_wsgi).
## Support this Project!
@ -94,7 +94,7 @@ You'll be prompted for some values. Provide them, then a Django project will be
**Warning**: After this point, change 'Daniel Greenfeld', 'pydanny', etc to your own information.
Answer the prompts with your own desired [options](http://cookiecutter-django.readthedocs.io/en/latest/project-generation-options.html). For example:
Answer the prompts with your own desired [options](http://cookiecutter-django.readthedocs.io/en/latest/1-getting-started/project-generation-options.html). For example:
Cloning into 'cookiecutter-django'...
remote: Counting objects: 550, done.
@ -133,8 +133,7 @@ Answer the prompts with your own desired [options](http://cookiecutter-django.re
2 - 15
3 - 14
4 - 13
5 - 12
Choose from 1, 2, 3, 4, 5 [1]: 1
Choose from 1, 2, 3, 4 [1]: 1
Select cloud_provider:
1 - AWS
2 - GCP
@ -190,8 +189,8 @@ Now take a look at your repo. Don't forget to carefully look at the generated RE
For local development, see the following:
- [Developing locally](http://cookiecutter-django.readthedocs.io/en/latest/developing-locally.html)
- [Developing locally using docker](http://cookiecutter-django.readthedocs.io/en/latest/developing-locally-docker.html)
- [Developing locally](https://cookiecutter-django.readthedocs.io/en/latest/2-local-development/developing-locally.html)
- [Developing locally using docker](https://cookiecutter-django.readthedocs.io/en/latest/2-local-development/developing-locally-docker.html)
## Community

View File

@ -18,7 +18,7 @@
"windows": "n",
"editor": ["None", "PyCharm", "VS Code"],
"use_docker": "n",
"postgresql_version": ["16", "15", "14", "13", "12"],
"postgresql_version": ["16", "15", "14", "13"],
"cloud_provider": ["AWS", "GCP", "Azure", "None"],
"mail_service": [
"Mailgun",

View File

@ -70,7 +70,6 @@ postgresql_version:
2. 15
3. 14
4. 13
5. 12
cloud_provider:
Select a cloud provider for static & media files. The choices are:

View File

@ -39,7 +39,6 @@ The following table lists settings and their defaults for third-party applicatio
======================================= =========================== ============================================== ======================================================================
Environment Variable Django Setting Development Default Production Default
======================================= =========================== ============================================== ======================================================================
CELERY_BROKER_URL CELERY_BROKER_URL auto w/ Docker; raises error w/o raises error
DJANGO_AWS_ACCESS_KEY_ID AWS_ACCESS_KEY_ID n/a raises error
DJANGO_AWS_SECRET_ACCESS_KEY AWS_SECRET_ACCESS_KEY n/a raises error
DJANGO_AWS_STORAGE_BUCKET_NAME AWS_STORAGE_BUCKET_NAME n/a raises error

View File

@ -242,6 +242,41 @@ The stack comes with a dedicated node service to build the static assets, watch
.. _Sass: https://sass-lang.com/
.. _live reloading: https://browsersync.io
Using Just for Docker Commands
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We have included a ``justfile`` to simplify the use of frequent Docker commands for local development.
.. warning::
Currently, "Just" does not reliably handle signals or forward them to its subprocesses. As a result,
pressing CTRL+C (or sending other signals like SIGTERM, SIGINT, or SIGHUP) may only interrupt
"Just" itself rather than its subprocesses.
For more information, see `this GitHub issue <https://github.com/casey/just/issues/2473>`_.
First, install Just using one of the methods described in the `official documentation <https://just.systems/man/en/packages.html>`_.
Here are the available commands:
- ``just build``
Builds the Python image using the local Docker Compose file.
- ``just up``
Starts the containers in detached mode and removes orphaned containers.
- ``just down``
Stops the running containers.
- ``just prune``
Stops and removes containers along with their volumes. You can optionally pass an argument with the service name to prune a single container.
- ``just logs``
Shows container logs. You can optionally pass an argument with the service name to view logs for a specific service.
- ``just manage <command>``
Runs Django management commands within the container. Replace ``<command>`` with any valid Django management command, such as ``migrate``, ``createsuperuser``, or ``shell``.
(Optionally) Developing locally with HTTPS
------------------------------------------

View File

@ -55,8 +55,6 @@ First things first.
#. Set the environment variables for your database(s): ::
$ export DATABASE_URL=postgres://postgres:<password>@127.0.0.1:5432/<DB name given to createdb>
# Optional: set broker URL if using Celery
$ export CELERY_BROKER_URL=redis://localhost:6379/0
.. note::

View File

@ -14,6 +14,7 @@ Run these commands to deploy the project to Heroku:
# Note: this is not a free plan
heroku addons:create heroku-postgresql:essential-0
# On Windows use double quotes for the time zone, e.g.
# heroku pg:backups schedule --at "02:00 America/Los_Angeles" DATABASE_URL
heroku pg:backups schedule --at '02:00 America/Los_Angeles' DATABASE_URL
@ -24,10 +25,6 @@ Run these commands to deploy the project to Heroku:
# Assuming you chose Mailgun as mail service (see below for others)
heroku addons:create mailgun:starter
heroku config:set PYTHONHASHSEED=random
heroku config:set WEB_CONCURRENCY=4
heroku config:set DJANGO_DEBUG=False
heroku config:set DJANGO_SETTINGS_MODULE=config.settings.production
heroku config:set DJANGO_SECRET_KEY="$(openssl rand -base64 64)"
@ -86,8 +83,6 @@ it's in the ``Procfile``, but is turned off by default:
.. code-block:: bash
# Set the broker URL to Redis
heroku config:set CELERY_BROKER_URL=`heroku config:get REDIS_URL`
# Scale dyno to 1 instance
heroku ps:scale worker=1

View File

@ -188,7 +188,7 @@ latex_documents = [
"cookiecutter-django Documentation",
"cookiecutter-django",
"manual",
)
),
]
# The name of an image file (relative to this directory) to place at the top of
@ -223,7 +223,7 @@ man_pages = [
"Cookiecutter Django documentation",
["Daniel Roy Greenfeld"],
1,
)
),
]
# If true, show URL addresses after external links.
@ -242,7 +242,7 @@ texinfo_documents = [
"Cookiecutter Django documentation",
"Daniel Roy Greenfeld",
"Cookiecutter Django",
"A Cookiecutter template for creating production-ready " "Django projects quickly.",
"A Cookiecutter template for creating production-ready Django projects quickly.",
"Miscellaneous",
)
]

View File

@ -1,21 +1,8 @@
"""
NOTE:
the below code is to be maintained Python 2.x-compatible
as the whole Cookiecutter Django project initialization
can potentially be run in Python 2.x environment
(at least so we presume in `pre_gen_project.py`).
TODO: restrict Cookiecutter Django project initialization to
Python 3.x environments only
"""
from __future__ import print_function
import json
import os
import random
import shutil
import string
from pathlib import Path
try:
# Inspired by
@ -37,40 +24,28 @@ DEBUG_VALUE = "debug"
def remove_open_source_files():
file_names = ["CONTRIBUTORS.txt", "LICENSE"]
for file_name in file_names:
os.remove(file_name)
Path(file_name).unlink()
def remove_gplv3_files():
file_names = ["COPYING"]
for file_name in file_names:
os.remove(file_name)
Path(file_name).unlink()
def remove_custom_user_manager_files():
os.remove(
os.path.join(
"{{cookiecutter.project_slug}}",
"users",
"managers.py",
)
)
os.remove(
os.path.join(
"{{cookiecutter.project_slug}}",
"users",
"tests",
"test_managers.py",
)
)
users_path = Path("{{cookiecutter.project_slug}}", "users")
(users_path / "managers.py").unlink()
(users_path / "tests" / "test_managers.py").unlink()
def remove_pycharm_files():
idea_dir_path = ".idea"
if os.path.exists(idea_dir_path):
idea_dir_path = Path(".idea")
if idea_dir_path.exists():
shutil.rmtree(idea_dir_path)
docs_dir_path = os.path.join("docs", "pycharm")
if os.path.exists(docs_dir_path):
docs_dir_path = Path("docs", "pycharm")
if docs_dir_path.exists():
shutil.rmtree(docs_dir_path)
@ -82,13 +57,18 @@ def remove_docker_files():
"docker-compose.local.yml",
"docker-compose.production.yml",
".dockerignore",
"justfile",
]
for file_name in file_names:
os.remove(file_name)
Path(file_name).unlink()
if "{{ cookiecutter.editor }}" == "PyCharm":
file_names = ["docker_compose_up_django.xml", "docker_compose_up_docs.xml"]
for file_name in file_names:
os.remove(os.path.join(".idea", "runConfigurations", file_name))
Path(".idea", "runConfigurations", file_name).unlink()
def remove_nginx_docker_files():
shutil.rmtree(Path("compose", "production", "nginx"))
def remove_utility_files():
@ -96,23 +76,23 @@ def remove_utility_files():
def remove_heroku_files():
file_names = ["Procfile", "runtime.txt", "requirements.txt"]
file_names = ["Procfile", "requirements.txt"]
for file_name in file_names:
if file_name == "requirements.txt" and "{{ cookiecutter.ci_tool }}".lower() == "travis":
# don't remove the file if we are using travisci but not using heroku
continue
os.remove(file_name)
Path(file_name).unlink()
shutil.rmtree("bin")
def remove_sass_files():
shutil.rmtree(os.path.join("{{cookiecutter.project_slug}}", "static", "sass"))
shutil.rmtree(Path("{{cookiecutter.project_slug}}", "static", "sass"))
def remove_gulp_files():
file_names = ["gulpfile.js"]
file_names = ["gulpfile.mjs"]
for file_name in file_names:
os.remove(file_name)
Path(file_name).unlink()
def remove_webpack_files():
@ -121,36 +101,30 @@ def remove_webpack_files():
def remove_vendors_js():
vendors_js_path = os.path.join(
"{{ cookiecutter.project_slug }}",
"static",
"js",
"vendors.js",
)
if os.path.exists(vendors_js_path):
os.remove(vendors_js_path)
vendors_js_path = Path("{{ cookiecutter.project_slug }}", "static", "js", "vendors.js")
if vendors_js_path.exists():
vendors_js_path.unlink()
def remove_packagejson_file():
file_names = ["package.json"]
for file_name in file_names:
os.remove(file_name)
Path(file_name).unlink()
def update_package_json(remove_dev_deps=None, remove_keys=None, scripts=None):
remove_dev_deps = remove_dev_deps or []
remove_keys = remove_keys or []
scripts = scripts or {}
with open("package.json", mode="r") as fd:
content = json.load(fd)
package_json = Path("package.json")
content = json.loads(package_json.read_text())
for package_name in remove_dev_deps:
content["devDependencies"].pop(package_name)
for key in remove_keys:
content.pop(key)
content["scripts"].update(scripts)
with open("package.json", mode="w") as fd:
json.dump(content, fd, ensure_ascii=False, indent=2)
fd.write("\n")
updated_content = json.dumps(content, ensure_ascii=False, indent=2) + "\n"
package_json.write_text(updated_content)
def handle_js_runner(choice, use_docker, use_async):
@ -175,7 +149,7 @@ def handle_js_runner(choice, use_docker, use_async):
remove_keys=["babel"],
scripts={
"dev": "gulp",
"build": "gulp generate-assets",
"build": "gulp build",
},
)
remove_webpack_files()
@ -214,8 +188,8 @@ def handle_js_runner(choice, use_docker, use_async):
def remove_prettier_pre_commit():
with open(".pre-commit-config.yaml", "r") as fd:
content = fd.readlines()
pre_commit_yaml = Path(".pre-commit-config.yaml")
content = pre_commit_yaml.read_text().splitlines()
removing = False
new_lines = []
@ -227,35 +201,34 @@ def remove_prettier_pre_commit():
if not removing:
new_lines.append(line)
with open(".pre-commit-config.yaml", "w") as fd:
fd.writelines(new_lines)
pre_commit_yaml.write_text("\n".join(new_lines))
def remove_celery_files():
file_names = [
os.path.join("config", "celery_app.py"),
os.path.join("{{ cookiecutter.project_slug }}", "users", "tasks.py"),
os.path.join("{{ cookiecutter.project_slug }}", "users", "tests", "test_tasks.py"),
file_paths = [
Path("config", "celery_app.py"),
Path("{{ cookiecutter.project_slug }}", "users", "tasks.py"),
Path("{{ cookiecutter.project_slug }}", "users", "tests", "test_tasks.py"),
]
for file_name in file_names:
os.remove(file_name)
for file_path in file_paths:
file_path.unlink()
def remove_async_files():
file_names = [
os.path.join("config", "asgi.py"),
os.path.join("config", "websocket.py"),
file_paths = [
Path("config", "asgi.py"),
Path("config", "websocket.py"),
]
for file_name in file_names:
os.remove(file_name)
for file_path in file_paths:
file_path.unlink()
def remove_dottravisyml_file():
os.remove(".travis.yml")
Path(".travis.yml").unlink()
def remove_dotgitlabciyml_file():
os.remove(".gitlab-ci.yml")
Path(".gitlab-ci.yml").unlink()
def remove_dotgithub_folder():
@ -263,7 +236,7 @@ def remove_dotgithub_folder():
def remove_dotdrone_file():
os.remove(".drone.yml")
Path(".drone.yml").unlink()
def generate_random_string(length, using_digits=False, using_ascii_letters=False, using_punctuation=False):
@ -289,7 +262,7 @@ def generate_random_string(length, using_digits=False, using_ascii_letters=False
return "".join([random.choice(symbols) for _ in range(length)])
def set_flag(file_path, flag, value=None, formatted=None, *args, **kwargs):
def set_flag(file_path: Path, flag, value=None, formatted=None, *args, **kwargs):
if value is None:
random_string = generate_random_string(*args, **kwargs)
if random_string is None:
@ -302,7 +275,7 @@ def set_flag(file_path, flag, value=None, formatted=None, *args, **kwargs):
random_string = formatted.format(random_string)
value = random_string
with open(file_path, "r+") as f:
with file_path.open("r+") as f:
file_contents = f.read().replace(flag, value)
f.seek(0)
f.write(file_contents)
@ -311,7 +284,7 @@ def set_flag(file_path, flag, value=None, formatted=None, *args, **kwargs):
return value
def set_django_secret_key(file_path):
def set_django_secret_key(file_path: Path):
django_secret_key = set_flag(
file_path,
"!!!SET DJANGO_SECRET_KEY!!!",
@ -322,7 +295,7 @@ def set_django_secret_key(file_path):
return django_secret_key
def set_django_admin_url(file_path):
def set_django_admin_url(file_path: Path):
django_admin_url = set_flag(
file_path,
"!!!SET DJANGO_ADMIN_URL!!!",
@ -377,16 +350,16 @@ def set_celery_flower_password(file_path, value=None):
def append_to_gitignore_file(ignored_line):
with open(".gitignore", "a") as gitignore_file:
with Path(".gitignore").open("a") as gitignore_file:
gitignore_file.write(ignored_line)
gitignore_file.write("\n")
def set_flags_in_envs(postgres_user, celery_flower_user, debug=False):
local_django_envs_path = os.path.join(".envs", ".local", ".django")
production_django_envs_path = os.path.join(".envs", ".production", ".django")
local_postgres_envs_path = os.path.join(".envs", ".local", ".postgres")
production_postgres_envs_path = os.path.join(".envs", ".production", ".postgres")
local_django_envs_path = Path(".envs", ".local", ".django")
production_django_envs_path = Path(".envs", ".production", ".django")
local_postgres_envs_path = Path(".envs", ".local", ".postgres")
production_postgres_envs_path = Path(".envs", ".production", ".postgres")
set_django_secret_key(production_django_envs_path)
set_django_admin_url(production_django_envs_path)
@ -403,35 +376,33 @@ def set_flags_in_envs(postgres_user, celery_flower_user, debug=False):
def set_flags_in_settings_files():
set_django_secret_key(os.path.join("config", "settings", "local.py"))
set_django_secret_key(os.path.join("config", "settings", "test.py"))
set_django_secret_key(Path("config", "settings", "local.py"))
set_django_secret_key(Path("config", "settings", "test.py"))
def remove_envs_and_associated_files():
shutil.rmtree(".envs")
os.remove("merge_production_dotenvs_in_dotenv.py")
Path("merge_production_dotenvs_in_dotenv.py").unlink()
shutil.rmtree("tests")
def remove_celery_compose_dirs():
shutil.rmtree(os.path.join("compose", "local", "django", "celery"))
shutil.rmtree(os.path.join("compose", "production", "django", "celery"))
shutil.rmtree(Path("compose", "local", "django", "celery"))
shutil.rmtree(Path("compose", "production", "django", "celery"))
def remove_node_dockerfile():
shutil.rmtree(os.path.join("compose", "local", "node"))
shutil.rmtree(Path("compose", "local", "node"))
def remove_aws_dockerfile():
shutil.rmtree(os.path.join("compose", "production", "aws"))
shutil.rmtree(Path("compose", "production", "aws"))
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"))
Path("config", "api_router.py").unlink()
shutil.rmtree(Path("{{cookiecutter.project_slug}}", "users", "api"))
shutil.rmtree(Path("{{cookiecutter.project_slug}}", "users", "tests", "api"))
def main():
@ -457,6 +428,8 @@ def main():
if "{{ cookiecutter.use_docker }}".lower() == "y":
remove_utility_files()
if "{{ cookiecutter.cloud_provider }}".lower() != "none":
remove_nginx_docker_files()
else:
remove_docker_files()

View File

@ -1,15 +1,3 @@
"""
NOTE:
the below code is to be maintained Python 2.x-compatible
as the whole Cookiecutter Django project initialization
can potentially be run in Python 2.x environment.
TODO: restrict Cookiecutter Django project initialization
to Python 3.x environments only
"""
from __future__ import print_function
import sys
TERMINATOR = "\x1b[0m"
@ -34,36 +22,10 @@ assert project_slug == project_slug.lower(), "'{}' project slug should be all lo
assert "\\" not in "{{ cookiecutter.author_name }}", "Don't include backslashes in author name."
if "{{ cookiecutter.use_docker }}".lower() == "n":
python_major_version = sys.version_info[0]
if python_major_version == 2:
print(
WARNING + "You're running cookiecutter under Python 2, but the generated "
"project requires Python 3.12+. Do you want to proceed (y/n)? " + TERMINATOR
)
yes_options, no_options = frozenset(["y"]), frozenset(["n"])
while True:
choice = raw_input().lower() # noqa: F821
if choice in yes_options:
break
elif choice in no_options:
print(INFO + "Generation process stopped as requested." + TERMINATOR)
sys.exit(1)
else:
print(
HINT
+ "Please respond with {} or {}: ".format(
", ".join(["'{}'".format(o) for o in yes_options if not o == ""]),
", ".join(["'{}'".format(o) for o in no_options if not o == ""]),
)
+ TERMINATOR
)
if "{{ cookiecutter.use_whitenoise }}".lower() == "n" and "{{ cookiecutter.cloud_provider }}" == "None":
print("You should either use Whitenoise or select a " "Cloud Provider to serve static files")
print("You should either use Whitenoise or select a Cloud Provider to serve static files")
sys.exit(1)
if "{{ cookiecutter.mail_service }}" == "Amazon SES" and "{{ cookiecutter.cloud_provider }}" != "AWS":
print("You should either use AWS or select a different " "Mail Service for sending emails.")
print("You should either use AWS or select a different Mail Service for sending emails.")
sys.exit(1)

View File

@ -1,6 +1,6 @@
[project]
name = "cookiecutter-django"
version = "2024.10.07"
version = "2025.04.05"
description = "A Cookiecutter template for creating production-ready Django projects quickly."
readme = "README.md"
keywords = [
@ -14,7 +14,7 @@ license = { text = "BSD" }
authors = [
{ name = "Daniel Roy Greenfeld", email = "pydanny@gmail.com" },
]
requires-python = ">=3.12"
requires-python = ">=3.12,<3.13"
classifiers = [
"Development Status :: 4 - Beta",
"Environment :: Console",
@ -31,30 +31,32 @@ classifiers = [
dependencies = [
"binaryornot==0.4.4",
"cookiecutter==2.6",
"django-upgrade==1.21",
"djlint==1.35.2",
"django-upgrade==1.22.2",
"djlint==1.36.4",
"gitpython==3.1.43",
"jinja2==3.1.4",
"pre-commit==3.8",
"pygithub==2.4",
"pytest==8.3.3",
"jinja2==3.1.5",
"pre-commit==4.1.0",
"pygithub==2.5",
"pytest==8.3.4",
"pytest-cookies==0.7",
"pytest-instafail==0.5",
"pytest-xdist==3.6.1",
"pyyaml==6.0.2",
"requests==2.32.3",
"ruff==0.6.9",
"sh==2.0.7; sys_platform!='win23'",
"tox==4.21.2",
"tox-uv>=1.11.2",
"ruff==0.11.4",
"sh==2.1; sys_platform!='win23'",
"tox==4.23.2",
"tox-uv>=1.17",
]
optional-dependencies.docs = [
urls = { Repository = "https://github.com/cookiecutter/cookiecutter-django" }
[dependency-groups]
docs = [
"myst-parser>=4",
"sphinx>=8.0.2",
"sphinx-autobuild>=2024.10.3",
"sphinx-rtd-theme>=3",
]
urls = { Repository = "https://github.com/cookiecutter/cookiecutter-django" }
[tool.black]
line-length = 119
@ -73,6 +75,9 @@ known_first_party = [
"hooks",
]
[tool.pyproject-fmt]
keep_full_version = true
# ==== pytest ====
[tool.pytest.ini_options]

View File

@ -12,7 +12,6 @@ from __future__ import annotations
import os
import re
import sys
from collections.abc import Iterable
from pathlib import Path
from typing import TYPE_CHECKING, Any, NamedTuple
@ -20,6 +19,8 @@ import requests
from github import Github
if TYPE_CHECKING:
from collections.abc import Iterable
from github.Issue import Issue
CURRENT_FILE = Path(__file__)
@ -83,7 +84,7 @@ def get_name_and_version(requirements_line: str) -> tuple[str, ...]:
def get_all_latest_django_versions(
django_max_version: tuple[DjVersion] = None,
django_max_version: tuple[DjVersion] | None = None,
) -> tuple[DjVersion, list[DjVersion]]:
"""
Grabs all Django versions that are worthy of a GitHub issue.
@ -221,8 +222,7 @@ class GitHubManager:
if supported_dj_versions:
if any(v >= needed_dj_version for v in supported_dj_versions):
return package_info["info"]["version"], ""
else:
return "", ""
return "", ""
# Django classifier DNE; assume it isn't a Django lib
# Great exceptions include pylint-django, where we need to do this manually...

69
scripts/node_version.py Normal file
View File

@ -0,0 +1,69 @@
from __future__ import annotations
import json
from pathlib import Path
ROOT = Path(__file__).parent.parent
TEMPLATED_ROOT = ROOT / "{{cookiecutter.project_slug}}"
DOCKERFILE = TEMPLATED_ROOT / "compose" / "local" / "node" / "Dockerfile"
PROD_DOCKERFILE = TEMPLATED_ROOT / "compose" / "production" / "django" / "Dockerfile"
PACKAGE_JSON = TEMPLATED_ROOT / "package.json"
CI_YML = ROOT / ".github" / "workflows" / "ci.yml"
def main() -> None:
new_version = get_version_from_dockerfile()
old_version = get_version_from_package_json()
if old_version != new_version:
update_package_json_version(old_version, new_version)
update_ci_node_version(old_version, new_version)
update_production_node_version(old_version, new_version)
def get_version_from_dockerfile() -> str:
# Extract version out of base image name:
# FROM docker.io/node:22.13-bookworm-slim
# -> 22.13
with DOCKERFILE.open("r") as f:
for line in f:
if "FROM docker.io/node:" in line:
_, _, docker_tag = line.partition(":")
version_str, _, _ = docker_tag.partition("-")
return version_str
raise RuntimeError("Could not find version in Dockerfile")
def get_version_from_package_json() -> str:
package_json = json.loads(PACKAGE_JSON.read_text())
return package_json["engines"]["node"]
def update_package_json_version(old_version: str, new_version: str) -> None:
package_json_text = PACKAGE_JSON.read_text()
package_json_text = package_json_text.replace(
f'"node": "{old_version}"',
f'"node": "{new_version}"',
)
PACKAGE_JSON.write_text(package_json_text)
def update_ci_node_version(old_version: str, new_version: str) -> None:
yml_content = CI_YML.read_text()
yml_content = yml_content.replace(
f'node-version: "{old_version}"',
f'node-version: "{new_version}"',
)
CI_YML.write_text(yml_content)
def update_production_node_version(old_version: str, new_version: str) -> None:
dockerfile_content = PROD_DOCKERFILE.read_text()
dockerfile_content = dockerfile_content.replace(
f"FROM docker.io/node:{old_version}",
f"FROM docker.io/node:{new_version}",
)
PROD_DOCKERFILE.write_text(dockerfile_content)
if __name__ == "__main__":
main()

56
scripts/ruff_version.py Normal file
View File

@ -0,0 +1,56 @@
from __future__ import annotations
import subprocess
import tomllib
from pathlib import Path
ROOT = Path(__file__).parent.parent
TEMPLATED_ROOT = ROOT / "{{cookiecutter.project_slug}}"
REQUIREMENTS_LOCAL_TXT = TEMPLATED_ROOT / "requirements" / "local.txt"
PRE_COMMIT_CONFIG = TEMPLATED_ROOT / ".pre-commit-config.yaml"
PYPROJECT_TOML = ROOT / "pyproject.toml"
def main() -> None:
new_version = get_requirements_txt_version()
old_version = get_pyproject_toml_version()
if old_version == new_version:
return
update_ruff_version(old_version, new_version)
subprocess.run(["uv", "lock", "--no-upgrade"], cwd=ROOT)
def get_requirements_txt_version() -> str:
content = REQUIREMENTS_LOCAL_TXT.read_text()
for line in content.split("\n"):
if line.startswith("ruff"):
return line.split(" ")[0].split("==")[1]
raise RuntimeError("Could not find ruff version in requirements/local.txt")
def get_pyproject_toml_version() -> str:
data = tomllib.loads(PYPROJECT_TOML.read_text())
for dependency in data["project"]["dependencies"]:
if dependency.startswith("ruff=="):
return dependency.split("==")[1]
raise RuntimeError("Could not find ruff version in pyproject.toml")
def update_ruff_version(old_version: str, new_version: str) -> None:
# Update pyproject.toml
new_content = PYPROJECT_TOML.read_text().replace(
f"ruff=={old_version}",
f"ruff=={new_version}",
)
PYPROJECT_TOML.write_text(new_content)
# Update pre-commit config
new_content = PRE_COMMIT_CONFIG.read_text().replace(
f"repo: https://github.com/astral-sh/ruff-pre-commit\n rev: v{old_version}",
f"repo: https://github.com/astral-sh/ruff-pre-commit\n rev: v{new_version}",
)
PRE_COMMIT_CONFIG.write_text(new_content)
if __name__ == "__main__":
main()

View File

@ -1,6 +1,7 @@
import datetime as dt
import os
import re
import subprocess
from collections.abc import Iterable
from pathlib import Path
@ -51,8 +52,12 @@ def main() -> None:
update_version(setup_py_path, release)
print(f"Updated version in {setup_py_path}")
# Run uv lock
uv_lock_path = ROOT / "uv.lock"
subprocess.run(["uv", "lock", "--no-upgrade"], cwd=ROOT)
# Commit changes, create tag and push
update_git_repo([changelog_path, setup_py_path], release)
update_git_repo([changelog_path, setup_py_path, uv_lock_path], release)
# Create GitHub release
github_release = repo.create_git_release(

View File

@ -2,6 +2,8 @@ import glob
import os
import re
import sys
from collections.abc import Iterable
from pathlib import Path
import pytest
@ -61,7 +63,6 @@ SUPPORTED_COMBINATIONS = [
{"postgresql_version": "15"},
{"postgresql_version": "14"},
{"postgresql_version": "13"},
{"postgresql_version": "12"},
{"cloud_provider": "AWS", "use_whitenoise": "y"},
{"cloud_provider": "AWS", "use_whitenoise": "n"},
{"cloud_provider": "GCP", "use_whitenoise": "y"},
@ -146,19 +147,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 +174,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)
@ -271,7 +272,7 @@ def test_djlint_check_passes(cookies, context_override):
@pytest.mark.parametrize(
["use_docker", "expected_test_script"],
("use_docker", "expected_test_script"),
[
("n", "pytest"),
("y", "docker compose -f docker-compose.local.yml run django pytest"),
@ -286,7 +287,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 ."]
@ -296,7 +297,7 @@ def test_travis_invokes_pytest(cookies, context, use_docker, expected_test_scrip
@pytest.mark.parametrize(
["use_docker", "expected_test_script"],
("use_docker", "expected_test_script"),
[
("n", "pytest"),
("y", "docker compose -f docker-compose.local.yml run django pytest"),
@ -311,11 +312,11 @@ 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"] == [
"pre-commit run --show-diff-on-failure --color=always --all-files"
"pre-commit run --show-diff-on-failure --color=always --all-files",
]
assert gitlab_config["pytest"]["script"] == [expected_test_script]
except yaml.YAMLError as e:
@ -323,7 +324,7 @@ def test_gitlab_invokes_precommit_and_pytest(cookies, context, use_docker, expec
@pytest.mark.parametrize(
["use_docker", "expected_test_script"],
("use_docker", "expected_test_script"),
[
("n", "pytest"),
("y", "docker compose -f docker-compose.local.yml run django pytest"),
@ -338,7 +339,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
@ -378,7 +379,7 @@ def test_error_if_incompatible(cookies, context, invalid_context):
@pytest.mark.parametrize(
["editor", "pycharm_docs_exist"],
("editor", "pycharm_docs_exist"),
[
("None", False),
("PyCharm", True),
@ -389,9 +390,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):
@ -401,7 +402,7 @@ def test_trim_domain_email(cookies, context):
"use_docker": "y",
"domain_name": " example.com ",
"email": " me@example.com ",
}
},
)
result = cookies.bake(extra_context=context)

View File

@ -18,22 +18,21 @@ cd my_awesome_project
docker compose -f docker-compose.local.yml build
# run the project's type checks
docker compose -f docker-compose.local.yml run django mypy my_awesome_project
docker compose -f docker-compose.local.yml run --rm django mypy my_awesome_project
# run the project's tests
docker compose -f docker-compose.local.yml run django pytest
docker compose -f docker-compose.local.yml run --rm django pytest
# return non-zero status code if there are migrations that have not been created
docker compose -f docker-compose.local.yml run django python manage.py makemigrations --check || { echo "ERROR: there were changes in the models, but migration listed above have not been created and are not saved in version control"; exit 1; }
docker compose -f docker-compose.local.yml run --rm django python manage.py makemigrations --check || { echo "ERROR: there were changes in the models, but migration listed above have not been created and are not saved in version control"; exit 1; }
# Test support for translations
docker compose -f docker-compose.local.yml run django python manage.py makemessages --all
docker compose -f docker-compose.local.yml run --rm django python manage.py makemessages --all
# Make sure the check doesn't raise any warnings
docker compose -f docker-compose.local.yml run \
docker compose -f docker-compose.local.yml run --rm \
-e DJANGO_SECRET_KEY="$(openssl rand -base64 64)" \
-e REDIS_URL=redis://redis:6379/0 \
-e CELERY_BROKER_URL=redis://redis:6379/0 \
-e DJANGO_AWS_ACCESS_KEY_ID=x \
-e DJANGO_AWS_SECRET_ACCESS_KEY=x \
-e DJANGO_AWS_STORAGE_BUCKET_NAME=x \
@ -43,10 +42,10 @@ docker compose -f docker-compose.local.yml run \
django python manage.py check --settings=config.settings.production --deploy --database default --fail-level WARNING
# Generate the HTML for the documentation
docker compose -f docker-compose.docs.yml run docs make html
docker compose -f docker-compose.docs.yml run --rm docs make html
# Run npm build script if package.json is present
if [ -f "package.json" ]
then
docker compose -f docker-compose.local.yml run node npm run build
docker compose -f docker-compose.local.yml run --rm node npm run build
fi

View File

@ -8,7 +8,7 @@ import pytest
from hooks.post_gen_project import append_to_gitignore_file
@pytest.fixture()
@pytest.fixture
def working_directory(tmp_path):
prev_cwd = Path.cwd()
os.chdir(tmp_path)

327
uv.lock
View File

@ -1,5 +1,5 @@
version = 1
requires-python = ">=3.12"
requires-python = "==3.12.*"
[[package]]
name = "alabaster"
@ -12,15 +12,16 @@ wheels = [
[[package]]
name = "anyio"
version = "4.6.0"
version = "4.7.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "idna" },
{ name = "sniffio" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/78/49/f3f17ec11c4a91fe79275c426658e509b07547f874b14c1a526d86a83fc8/anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb", size = 170983 }
sdist = { url = "https://files.pythonhosted.org/packages/f6/40/318e58f669b1a9e00f5c4453910682e2d9dd594334539c7b7817dabb765f/anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48", size = 177076 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/9e/ef/7a4f225581a0d7886ea28359179cb861d7fbcdefad29663fc1167b86f69f/anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a", size = 89631 },
{ url = "https://files.pythonhosted.org/packages/a0/7a/4daaf3b6c08ad7ceffea4634ec206faeff697526421c20f07628c7372156/anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352", size = 93052 },
]
[[package]]
@ -95,17 +96,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/fc/83/8353e5c9b01bb46332dac3dfb18e6c597a04ceb085c19c814c2f78a8c0d0/cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885", size = 488388 },
{ url = "https://files.pythonhosted.org/packages/73/0c/f9d5ca9a095b1fc88ef77d1f8b85d11151c374144e4606da33874e17b65b/cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492", size = 172096 },
{ url = "https://files.pythonhosted.org/packages/72/21/8c5d285fe20a6e31d29325f1287bb0e55f7d93630a5a44cafdafb5922495/cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2", size = 181478 },
{ url = "https://files.pythonhosted.org/packages/17/8f/581f2f3c3464d5f7cf87c2f7a5ba9acc6976253e02d73804240964243ec2/cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118", size = 182638 },
{ url = "https://files.pythonhosted.org/packages/8d/1c/c9afa66684b7039f48018eb11b229b659dfb32b7a16b88251bac106dd1ff/cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7", size = 178453 },
{ url = "https://files.pythonhosted.org/packages/cc/b6/1a134d479d3a5a1ff2fabbee551d1d3f1dd70f453e081b5f70d604aae4c0/cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377", size = 454441 },
{ url = "https://files.pythonhosted.org/packages/b1/b4/e1569475d63aad8042b0935dbf62ae2a54d1e9142424e2b0e924d2d4a529/cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb", size = 478543 },
{ url = "https://files.pythonhosted.org/packages/d2/40/a9ad03fbd64309dec5bb70bc803a9a6772602de0ee164d7b9a6ca5a89249/cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555", size = 485463 },
{ url = "https://files.pythonhosted.org/packages/a6/1a/f10be60e006dd9242a24bcc2b1cd55c34c578380100f742d8c610f7a5d26/cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204", size = 470854 },
{ url = "https://files.pythonhosted.org/packages/cc/b3/c035ed21aa3d39432bd749fe331ee90e4bc83ea2dbed1f71c4bc26c41084/cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f", size = 479096 },
{ url = "https://files.pythonhosted.org/packages/00/cb/6f7edde01131de9382c89430b8e253b8c8754d66b63a62059663ceafeab2/cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0", size = 484013 },
{ url = "https://files.pythonhosted.org/packages/b9/83/8e4e8c211ea940210d293e951bf06b1bfb90f2eeee590e9778e99b4a8676/cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4", size = 488119 },
{ url = "https://files.pythonhosted.org/packages/5e/52/3f7cfbc4f444cb4f73ff17b28690d12436dde665f67d68f1e1687908ab6c/cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a", size = 172122 },
{ url = "https://files.pythonhosted.org/packages/94/19/cf5baa07ee0f0e55eab7382459fbddaba0fdb0ba45973dd92556ae0d02db/cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7", size = 181504 },
]
[[package]]
@ -155,7 +145,7 @@ name = "click"
version = "8.1.7"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "platform_system == 'Windows'" },
{ name = "colorama", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 }
wheels = [
@ -192,7 +182,7 @@ wheels = [
[[package]]
name = "cookiecutter-django"
version = "2024.10.5"
version = "2025.4.5"
source = { virtual = "." }
dependencies = [
{ name = "binaryornot" },
@ -215,7 +205,7 @@ dependencies = [
{ name = "tox-uv" },
]
[package.optional-dependencies]
[package.dev-dependencies]
docs = [
{ name = "myst-parser" },
{ name = "sphinx" },
@ -227,26 +217,30 @@ docs = [
requires-dist = [
{ name = "binaryornot", specifier = "==0.4.4" },
{ name = "cookiecutter", specifier = "==2.6" },
{ name = "django-upgrade", specifier = "==1.21" },
{ name = "djlint", specifier = "==1.35.2" },
{ name = "django-upgrade", specifier = "==1.22.2" },
{ name = "djlint", specifier = "==1.36.4" },
{ name = "gitpython", specifier = "==3.1.43" },
{ name = "jinja2", specifier = "==3.1.4" },
{ name = "myst-parser", marker = "extra == 'docs'", specifier = ">=4.0.0" },
{ name = "pre-commit", specifier = "==3.8" },
{ name = "pygithub", specifier = "==2.4" },
{ name = "pytest", specifier = "==8.3.3" },
{ name = "jinja2", specifier = "==3.1.5" },
{ name = "pre-commit", specifier = "==4.1.0" },
{ name = "pygithub", specifier = "==2.5" },
{ name = "pytest", specifier = "==8.3.4" },
{ name = "pytest-cookies", specifier = "==0.7" },
{ name = "pytest-instafail", specifier = "==0.5" },
{ name = "pytest-xdist", specifier = "==3.6.1" },
{ name = "pyyaml", specifier = "==6.0.2" },
{ name = "requests", specifier = "==2.32.3" },
{ name = "ruff", specifier = "==0.6.9" },
{ name = "sh", marker = "sys_platform != 'win23'", specifier = "==2.0.7" },
{ name = "sphinx", marker = "extra == 'docs'", specifier = ">=8.0.2" },
{ name = "sphinx-autobuild", marker = "extra == 'docs'", specifier = ">=2024.10.3" },
{ name = "sphinx-rtd-theme", marker = "extra == 'docs'", specifier = ">=3.0.0" },
{ name = "tox", specifier = "==4.21.2" },
{ name = "tox-uv", specifier = ">=1.11.2" },
{ name = "ruff", specifier = "==0.11.4" },
{ name = "sh", marker = "sys_platform != 'win23'", specifier = "==2.1" },
{ name = "tox", specifier = "==4.23.2" },
{ name = "tox-uv", specifier = ">=1.17" },
]
[package.metadata.requires-dev]
docs = [
{ name = "myst-parser", specifier = ">=4" },
{ name = "sphinx", specifier = ">=8.0.2" },
{ name = "sphinx-autobuild", specifier = ">=2024.10.3" },
{ name = "sphinx-rtd-theme", specifier = ">=3" },
]
[[package]]
@ -312,26 +306,24 @@ wheels = [
[[package]]
name = "django-upgrade"
version = "1.21.0"
version = "1.22.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "tokenize-rt" },
]
sdist = { url = "https://files.pythonhosted.org/packages/2e/30/5215e526e054831cbbc454ce81fb5e825224019824a185e3c011cf199b90/django_upgrade-1.21.0.tar.gz", hash = "sha256:e65021029e7d18b407bd128a8ccb31e5e06685068b37b6b1eaf2f77aa3d3df98", size = 66708 }
sdist = { url = "https://files.pythonhosted.org/packages/f3/46/24e32ffdad682df8c273e2f434096246c89d265948a2fd214307f31eeeec/django_upgrade-1.22.2.tar.gz", hash = "sha256:8643abdde2961e3c60173ebee84f48371ffbec5181095a38cac080947af0d2ae", size = 67932 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/56/76/7a7eeb88657abf8a0f97fbab4f6600be2ec89577e3695c395b47e6860ec5/django_upgrade-1.21.0-py3-none-any.whl", hash = "sha256:a0a7b11d5108fb2d3038cea2382c1332c9be4ff5059a38357fbd28116ebf3803", size = 67796 },
{ url = "https://files.pythonhosted.org/packages/98/64/7b1432a7eca9e8e24b27ef89b9badca59add35a6dc785a63aa886b167c9d/django_upgrade-1.22.2-py3-none-any.whl", hash = "sha256:fb76b183b2e8186bb1157734083569a4b754dce2e812c2a723454bd248fb1373", size = 69114 },
]
[[package]]
name = "djlint"
version = "1.35.2"
version = "1.36.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
{ name = "colorama" },
{ name = "cssbeautifier" },
{ name = "html-tag-names" },
{ name = "html-void-elements" },
{ name = "jsbeautifier" },
{ name = "json5" },
{ name = "pathspec" },
@ -339,9 +331,13 @@ dependencies = [
{ name = "regex" },
{ name = "tqdm" },
]
sdist = { url = "https://files.pythonhosted.org/packages/a4/ee/ac8ee551ec04d5a214e62d008f40bf309574f103416482e03fb61fbad61c/djlint-1.35.2.tar.gz", hash = "sha256:318de9d4b9b0061a111f8f5164ecbacd8215f449dd4bd5a76d2a691c815ee103", size = 44684 }
sdist = { url = "https://files.pythonhosted.org/packages/74/89/ecf5be9f5c59a0c53bcaa29671742c5e269cc7d0e2622e3f65f41df251bf/djlint-1.36.4.tar.gz", hash = "sha256:17254f218b46fe5a714b224c85074c099bcb74e3b2e1f15c2ddc2cf415a408a1", size = 47849 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e0/31/297cad1a493f2910d366418acd0f33da908dfb8b16b8d6c6bafddac4fa7d/djlint-1.35.2-py3-none-any.whl", hash = "sha256:4ba995bad378f2afa77c8ea56ba1c14429d9ff26a18e8ae23bc71eedb9152243", size = 50641 },
{ url = "https://files.pythonhosted.org/packages/53/f5/9ae02b875604755d4d00cebf96b218b0faa3198edc630f56a139581aed87/djlint-1.36.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ff9faffd7d43ac20467493fa71d5355b5b330a00ade1c4d1e859022f4195223b", size = 354886 },
{ url = "https://files.pythonhosted.org/packages/97/51/284443ff2f2a278f61d4ae6ae55eaf820ad9f0fd386d781cdfe91f4de495/djlint-1.36.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:79489e262b5ac23a8dfb7ca37f1eea979674cfc2d2644f7061d95bea12c38f7e", size = 323237 },
{ url = "https://files.pythonhosted.org/packages/6d/5e/791f4c5571f3f168ad26fa3757af8f7a05c623fde1134a9c4de814ee33b7/djlint-1.36.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e58c5fa8c6477144a0be0a87273706a059e6dd0d6efae01146ae8c29cdfca675", size = 411719 },
{ url = "https://files.pythonhosted.org/packages/1f/11/894425add6f84deffcc6e373f2ce250f2f7b01aa58c7f230016ebe7a0085/djlint-1.36.4-cp312-cp312-win_amd64.whl", hash = "sha256:bb6903777bf3124f5efedcddf1f4716aef097a7ec4223fc0fa54b865829a6e08", size = 362076 },
{ url = "https://files.pythonhosted.org/packages/4b/67/f7aeea9be6fb3bd984487af8d0d80225a0b1e5f6f7126e3332d349fb13fe/djlint-1.36.4-py3-none-any.whl", hash = "sha256:e9699b8ac3057a6ed04fb90835b89bee954ed1959c01541ce4f8f729c938afdd", size = 52290 },
]
[[package]]
@ -410,24 +406,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
]
[[package]]
name = "html-tag-names"
version = "0.1.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/41/7c/8c0dc3c5650036127fb4629d31cadf6cbdd57e21a77f9793fa8b2c8a3241/html-tag-names-0.1.2.tar.gz", hash = "sha256:04924aca48770f36b5a41c27e4d917062507be05118acb0ba869c97389084297", size = 15173 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/9a/e4/242318dcaa06d8525ff72332fc15cea2cffb84c06cfc73c7da6c6b45801a/html_tag_names-0.1.2-py3-none-any.whl", hash = "sha256:eeb69ef21078486b615241f0393a72b41352c5219ee648e7c61f5632d26f0420", size = 15218 },
]
[[package]]
name = "html-void-elements"
version = "0.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/80/5c/5f17d77256bf78ca98647517fadee50575e75d812daa01352c31d89d5bf2/html-void-elements-0.1.0.tar.gz", hash = "sha256:931b88f84cd606fee0b582c28fcd00e41d7149421fb673e1e1abd2f0c4f231f0", size = 14766 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f5/0a/373f28a1cf37f8c9aa23c82cbcac7197ddea95c88b5a3eaa564cdb8de375/html_void_elements-0.1.0-py3-none-any.whl", hash = "sha256:784cf39db03cdeb017320d9301009f8f3480f9d7b254d0974272e80e0cb5e0d2", size = 14889 },
]
[[package]]
name = "identify"
version = "2.6.0"
@ -466,14 +444,14 @@ wheels = [
[[package]]
name = "jinja2"
version = "3.1.4"
version = "3.1.5"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "markupsafe" },
]
sdist = { url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", size = 240245 }
sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", size = 133271 },
{ url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 },
]
[[package]]
@ -610,7 +588,7 @@ wheels = [
[[package]]
name = "pre-commit"
version = "3.8.0"
version = "4.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cfgv" },
@ -619,9 +597,9 @@ dependencies = [
{ name = "pyyaml" },
{ name = "virtualenv" },
]
sdist = { url = "https://files.pythonhosted.org/packages/64/10/97ee2fa54dff1e9da9badbc5e35d0bbaef0776271ea5907eccf64140f72f/pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af", size = 177815 }
sdist = { url = "https://files.pythonhosted.org/packages/2a/13/b62d075317d8686071eb843f0bb1f195eb332f48869d3c31a4c6f1e063ac/pre_commit-4.1.0.tar.gz", hash = "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4", size = 193330 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/07/92/caae8c86e94681b42c246f0bca35c059a2f0529e5b92619f6aba4cf7e7b6/pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f", size = 204643 },
{ url = "https://files.pythonhosted.org/packages/43/b3/df14c580d82b9627d173ceea305ba898dca135feb360b6d84019d0803d3b/pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b", size = 220560 },
]
[[package]]
@ -635,7 +613,7 @@ wheels = [
[[package]]
name = "pygithub"
version = "2.4.0"
version = "2.5.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "deprecated" },
@ -645,9 +623,9 @@ dependencies = [
{ name = "typing-extensions" },
{ name = "urllib3" },
]
sdist = { url = "https://files.pythonhosted.org/packages/f1/a0/1e8b8ca88df9857836f5bf8e3ee15dfb810d19814ef700b12f99ce11f691/pygithub-2.4.0.tar.gz", hash = "sha256:6601e22627e87bac192f1e2e39c6e6f69a43152cfb8f307cee575879320b3051", size = 3476673 }
sdist = { url = "https://files.pythonhosted.org/packages/16/ce/aa91d30040d9552c274e7ea8bd10a977600d508d579a4bb262b95eccf961/pygithub-2.5.0.tar.gz", hash = "sha256:e1613ac508a9be710920d26eb18b1905ebd9926aa49398e88151c1b526aad3cf", size = 3552804 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/0a/f3/e185613c411757c0c18b904ea2db173f2872397eddf444a3fe8cdde47077/PyGithub-2.4.0-py3-none-any.whl", hash = "sha256:81935aa4bdc939fba98fee1cb47422c09157c56a27966476ff92775602b9ee24", size = 362599 },
{ url = "https://files.pythonhosted.org/packages/37/05/bfbdbbc5d8aafd8dae9b3b6877edca561fccd8528ef5edc4e7b6d23721b5/PyGithub-2.5.0-py3-none-any.whl", hash = "sha256:b0b635999a658ab8e08720bdd3318893ff20e2275f6446fcf35bf3f44f2c0fd2", size = 375935 },
]
[[package]]
@ -707,7 +685,7 @@ wheels = [
[[package]]
name = "pytest"
version = "8.3.3"
version = "8.3.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
@ -715,9 +693,9 @@ dependencies = [
{ name = "packaging" },
{ name = "pluggy" },
]
sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 }
sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341 },
{ url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 },
]
[[package]]
@ -797,15 +775,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 },
{ url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 },
{ url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 },
{ url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 },
{ url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 },
{ url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 },
{ url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 },
{ url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 },
{ url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 },
{ url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 },
{ url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 },
{ url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 },
]
[[package]]
@ -861,36 +830,36 @@ wheels = [
[[package]]
name = "ruff"
version = "0.6.9"
version = "0.11.4"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/26/0d/6148a48dab5662ca1d5a93b7c0d13c03abd3cc7e2f35db08410e47cef15d/ruff-0.6.9.tar.gz", hash = "sha256:b076ef717a8e5bc819514ee1d602bbdca5b4420ae13a9cf61a0c0a4f53a2baa2", size = 3095355 }
sdist = { url = "https://files.pythonhosted.org/packages/e8/5b/3ae20f89777115944e89c2d8c2e795dcc5b9e04052f76d5347e35e0da66e/ruff-0.11.4.tar.gz", hash = "sha256:f45bd2fb1a56a5a85fae3b95add03fb185a0b30cf47f5edc92aa0355ca1d7407", size = 3933063 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6e/8f/f7a0a0ef1818662efb32ed6df16078c95da7a0a3248d64c2410c1e27799f/ruff-0.6.9-py3-none-linux_armv6l.whl", hash = "sha256:064df58d84ccc0ac0fcd63bc3090b251d90e2a372558c0f057c3f75ed73e1ccd", size = 10440526 },
{ url = "https://files.pythonhosted.org/packages/8b/69/b179a5faf936a9e2ab45bb412a668e4661eded964ccfa19d533f29463ef6/ruff-0.6.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:140d4b5c9f5fc7a7b074908a78ab8d384dd7f6510402267bc76c37195c02a7ec", size = 10034612 },
{ url = "https://files.pythonhosted.org/packages/c7/ef/fd1b4be979c579d191eeac37b5cfc0ec906de72c8bcd8595e2c81bb700c1/ruff-0.6.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53fd8ca5e82bdee8da7f506d7b03a261f24cd43d090ea9db9a1dc59d9313914c", size = 9706197 },
{ url = "https://files.pythonhosted.org/packages/29/61/b376d775deb5851cb48d893c568b511a6d3625ef2c129ad5698b64fb523c/ruff-0.6.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645d7d8761f915e48a00d4ecc3686969761df69fb561dd914a773c1a8266e14e", size = 10751855 },
{ url = "https://files.pythonhosted.org/packages/13/d7/def9e5f446d75b9a9c19b24231a3a658c075d79163b08582e56fa5dcfa38/ruff-0.6.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eae02b700763e3847595b9d2891488989cac00214da7f845f4bcf2989007d577", size = 10200889 },
{ url = "https://files.pythonhosted.org/packages/6c/d6/7f34160818bcb6e84ce293a5966cba368d9112ff0289b273fbb689046047/ruff-0.6.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d5ccc9e58112441de8ad4b29dcb7a86dc25c5f770e3c06a9d57e0e5eba48829", size = 11038678 },
{ url = "https://files.pythonhosted.org/packages/13/34/a40ff8ae62fb1b26fb8e6fa7e64bc0e0a834b47317880de22edd6bfb54fb/ruff-0.6.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:417b81aa1c9b60b2f8edc463c58363075412866ae4e2b9ab0f690dc1e87ac1b5", size = 11808682 },
{ url = "https://files.pythonhosted.org/packages/2e/6d/25a4386ae4009fc798bd10ba48c942d1b0b3e459b5403028f1214b6dd161/ruff-0.6.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c866b631f5fbce896a74a6e4383407ba7507b815ccc52bcedabb6810fdb3ef7", size = 11330446 },
{ url = "https://files.pythonhosted.org/packages/f7/f6/bdf891a9200d692c94ebcd06ae5a2fa5894e522f2c66c2a12dd5d8cb2654/ruff-0.6.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b118afbb3202f5911486ad52da86d1d52305b59e7ef2031cea3425142b97d6f", size = 12483048 },
{ url = "https://files.pythonhosted.org/packages/a7/86/96f4252f41840e325b3fa6c48297e661abb9f564bd7dcc0572398c8daa42/ruff-0.6.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67267654edc23c97335586774790cde402fb6bbdb3c2314f1fc087dee320bfa", size = 10936855 },
{ url = "https://files.pythonhosted.org/packages/45/87/801a52d26c8dbf73424238e9908b9ceac430d903c8ef35eab1b44fcfa2bd/ruff-0.6.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3ef0cc774b00fec123f635ce5c547dac263f6ee9fb9cc83437c5904183b55ceb", size = 10713007 },
{ url = "https://files.pythonhosted.org/packages/be/27/6f7161d90320a389695e32b6ebdbfbedde28ccbf52451e4b723d7ce744ad/ruff-0.6.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:12edd2af0c60fa61ff31cefb90aef4288ac4d372b4962c2864aeea3a1a2460c0", size = 10274594 },
{ url = "https://files.pythonhosted.org/packages/00/52/dc311775e7b5f5b19831563cb1572ecce63e62681bccc609867711fae317/ruff-0.6.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:55bb01caeaf3a60b2b2bba07308a02fca6ab56233302406ed5245180a05c5625", size = 10608024 },
{ url = "https://files.pythonhosted.org/packages/98/b6/be0a1ddcbac65a30c985cf7224c4fce786ba2c51e7efeb5178fe410ed3cf/ruff-0.6.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:925d26471fa24b0ce5a6cdfab1bb526fb4159952385f386bdcc643813d472039", size = 10982085 },
{ url = "https://files.pythonhosted.org/packages/bb/a4/c84bc13d0b573cf7bb7d17b16d6d29f84267c92d79b2f478d4ce322e8e72/ruff-0.6.9-py3-none-win32.whl", hash = "sha256:eb61ec9bdb2506cffd492e05ac40e5bc6284873aceb605503d8494180d6fc84d", size = 8522088 },
{ url = "https://files.pythonhosted.org/packages/74/be/fc352bd8ca40daae8740b54c1c3e905a7efe470d420a268cd62150248c91/ruff-0.6.9-py3-none-win_amd64.whl", hash = "sha256:785d31851c1ae91f45b3d8fe23b8ae4b5170089021fbb42402d811135f0b7117", size = 9359275 },
{ url = "https://files.pythonhosted.org/packages/3e/14/fd026bc74ded05e2351681545a5f626e78ef831f8edce064d61acd2e6ec7/ruff-0.6.9-py3-none-win_arm64.whl", hash = "sha256:a9641e31476d601f83cd602608739a0840e348bda93fec9f1ee816f8b6798b93", size = 8679879 },
{ url = "https://files.pythonhosted.org/packages/9c/db/baee59ac88f57527fcbaad3a7b309994e42329c6bc4d4d2b681a3d7b5426/ruff-0.11.4-py3-none-linux_armv6l.whl", hash = "sha256:d9f4a761ecbde448a2d3e12fb398647c7f0bf526dbc354a643ec505965824ed2", size = 10106493 },
{ url = "https://files.pythonhosted.org/packages/c1/d6/9a0962cbb347f4ff98b33d699bf1193ff04ca93bed4b4222fd881b502154/ruff-0.11.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8c1747d903447d45ca3d40c794d1a56458c51e5cc1bc77b7b64bd2cf0b1626cc", size = 10876382 },
{ url = "https://files.pythonhosted.org/packages/3a/8f/62bab0c7d7e1ae3707b69b157701b41c1ccab8f83e8501734d12ea8a839f/ruff-0.11.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:51a6494209cacca79e121e9b244dc30d3414dac8cc5afb93f852173a2ecfc906", size = 10237050 },
{ url = "https://files.pythonhosted.org/packages/09/96/e296965ae9705af19c265d4d441958ed65c0c58fc4ec340c27cc9d2a1f5b/ruff-0.11.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f171605f65f4fc49c87f41b456e882cd0c89e4ac9d58e149a2b07930e1d466f", size = 10424984 },
{ url = "https://files.pythonhosted.org/packages/e5/56/644595eb57d855afed6e54b852e2df8cd5ca94c78043b2f29bdfb29882d5/ruff-0.11.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebf99ea9af918878e6ce42098981fc8c1db3850fef2f1ada69fb1dcdb0f8e79e", size = 9957438 },
{ url = "https://files.pythonhosted.org/packages/86/83/9d3f3bed0118aef3e871ded9e5687fb8c5776bde233427fd9ce0a45db2d4/ruff-0.11.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edad2eac42279df12e176564a23fc6f4aaeeb09abba840627780b1bb11a9d223", size = 11547282 },
{ url = "https://files.pythonhosted.org/packages/40/e6/0c6e4f5ae72fac5ccb44d72c0111f294a5c2c8cc5024afcb38e6bda5f4b3/ruff-0.11.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f103a848be9ff379fc19b5d656c1f911d0a0b4e3e0424f9532ececf319a4296e", size = 12182020 },
{ url = "https://files.pythonhosted.org/packages/b5/92/4aed0e460aeb1df5ea0c2fbe8d04f9725cccdb25d8da09a0d3f5b8764bf8/ruff-0.11.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:193e6fac6eb60cc97b9f728e953c21cc38a20077ed64f912e9d62b97487f3f2d", size = 11679154 },
{ url = "https://files.pythonhosted.org/packages/1b/d3/7316aa2609f2c592038e2543483eafbc62a0e1a6a6965178e284808c095c/ruff-0.11.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7af4e5f69b7c138be8dcffa5b4a061bf6ba6a3301f632a6bce25d45daff9bc99", size = 13905985 },
{ url = "https://files.pythonhosted.org/packages/63/80/734d3d17546e47ff99871f44ea7540ad2bbd7a480ed197fe8a1c8a261075/ruff-0.11.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:126b1bf13154aa18ae2d6c3c5efe144ec14b97c60844cfa6eb960c2a05188222", size = 11348343 },
{ url = "https://files.pythonhosted.org/packages/04/7b/70fc7f09a0161dce9613a4671d198f609e653d6f4ff9eee14d64c4c240fb/ruff-0.11.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8806daaf9dfa881a0ed603f8a0e364e4f11b6ed461b56cae2b1c0cab0645304", size = 10308487 },
{ url = "https://files.pythonhosted.org/packages/1a/22/1cdd62dabd678d75842bf4944fd889cf794dc9e58c18cc547f9eb28f95ed/ruff-0.11.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5d94bb1cc2fc94a769b0eb975344f1b1f3d294da1da9ddbb5a77665feb3a3019", size = 9929091 },
{ url = "https://files.pythonhosted.org/packages/9f/20/40e0563506332313148e783bbc1e4276d657962cc370657b2fff20e6e058/ruff-0.11.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:995071203d0fe2183fc7a268766fd7603afb9996785f086b0d76edee8755c896", size = 10924659 },
{ url = "https://files.pythonhosted.org/packages/b5/41/eef9b7aac8819d9e942f617f9db296f13d2c4576806d604aba8db5a753f1/ruff-0.11.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7a37ca937e307ea18156e775a6ac6e02f34b99e8c23fe63c1996185a4efe0751", size = 11428160 },
{ url = "https://files.pythonhosted.org/packages/ff/61/c488943414fb2b8754c02f3879de003e26efdd20f38167ded3fb3fc1cda3/ruff-0.11.4-py3-none-win32.whl", hash = "sha256:0e9365a7dff9b93af933dab8aebce53b72d8f815e131796268709890b4a83270", size = 10311496 },
{ url = "https://files.pythonhosted.org/packages/b6/2b/2a1c8deb5f5dfa3871eb7daa41492c4d2b2824a74d2b38e788617612a66d/ruff-0.11.4-py3-none-win_amd64.whl", hash = "sha256:5a9fa1c69c7815e39fcfb3646bbfd7f528fa8e2d4bebdcf4c2bd0fa037a255fb", size = 11399146 },
{ url = "https://files.pythonhosted.org/packages/4f/03/3aec4846226d54a37822e4c7ea39489e4abd6f88388fba74e3d4abe77300/ruff-0.11.4-py3-none-win_arm64.whl", hash = "sha256:d435db6b9b93d02934cf61ef332e66af82da6d8c69aefdea5994c89997c7a0fc", size = 10450306 },
]
[[package]]
name = "sh"
version = "2.0.7"
version = "2.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/14/7a/5148402146d360a6d15922814a3b065b52be3a5fe878a8834d3ce4e7d33f/sh-2.0.7.tar.gz", hash = "sha256:029d45198902bfb967391eccfd13a88d92f7cebd200411e93f99ebacc6afbb35", size = 345477 }
sdist = { url = "https://files.pythonhosted.org/packages/52/12/b7965006c5adc57ba5459385358bd27c4983cd490884a75be86eb1d3efeb/sh-2.1.0.tar.gz", hash = "sha256:7e27301c574bec8ca5bf6f211851357526455ee97cd27a7c4c6cc5e2375399cb", size = 345525 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/15/c2/79f9dea6fc544c0eb79ed5018a38860c52d597c4be66c2cf2029bea5b3fd/sh-2.0.7-py3-none-any.whl", hash = "sha256:2f2f79a65abd00696cf2e9ad26508cf8abb6dba5745f40255f1c0ded2876926d", size = 38103 },
{ url = "https://files.pythonhosted.org/packages/00/59/f6551f49c123751e921038c24215157bd50aef375ced16cac57229678c43/sh-2.1.0-py3-none-any.whl", hash = "sha256:bf5e44178dd96a542126c2774e9b7ab1d89bfe0e2ef84d92e6d0ed7358d63d01", size = 38080 },
]
[[package]]
@ -931,7 +900,7 @@ wheels = [
[[package]]
name = "sphinx"
version = "8.0.2"
version = "8.1.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "alabaster" },
@ -951,9 +920,9 @@ dependencies = [
{ name = "sphinxcontrib-qthelp" },
{ name = "sphinxcontrib-serializinghtml" },
]
sdist = { url = "https://files.pythonhosted.org/packages/25/a7/3cc3d6dcad70aba2e32a3ae8de5a90026a0a2fdaaa0756925e3a120249b6/sphinx-8.0.2.tar.gz", hash = "sha256:0cce1ddcc4fd3532cf1dd283bc7d886758362c5c1de6598696579ce96d8ffa5b", size = 8189041 }
sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/4d/61/2ad169c6ff1226b46e50da0e44671592dbc6d840a52034a0193a99b28579/sphinx-8.0.2-py3-none-any.whl", hash = "sha256:56173572ae6c1b9a38911786e206a110c9749116745873feae4f9ce88e59391d", size = 3498950 },
{ url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125 },
]
[[package]]
@ -975,16 +944,16 @@ wheels = [
[[package]]
name = "sphinx-rtd-theme"
version = "3.0.0"
version = "3.0.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "docutils" },
{ name = "sphinx" },
{ name = "sphinxcontrib-jquery" },
]
sdist = { url = "https://files.pythonhosted.org/packages/21/f8/2667f9cab89827528596588dd9de6f937f52e5c6e87e6f28ecb866955551/sphinx_rtd_theme-3.0.0.tar.gz", hash = "sha256:905d67de03217fd3d76fbbdd992034ac8e77044ef8063a544dda1af74d409e08", size = 7620317 }
sdist = { url = "https://files.pythonhosted.org/packages/91/44/c97faec644d29a5ceddd3020ae2edffa69e7d00054a8c7a6021e82f20335/sphinx_rtd_theme-3.0.2.tar.gz", hash = "sha256:b7457bc25dda723b20b086a670b9953c859eab60a2a03ee8eb2bb23e176e5f85", size = 7620463 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/21/11/81e5bfffdbd6dd3173d5ee29b4629a03ba80d38d4a250e7a8504af22d5c2/sphinx_rtd_theme-3.0.0-py2.py3-none-any.whl", hash = "sha256:1ffe1539957775bfa0a7331370de7dc145b6eac705de23365dc55c5d94bb08e7", size = 7655495 },
{ url = "https://files.pythonhosted.org/packages/85/77/46e3bac77b82b4df5bb5b61f2de98637724f246b4966cfc34bc5895d852a/sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl", hash = "sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13", size = 7655561 },
]
[[package]]
@ -1055,14 +1024,14 @@ wheels = [
[[package]]
name = "starlette"
version = "0.39.2"
version = "0.45.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
]
sdist = { url = "https://files.pythonhosted.org/packages/02/0a/62fbd5697f6174041f9b4e2e377b6f383f9189b77dbb7d73d24624caca1d/starlette-0.39.2.tar.gz", hash = "sha256:caaa3b87ef8518ef913dac4f073dea44e85f73343ad2bdc17941931835b2a26a", size = 2573080 }
sdist = { url = "https://files.pythonhosted.org/packages/c1/be/b398217eb35b356d2d9bb84ec67071ea2842e02950fcf38b33df9d5b24ba/starlette-0.45.1.tar.gz", hash = "sha256:a8ae1fa3b1ab7ca83a4abd77871921a13fb5aeaf4874436fb96c29dfcd4ecfa3", size = 2573953 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/60/f0/04547f776c8845be46df4bdd1f11159c088bd39e916f35d7da1b9f6eb3ef/starlette-0.39.2-py3-none-any.whl", hash = "sha256:134dd6deb655a9775991d352312d53f1879775e5cc8a481f966e83416a2c3f71", size = 73219 },
{ url = "https://files.pythonhosted.org/packages/6b/2c/a50484b035ee0e13ebb7a42391e391befbfc1b6a9ad5503e83badd182ada/starlette-0.45.1-py3-none-any.whl", hash = "sha256:5656c0524f586e9148d9a3c1dd5257fb42a99892fb0dc6877dd76ef4d184aac3", size = 71488 },
]
[[package]]
@ -1085,7 +1054,7 @@ wheels = [
[[package]]
name = "tox"
version = "4.21.2"
version = "4.23.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cachetools" },
@ -1098,23 +1067,23 @@ dependencies = [
{ name = "pyproject-api" },
{ name = "virtualenv" },
]
sdist = { url = "https://files.pythonhosted.org/packages/2a/db/ba5b1a4cf664f221a33c3cbb1adf40ccccbbd13f5eec6d9d7291c7a39e44/tox-4.21.2.tar.gz", hash = "sha256:49381ff102296753e378fa5ff30e42a35e695f149b4dbf8a2c49d15fdb5797b2", size = 188539 }
sdist = { url = "https://files.pythonhosted.org/packages/1f/86/32b10f91b4b975a37ac402b0f9fa016775088e0565c93602ba0b3c729ce8/tox-4.23.2.tar.gz", hash = "sha256:86075e00e555df6e82e74cfc333917f91ecb47ffbc868dcafbd2672e332f4a2c", size = 189998 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f8/20/168300f3f334e255b618322dce14b86a5c423aab05f28be14d1a2d6af14a/tox-4.21.2-py3-none-any.whl", hash = "sha256:13d996adcd792e7c82994b0e116d85efd84f0c6d185254d83d156f73f86b2038", size = 165698 },
{ url = "https://files.pythonhosted.org/packages/af/c0/124b73d01c120e917383bc6c53ebc34efdf7243faa9fca64d105c94cf2ab/tox-4.23.2-py3-none-any.whl", hash = "sha256:452bc32bb031f2282881a2118923176445bac783ab97c874b8770ab4c3b76c38", size = 166758 },
]
[[package]]
name = "tox-uv"
version = "1.11.2"
version = "1.17.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "packaging" },
{ name = "tox" },
{ name = "uv" },
]
sdist = { url = "https://files.pythonhosted.org/packages/fa/cf/7062095ae8c5e6a25d7153b9b1c4a16e52df61859160b3db66a60f055d1e/tox_uv-1.11.2.tar.gz", hash = "sha256:a7aded5c3fb69f055b523357988c1055bb573e91bfd7ecfb9b5233ebcab5d10b", size = 13628 }
sdist = { url = "https://files.pythonhosted.org/packages/57/e3/04e7430a21290aaf91087123055249052f9bafaa48178f4ab58b8d73d839/tox_uv-1.17.0.tar.gz", hash = "sha256:07020acd90048b5c898b2c8f1e7c1c4cf944161745d7bfe5b9458ed67f4998b7", size = 17640 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6a/50/5b9f2d9d10bfdfb1f748bbcdb6eae5a5da6d2a7adbef9a4df34aceac6eca/tox_uv-1.11.2-py3-none-any.whl", hash = "sha256:7f8f1737b3277e1cddcb5b89fcc5931d04923562c940ae60f29e140908566df2", size = 11265 },
{ url = "https://files.pythonhosted.org/packages/fa/be/fc8209e150fec799fd01fa027f372cdf87d6cf0eeb083e43ee48037199e5/tox_uv-1.17.0-py3-none-any.whl", hash = "sha256:cdc95eca6fd98a7716b9da7c9cf901d4836d6956089d6cb3417f00c8d98b513c", size = 14010 },
]
[[package]]
@ -1122,7 +1091,7 @@ name = "tqdm"
version = "4.66.5"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "platform_system == 'Windows'" },
{ name = "colorama", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/58/83/6ba9844a41128c62e810fddddd72473201f3eacde02046066142a2d96cc5/tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad", size = 169504 }
wheels = [
@ -1158,40 +1127,39 @@ wheels = [
[[package]]
name = "uv"
version = "0.4.6"
version = "0.5.13"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/02/5c/916bc1eacf2a5ca8cd33dc5d51cc9f64735ef6faccefd2f689d34b9eb23a/uv-0.4.6.tar.gz", hash = "sha256:5c142b0082844c9eca4a303e13cf1d286622f49af70e8f922b833cb3e667b2e3", size = 1859862 }
sdist = { url = "https://files.pythonhosted.org/packages/a4/09/dc3b7beb8abc663c962320eff9862e5c718383bd6e03e9490da5621f77c5/uv-0.5.13.tar.gz", hash = "sha256:58a66786f2e95c89539bafd819cf2959f56199457301eac8faa920c1872c4f36", size = 2555484 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/09/0b/eb3ca96aa881e5a88e704b5d7aec99610cc0d64702c984da24ae2a5682c2/uv-0.4.6-py3-none-linux_armv6l.whl", hash = "sha256:e0360bb3b094d106d1fa00b3a15c69ccd0d1593682c33affb1b94367a248a378", size = 11097185 },
{ url = "https://files.pythonhosted.org/packages/30/1c/3c27e0fe4ad1a5b9792a61e92283457beec7949863c1b3435ef79cfad179/uv-0.4.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:16ae9f0a9b3bb6db755d057c4ff55b0e82fbb09243a1dce02720268718c0a11c", size = 11558713 },
{ url = "https://files.pythonhosted.org/packages/5a/f8/93e8574c91ef7884154af6f80d213ee11f7710201c2fe0d73a9f9556bd2d/uv-0.4.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6e925f661aeaf392cc102d3c2f6f05b6994519bd7a36578f836a4bbf42ee813", size = 10668873 },
{ url = "https://files.pythonhosted.org/packages/0f/f3/1b2625aa119ee66fc7a6c3c1026c66707a5f99a0c86e5d49fd237f45f0b5/uv-0.4.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:86f78fb80989b524ce7da705fb5af613339a8eadbcf9e230bb16e8a7d383c2ce", size = 11006778 },
{ url = "https://files.pythonhosted.org/packages/30/01/cbe8bc23dd1e32b77b652e31757fcdb636c194bd13acf32e2438a72daf5a/uv-0.4.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a66442018e09467222824b685b2d401053dfdbc3b5f6fb1f863ca2eb2560076a", size = 10896611 },
{ url = "https://files.pythonhosted.org/packages/5f/11/46328fc827f4bf35b715a97f067a61563f5421e0e35ba6fd16b9de82771a/uv-0.4.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4db5c2b770bb0e95a4d32dc19943109310c86103fe8b8ecf0d18dfe1a4f2a212", size = 11563597 },
{ url = "https://files.pythonhosted.org/packages/3e/b1/8774d2fab7cbec44e68aafa58745ce9ec2af26a17e1d6ad86284fcd79acf/uv-0.4.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9bf486c6331197a301bff253945b233d852ed2fdc322e93c78d382092813161d", size = 12341920 },
{ url = "https://files.pythonhosted.org/packages/81/cc/f53877269f75d4bba8e4bad131b6aa2d39d6545afff2c703be2c9608ad50/uv-0.4.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2bd9879eb8ee9de0fa532136ddfe76c1b425520fa6de52f5d023567e226a08b5", size = 12142981 },
{ url = "https://files.pythonhosted.org/packages/13/b8/373d86645849320eb61e213e657084f7cf6be2d6f2b13e413cb555876659/uv-0.4.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831be24db75938ebb01f9e6b7bcf24683b9661f91aab4108636207ba9dc6a2b9", size = 15237758 },
{ url = "https://files.pythonhosted.org/packages/29/bb/0accc6347df2f88efd092aa821eba46edebac726659a0160590989860b77/uv-0.4.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8cdadb99b842494a0a39e0184cacfb4af722fdbea3d4cb5ee3b25ea0b824292", size = 11925644 },
{ url = "https://files.pythonhosted.org/packages/a6/3d/32dfd30e22dca7ea76a1298d42cdda3c3e80be6763d9d87a14a5b9bbb38b/uv-0.4.6-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:081793fc66286ad0f9b939b5ab3239d20d486eff7b8f7c574d3fdcd44536595e", size = 11116370 },
{ url = "https://files.pythonhosted.org/packages/72/8a/18731ce4fae35a205efabd5f5f1979821fcb66f4d6ad6818e79b0b0bce20/uv-0.4.6-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:346db85ce897c6c782af33504922a84c583180906244ea224a306e2393f396f4", size = 10901947 },
{ url = "https://files.pythonhosted.org/packages/a7/08/665613bc0cb41f85afc1059b6b25815d5904020822d3a958986aa2d2eee6/uv-0.4.6-py3-none-musllinux_1_1_i686.whl", hash = "sha256:5d507dee4767d054171dcdbc1ac1fa7d15a7579e20ff988162c749f09a95f943", size = 11389509 },
{ url = "https://files.pythonhosted.org/packages/23/47/5a30dd313ce2c33c3637ea17c65fcddbfbf005fc456c6025f18e99bf56e8/uv-0.4.6-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:397e02640cbddc4230da8d614ef9a7138a024b9ce396f2a27013cd254e97480d", size = 13150151 },
{ url = "https://files.pythonhosted.org/packages/44/0e/37f4040363d05a0cca7f35759d34bb2ca10e9d89a647b8c6c3888ed8b643/uv-0.4.6-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:93165aa25f5278a0844c91a367140e725d384633946705651ff8e70757c2e92f", size = 12048785 },
{ url = "https://files.pythonhosted.org/packages/b4/1e/0b21ab16140d252d211411b4f61e2e448830f76b5cd5b88bb8dd827e5c7d/uv-0.4.6-py3-none-win32.whl", hash = "sha256:954f91be1b8e531e9fd3d6d549ec1638c20ce4e77dc6e272c5c5d21b8c952f11", size = 11320666 },
{ url = "https://files.pythonhosted.org/packages/d8/44/0231b506b5c2ea9da3242142fc7e53696060f548bb6f1cebca89268fa238/uv-0.4.6-py3-none-win_amd64.whl", hash = "sha256:86ecd19796363f0161600120d81ce7e3d17d54cce6d25017190daa608a8ab535", size = 12520653 },
{ url = "https://files.pythonhosted.org/packages/52/bf/142c1aefdb0cdb1200d8fd2193073d3b4b28028a7cacbce3fcaafe5fd9bf/uv-0.5.13-py3-none-linux_armv6l.whl", hash = "sha256:45301cb355fc0525e692d220ea7cb196e8378a53162b27d6eea6e65c7635ed3d", size = 14408033 },
{ url = "https://files.pythonhosted.org/packages/a0/3e/dc408e34fbb6e7bb5d1462dfeb765074c7951d400e31ba31c9b21ac46250/uv-0.5.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ff96602b7d391f35dc25122c2661e680a9e94864e96801611ef05c853826c82c", size = 14406050 },
{ url = "https://files.pythonhosted.org/packages/04/da/2e8cd58fb76c213a03c2fb556ad0858a6e585cd6e4b5f0e531ac81f113a8/uv-0.5.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:941c13f15a8726a2f5ad3fffa0bbe98e221c98fbe73adbca62cf327bd3fb029c", size = 13370750 },
{ url = "https://files.pythonhosted.org/packages/92/f1/4a0c9c1dbf6a237bd48fca67b9732e2d33e05536e2f54e8290c90e552ebc/uv-0.5.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:642d7e62c376487a63a03fb830749fb24dd7653f715864df2fb8788f29dfb85e", size = 13646567 },
{ url = "https://files.pythonhosted.org/packages/83/41/c39977fdc5eb6c2060a7705963460a0214452ee8d3f79bb8b96b3bbdaca2/uv-0.5.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5aab53db952f7f4505cfc2f62ecedb4a7977d746622f67cbadf052bef0d916e", size = 14172837 },
{ url = "https://files.pythonhosted.org/packages/d2/21/0823f2ac33febb103dfc51e0aa43c4540375b29689dfc846a897b1d704cb/uv-0.5.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f57250f46914affab4e4ca50822f1fbc7910df01818a22b7d91d4f5ccc5eb80c", size = 14907424 },
{ url = "https://files.pythonhosted.org/packages/82/51/04ed1d8e5cac1f3f26f20c9cb0202b1fad0bb3fb1c8c0ba320f82eb0b205/uv-0.5.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6fb26d2b6d4b6467b98acc22b67bbdd16360a1b843842d7cd77ff4df70884567", size = 15497699 },
{ url = "https://files.pythonhosted.org/packages/f7/b9/dd859a72bfde9c2daa7f64ebad699e4e75fda1e45dcf6ac8026f88296b55/uv-0.5.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:414dd7083bd7e06ab2db0ee6cfe81b0810c416e79ff1643701e15e2df5e1db2b", size = 15225898 },
{ url = "https://files.pythonhosted.org/packages/c0/bd/faed9861a27b9a24c0e93b5c18fbf0f4cc7a88e46bf15ad0fa03ffc7fb98/uv-0.5.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:01fc5e928efba822ff28007f827c3c274b644508253fe358ec79085bae1da0c9", size = 19963452 },
{ url = "https://files.pythonhosted.org/packages/a7/64/00896d517e95621aa10e7a19dc6de636edab73f80b5e6ff4df73188731be/uv-0.5.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82479440765e507af1f2732bd496ec6ed849488f5ce310b8556cfe8c12da1c5f", size = 14970047 },
{ url = "https://files.pythonhosted.org/packages/d0/8f/f62f7fe20b7ead1e2afbe050932e698eb5ce6c2649fe49c2d2f96dc5fcba/uv-0.5.13-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:18f2141e71f6cb4c0ab44f1a100838d336f14c1d7a1c62444c79c2c2554331be", size = 13854500 },
{ url = "https://files.pythonhosted.org/packages/52/2b/efef56357acb6a63aab425f03c8d819eef7cd261a34bf8b6f64bc86a82d2/uv-0.5.13-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:4c2e75845c9c5adae3e8274967f70023b740488d732f88100baeef70090b60a0", size = 14178985 },
{ url = "https://files.pythonhosted.org/packages/e3/83/394d65c16d058eda1179c05418c68289f983aab2c278d06ea273e3e6299a/uv-0.5.13-py3-none-musllinux_1_1_i686.whl", hash = "sha256:6de38097d5efa86ae62a71ff268e16f7eab86f4afa63c32b546cb7f5a182874f", size = 14552142 },
{ url = "https://files.pythonhosted.org/packages/4b/6e/712477a76954f64bb6f0391c9dd1081e41c97d1f653c92688b1618e7fcdc/uv-0.5.13-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:30440409a28f1d5d34af8839a48ba9c26da06fc295f363ba9b12689b796453d4", size = 15088698 },
{ url = "https://files.pythonhosted.org/packages/7d/b6/a06fa33db44426275ab0ba87dc4a4e770acfab0897ee212a6ff4d3423e1d/uv-0.5.13-py3-none-win32.whl", hash = "sha256:df2a751e8319e11ef2d8bec30d549ee13949027aaa936ab2a0ab126602f4232b", size = 14459272 },
{ url = "https://files.pythonhosted.org/packages/a5/c8/b3bdc883e4ca0612ddd9f956d116308742f12d9140361dba6b2fcf66294d/uv-0.5.13-py3-none-win_amd64.whl", hash = "sha256:4219f1ed370bb2cec5f10dcc93fa9ecf5615fa67e0b71eef4817d571291f0bfc", size = 16315884 },
]
[[package]]
name = "uvicorn"
version = "0.31.0"
version = "0.34.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
{ name = "h11" },
]
sdist = { url = "https://files.pythonhosted.org/packages/0a/96/ee52d900f8e41cc35eaebfda76f3619c2e45b741f3ee957d6fe32be1b2aa/uvicorn-0.31.0.tar.gz", hash = "sha256:13bc21373d103859f68fe739608e2eb054a816dea79189bc3ca08ea89a275906", size = 77140 }
sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/05/12/206aca5442524d16be7702d08b453d7c274c86fd759266b1f709d4ef43ba/uvicorn-0.31.0-py3-none-any.whl", hash = "sha256:cac7be4dd4d891c363cd942160a7b02e69150dcbc7a36be04d5f4af4b17c8ced", size = 63656 },
{ url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 },
]
[[package]]
@ -1210,69 +1178,46 @@ wheels = [
[[package]]
name = "watchfiles"
version = "0.24.0"
version = "1.0.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
]
sdist = { url = "https://files.pythonhosted.org/packages/c8/27/2ba23c8cc85796e2d41976439b08d52f691655fdb9401362099502d1f0cf/watchfiles-0.24.0.tar.gz", hash = "sha256:afb72325b74fa7a428c009c1b8be4b4d7c2afedafb2982827ef2156646df2fe1", size = 37870 }
sdist = { url = "https://files.pythonhosted.org/packages/3c/7e/4569184ea04b501840771b8fcecee19b2233a8b72c196061263c0ef23c0b/watchfiles-1.0.3.tar.gz", hash = "sha256:f3ff7da165c99a5412fe5dd2304dd2dbaaaa5da718aad942dcb3a178eaa70c56", size = 38185 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/35/82/92a7bb6dc82d183e304a5f84ae5437b59ee72d48cee805a9adda2488b237/watchfiles-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7211b463695d1e995ca3feb38b69227e46dbd03947172585ecb0588f19b0d87a", size = 374137 },
{ url = "https://files.pythonhosted.org/packages/87/91/49e9a497ddaf4da5e3802d51ed67ff33024597c28f652b8ab1e7c0f5718b/watchfiles-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b8693502d1967b00f2fb82fc1e744df128ba22f530e15b763c8d82baee15370", size = 367733 },
{ url = "https://files.pythonhosted.org/packages/0d/d8/90eb950ab4998effea2df4cf3a705dc594f6bc501c5a353073aa990be965/watchfiles-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdab9555053399318b953a1fe1f586e945bc8d635ce9d05e617fd9fe3a4687d6", size = 437322 },
{ url = "https://files.pythonhosted.org/packages/6c/a2/300b22e7bc2a222dd91fce121cefa7b49aa0d26a627b2777e7bdfcf1110b/watchfiles-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34e19e56d68b0dad5cff62273107cf5d9fbaf9d75c46277aa5d803b3ef8a9e9b", size = 433409 },
{ url = "https://files.pythonhosted.org/packages/99/44/27d7708a43538ed6c26708bcccdde757da8b7efb93f4871d4cc39cffa1cc/watchfiles-0.24.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41face41f036fee09eba33a5b53a73e9a43d5cb2c53dad8e61fa6c9f91b5a51e", size = 452142 },
{ url = "https://files.pythonhosted.org/packages/b0/ec/c4e04f755be003129a2c5f3520d2c47026f00da5ecb9ef1e4f9449637571/watchfiles-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5148c2f1ea043db13ce9b0c28456e18ecc8f14f41325aa624314095b6aa2e9ea", size = 469414 },
{ url = "https://files.pythonhosted.org/packages/c5/4e/cdd7de3e7ac6432b0abf282ec4c1a1a2ec62dfe423cf269b86861667752d/watchfiles-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e4bd963a935aaf40b625c2499f3f4f6bbd0c3776f6d3bc7c853d04824ff1c9f", size = 472962 },
{ url = "https://files.pythonhosted.org/packages/27/69/e1da9d34da7fc59db358424f5d89a56aaafe09f6961b64e36457a80a7194/watchfiles-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c79d7719d027b7a42817c5d96461a99b6a49979c143839fc37aa5748c322f234", size = 425705 },
{ url = "https://files.pythonhosted.org/packages/e8/c1/24d0f7357be89be4a43e0a656259676ea3d7a074901f47022f32e2957798/watchfiles-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:32aa53a9a63b7f01ed32e316e354e81e9da0e6267435c7243bf8ae0f10b428ef", size = 612851 },
{ url = "https://files.pythonhosted.org/packages/c7/af/175ba9b268dec56f821639c9893b506c69fd999fe6a2e2c51de420eb2f01/watchfiles-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce72dba6a20e39a0c628258b5c308779b8697f7676c254a845715e2a1039b968", size = 594868 },
{ url = "https://files.pythonhosted.org/packages/44/81/1f701323a9f70805bc81c74c990137123344a80ea23ab9504a99492907f8/watchfiles-0.24.0-cp312-none-win32.whl", hash = "sha256:d9018153cf57fc302a2a34cb7564870b859ed9a732d16b41a9b5cb2ebed2d444", size = 264109 },
{ url = "https://files.pythonhosted.org/packages/b4/0b/32cde5bc2ebd9f351be326837c61bdeb05ad652b793f25c91cac0b48a60b/watchfiles-0.24.0-cp312-none-win_amd64.whl", hash = "sha256:551ec3ee2a3ac9cbcf48a4ec76e42c2ef938a7e905a35b42a1267fa4b1645896", size = 277055 },
{ url = "https://files.pythonhosted.org/packages/4b/81/daade76ce33d21dbec7a15afd7479de8db786e5f7b7d249263b4ea174e08/watchfiles-0.24.0-cp312-none-win_arm64.whl", hash = "sha256:b52a65e4ea43c6d149c5f8ddb0bef8d4a1e779b77591a458a893eb416624a418", size = 266169 },
{ url = "https://files.pythonhosted.org/packages/30/dc/6e9f5447ae14f645532468a84323a942996d74d5e817837a5c8ce9d16c69/watchfiles-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2e3ab79a1771c530233cadfd277fcc762656d50836c77abb2e5e72b88e3a48", size = 373764 },
{ url = "https://files.pythonhosted.org/packages/79/c0/c3a9929c372816c7fc87d8149bd722608ea58dc0986d3ef7564c79ad7112/watchfiles-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327763da824817b38ad125dcd97595f942d720d32d879f6c4ddf843e3da3fe90", size = 367873 },
{ url = "https://files.pythonhosted.org/packages/2e/11/ff9a4445a7cfc1c98caf99042df38964af12eed47d496dd5d0d90417349f/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82010f8ab451dabe36054a1622870166a67cf3fce894f68895db6f74bbdc94", size = 438381 },
{ url = "https://files.pythonhosted.org/packages/48/a3/763ba18c98211d7bb6c0f417b2d7946d346cdc359d585cc28a17b48e964b/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d64ba08db72e5dfd5c33be1e1e687d5e4fcce09219e8aee893a4862034081d4e", size = 432809 },
{ url = "https://files.pythonhosted.org/packages/30/4c/616c111b9d40eea2547489abaf4ffc84511e86888a166d3a4522c2ba44b5/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1cf1f6dd7825053f3d98f6d33f6464ebdd9ee95acd74ba2c34e183086900a827", size = 451801 },
{ url = "https://files.pythonhosted.org/packages/b6/be/d7da83307863a422abbfeb12903a76e43200c90ebe5d6afd6a59d158edea/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43e3e37c15a8b6fe00c1bce2473cfa8eb3484bbeecf3aefbf259227e487a03df", size = 468886 },
{ url = "https://files.pythonhosted.org/packages/1d/d3/3dfe131ee59d5e90b932cf56aba5c996309d94dafe3d02d204364c23461c/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88bcd4d0fe1d8ff43675360a72def210ebad3f3f72cabfeac08d825d2639b4ab", size = 472973 },
{ url = "https://files.pythonhosted.org/packages/42/6c/279288cc5653a289290d183b60a6d80e05f439d5bfdfaf2d113738d0f932/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:999928c6434372fde16c8f27143d3e97201160b48a614071261701615a2a156f", size = 425282 },
{ url = "https://files.pythonhosted.org/packages/d6/d7/58afe5e85217e845edf26d8780c2d2d2ae77675eeb8d1b8b8121d799ce52/watchfiles-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:30bbd525c3262fd9f4b1865cb8d88e21161366561cd7c9e1194819e0a33ea86b", size = 612540 },
{ url = "https://files.pythonhosted.org/packages/6d/d5/b96eeb9fe3fda137200dd2f31553670cbc731b1e13164fd69b49870b76ec/watchfiles-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:edf71b01dec9f766fb285b73930f95f730bb0943500ba0566ae234b5c1618c18", size = 593625 },
{ url = "https://files.pythonhosted.org/packages/c1/e5/c326fe52ee0054107267608d8cea275e80be4455b6079491dfd9da29f46f/watchfiles-0.24.0-cp313-none-win32.whl", hash = "sha256:f4c96283fca3ee09fb044f02156d9570d156698bc3734252175a38f0e8975f07", size = 263899 },
{ url = "https://files.pythonhosted.org/packages/a6/8b/8a7755c5e7221bb35fe4af2dc44db9174f90ebf0344fd5e9b1e8b42d381e/watchfiles-0.24.0-cp313-none-win_amd64.whl", hash = "sha256:a974231b4fdd1bb7f62064a0565a6b107d27d21d9acb50c484d2cdba515b9366", size = 276622 },
{ url = "https://files.pythonhosted.org/packages/bf/a9/c8b5ab33444306e1a324cb2b51644f8458dd459e30c3841f925012893e6a/watchfiles-1.0.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:93436ed550e429da007fbafb723e0769f25bae178fbb287a94cb4ccdf42d3af3", size = 391395 },
{ url = "https://files.pythonhosted.org/packages/ad/d3/403af5f07359863c03951796ddab265ee8cce1a6147510203d0bf43950e7/watchfiles-1.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c18f3502ad0737813c7dad70e3e1cc966cc147fbaeef47a09463bbffe70b0a00", size = 381432 },
{ url = "https://files.pythonhosted.org/packages/f6/5f/921f2f2beabaf24b1ad81ac22bb69df8dd5771fdb68d6f34a5912a420941/watchfiles-1.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a5bc3ca468bb58a2ef50441f953e1f77b9a61bd1b8c347c8223403dc9b4ac9a", size = 441448 },
{ url = "https://files.pythonhosted.org/packages/63/d7/67d0d750b246f248ccdb400a85a253e93e419ea5b6cbe968fa48b97a5f30/watchfiles-1.0.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0d1ec043f02ca04bf21b1b32cab155ce90c651aaf5540db8eb8ad7f7e645cba8", size = 446852 },
{ url = "https://files.pythonhosted.org/packages/53/7c/d7cd94c7d0905f1e2f1c2232ea9bc39b1a48affd007e09c547ead96edb8f/watchfiles-1.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f58d3bfafecf3d81c15d99fc0ecf4319e80ac712c77cf0ce2661c8cf8bf84066", size = 471662 },
{ url = "https://files.pythonhosted.org/packages/26/81/738f8e66f7525753996b8aa292f78dcec1ef77887d62e6cdfb04cc2f352f/watchfiles-1.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1df924ba82ae9e77340101c28d56cbaff2c991bd6fe8444a545d24075abb0a87", size = 493765 },
{ url = "https://files.pythonhosted.org/packages/d2/50/78e21f5da24ab39114e9b24f7b0945ea1c6fc7bc9ae86cd87f8eaeb47325/watchfiles-1.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:632a52dcaee44792d0965c17bdfe5dc0edad5b86d6a29e53d6ad4bf92dc0ff49", size = 490558 },
{ url = "https://files.pythonhosted.org/packages/a8/93/1873fea6354b2858eae8970991d64e9a449d87726d596490d46bf00af8ed/watchfiles-1.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bf4b459d94a0387617a1b499f314aa04d8a64b7a0747d15d425b8c8b151da0", size = 442808 },
{ url = "https://files.pythonhosted.org/packages/4f/b4/2fc4c92fb28b029f66d04a4d430fe929284e9ff717b04bb7a3bb8a7a5605/watchfiles-1.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca94c85911601b097d53caeeec30201736ad69a93f30d15672b967558df02885", size = 615287 },
{ url = "https://files.pythonhosted.org/packages/1e/d4/93da24db39257e440240d338b617c5153ad11d361c34108f5c0e1e0743eb/watchfiles-1.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65ab1fb635476f6170b07e8e21db0424de94877e4b76b7feabfe11f9a5fc12b5", size = 612812 },
{ url = "https://files.pythonhosted.org/packages/c6/67/9fd3661c2dc0309abd6021876653d91e8b64fb279529e2cadaa3520ef3e3/watchfiles-1.0.3-cp312-cp312-win32.whl", hash = "sha256:49bc1bc26abf4f32e132652f4b3bfeec77d8f8f62f57652703ef127e85a3e38d", size = 271642 },
{ url = "https://files.pythonhosted.org/packages/ae/aa/8c887edb78cd67f5d4d6a35c3aeb46d748643ebf962163130fb1871e2ee0/watchfiles-1.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:48681c86f2cb08348631fed788a116c89c787fdf1e6381c5febafd782f6c3b44", size = 285505 },
{ url = "https://files.pythonhosted.org/packages/7b/31/d212fa6390f0e73a91913ada0b925b294a78d67794795371208baf73f0b5/watchfiles-1.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:9e080cf917b35b20c889225a13f290f2716748362f6071b859b60b8847a6aa43", size = 277263 },
]
[[package]]
name = "websockets"
version = "13.1"
version = "14.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/e2/73/9223dbc7be3dcaf2a7bbf756c351ec8da04b1fa573edaf545b95f6b0c7fd/websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878", size = 158549 }
sdist = { url = "https://files.pythonhosted.org/packages/f4/1b/380b883ce05bb5f45a905b61790319a28958a9ab1e4b6b95ff5464b60ca1/websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8", size = 162840 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/df/46/c426282f543b3c0296cf964aa5a7bb17e984f58dde23460c3d39b3148fcf/websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc", size = 157821 },
{ url = "https://files.pythonhosted.org/packages/aa/85/22529867010baac258da7c45848f9415e6cf37fef00a43856627806ffd04/websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49", size = 155480 },
{ url = "https://files.pythonhosted.org/packages/29/2c/bdb339bfbde0119a6e84af43ebf6275278698a2241c2719afc0d8b0bdbf2/websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd", size = 155715 },
{ url = "https://files.pythonhosted.org/packages/9f/d0/8612029ea04c5c22bf7af2fd3d63876c4eaeef9b97e86c11972a43aa0e6c/websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0", size = 165647 },
{ url = "https://files.pythonhosted.org/packages/56/04/1681ed516fa19ca9083f26d3f3a302257e0911ba75009533ed60fbb7b8d1/websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6", size = 164592 },
{ url = "https://files.pythonhosted.org/packages/38/6f/a96417a49c0ed132bb6087e8e39a37db851c70974f5c724a4b2a70066996/websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9", size = 165012 },
{ url = "https://files.pythonhosted.org/packages/40/8b/fccf294919a1b37d190e86042e1a907b8f66cff2b61e9befdbce03783e25/websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68", size = 165311 },
{ url = "https://files.pythonhosted.org/packages/c1/61/f8615cf7ce5fe538476ab6b4defff52beb7262ff8a73d5ef386322d9761d/websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14", size = 164692 },
{ url = "https://files.pythonhosted.org/packages/5c/f1/a29dd6046d3a722d26f182b783a7997d25298873a14028c4760347974ea3/websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf", size = 164686 },
{ url = "https://files.pythonhosted.org/packages/0f/99/ab1cdb282f7e595391226f03f9b498f52109d25a2ba03832e21614967dfa/websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c", size = 158712 },
{ url = "https://files.pythonhosted.org/packages/46/93/e19160db48b5581feac8468330aa11b7292880a94a37d7030478596cc14e/websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3", size = 159145 },
{ url = "https://files.pythonhosted.org/packages/51/20/2b99ca918e1cbd33c53db2cace5f0c0cd8296fc77558e1908799c712e1cd/websockets-13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6", size = 157828 },
{ url = "https://files.pythonhosted.org/packages/b8/47/0932a71d3d9c0e9483174f60713c84cee58d62839a143f21a2bcdbd2d205/websockets-13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708", size = 155487 },
{ url = "https://files.pythonhosted.org/packages/a9/60/f1711eb59ac7a6c5e98e5637fef5302f45b6f76a2c9d64fd83bbb341377a/websockets-13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418", size = 155721 },
{ url = "https://files.pythonhosted.org/packages/6a/e6/ba9a8db7f9d9b0e5f829cf626ff32677f39824968317223605a6b419d445/websockets-13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a", size = 165609 },
{ url = "https://files.pythonhosted.org/packages/c1/22/4ec80f1b9c27a0aebd84ccd857252eda8418ab9681eb571b37ca4c5e1305/websockets-13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f", size = 164556 },
{ url = "https://files.pythonhosted.org/packages/27/ac/35f423cb6bb15600438db80755609d27eda36d4c0b3c9d745ea12766c45e/websockets-13.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5", size = 164993 },
{ url = "https://files.pythonhosted.org/packages/31/4e/98db4fd267f8be9e52e86b6ee4e9aa7c42b83452ea0ea0672f176224b977/websockets-13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135", size = 165360 },
{ url = "https://files.pythonhosted.org/packages/3f/15/3f0de7cda70ffc94b7e7024544072bc5b26e2c1eb36545291abb755d8cdb/websockets-13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2", size = 164745 },
{ url = "https://files.pythonhosted.org/packages/a1/6e/66b6b756aebbd680b934c8bdbb6dcb9ce45aad72cde5f8a7208dbb00dd36/websockets-13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6", size = 164732 },
{ url = "https://files.pythonhosted.org/packages/35/c6/12e3aab52c11aeb289e3dbbc05929e7a9d90d7a9173958477d3ef4f8ce2d/websockets-13.1-cp313-cp313-win32.whl", hash = "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d", size = 158709 },
{ url = "https://files.pythonhosted.org/packages/41/d8/63d6194aae711d7263df4498200c690a9c39fb437ede10f3e157a6343e0d/websockets-13.1-cp313-cp313-win_amd64.whl", hash = "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2", size = 159144 },
{ url = "https://files.pythonhosted.org/packages/56/27/96a5cd2626d11c8280656c6c71d8ab50fe006490ef9971ccd154e0c42cd2/websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f", size = 152134 },
{ url = "https://files.pythonhosted.org/packages/55/64/55698544ce29e877c9188f1aee9093712411a8fc9732cca14985e49a8e9c/websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed", size = 161957 },
{ url = "https://files.pythonhosted.org/packages/a2/b1/b088f67c2b365f2c86c7b48edb8848ac27e508caf910a9d9d831b2f343cb/websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d", size = 159620 },
{ url = "https://files.pythonhosted.org/packages/c1/89/2a09db1bbb40ba967a1b8225b07b7df89fea44f06de9365f17f684d0f7e6/websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707", size = 159852 },
{ url = "https://files.pythonhosted.org/packages/ca/c1/f983138cd56e7d3079f1966e81f77ce6643f230cd309f73aa156bb181749/websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a", size = 169675 },
{ url = "https://files.pythonhosted.org/packages/c1/c8/84191455d8660e2a0bdb33878d4ee5dfa4a2cedbcdc88bbd097303b65bfa/websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45", size = 168619 },
{ url = "https://files.pythonhosted.org/packages/8d/a7/62e551fdcd7d44ea74a006dc193aba370505278ad76efd938664531ce9d6/websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58", size = 169042 },
{ url = "https://files.pythonhosted.org/packages/ad/ed/1532786f55922c1e9c4d329608e36a15fdab186def3ca9eb10d7465bc1cc/websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058", size = 169345 },
{ url = "https://files.pythonhosted.org/packages/ea/fb/160f66960d495df3de63d9bcff78e1b42545b2a123cc611950ffe6468016/websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4", size = 168725 },
{ url = "https://files.pythonhosted.org/packages/cf/53/1bf0c06618b5ac35f1d7906444b9958f8485682ab0ea40dee7b17a32da1e/websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05", size = 168712 },
{ url = "https://files.pythonhosted.org/packages/e5/22/5ec2f39fff75f44aa626f86fa7f20594524a447d9c3be94d8482cd5572ef/websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0", size = 162838 },
{ url = "https://files.pythonhosted.org/packages/74/27/28f07df09f2983178db7bf6c9cccc847205d2b92ced986cd79565d68af4f/websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f", size = 163277 },
{ url = "https://files.pythonhosted.org/packages/b0/0b/c7e5d11020242984d9d37990310520ed663b942333b83a033c2f20191113/websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e", size = 156277 },
]
[[package]]

View File

@ -7,7 +7,7 @@ environment:
POSTGRES_DB: 'test_{{ cookiecutter.project_slug }}'
POSTGRES_HOST_AUTH_METHOD: trust
{%- if cookiecutter.use_celery == 'y' %}
CELERY_BROKER_URL: 'redis://redis:6379/0'
REDIS_URL: 'redis://redis:6379/0'
{%- endif %}
steps:

View File

@ -12,7 +12,7 @@ trim_trailing_whitespace = true
indent_style = space
indent_size = 4
[*.{html,css,scss,json,yml,xml}]
[*.{html,css,scss,json,yml,xml,toml}]
indent_style = space
indent_size = 2

View File

@ -9,16 +9,20 @@ updates:
# Every weekday
schedule:
interval: 'daily'
groups:
github-actions:
patterns:
- '*'
{%- if cookiecutter.use_docker == 'y' %}
# Enable version updates for Docker
# We need to specify each Dockerfile in a separate entry because Dependabot doesn't
# support wildcards or recursively checking subdirectories. Check this issue for updates:
# https://github.com/dependabot/dependabot-core/issues/2178
- package-ecosystem: 'docker'
# Look for a `Dockerfile` in the `compose/local/django` directory
directory: 'compose/local/django/'
directories:
- 'compose/local/django/'
- 'compose/local/docs/'
- 'compose/production/django/'
# Every weekday
schedule:
interval: 'daily'
@ -28,81 +32,41 @@ updates:
update-types:
- 'version-update:semver-major'
- 'version-update:semver-minor'
groups:
docker-python:
patterns:
- '*'
- package-ecosystem: 'docker'
# Look for a `Dockerfile` in the `compose/local/docs` directory
directory: 'compose/local/docs/'
# Every weekday
schedule:
interval: 'daily'
# Ignore minor version updates (3.10 -> 3.11) but update patch versions
ignore:
- dependency-name: '*'
update-types:
- 'version-update:semver-major'
- 'version-update:semver-minor'
- package-ecosystem: 'docker'
# Look for a `Dockerfile` in the `compose/local/node` directory
directory: 'compose/local/node/'
# Every weekday
schedule:
interval: 'daily'
- package-ecosystem: 'docker'
# Look for a `Dockerfile` in the `compose/production/aws` directory
directory: 'compose/production/aws/'
# Every weekday
schedule:
interval: 'daily'
- package-ecosystem: 'docker'
# Look for a `Dockerfile` in the `compose/production/django` directory
directory: 'compose/production/django/'
# Every weekday
schedule:
interval: 'daily'
# Ignore minor version updates (3.10 -> 3.11) but update patch versions
ignore:
- dependency-name: '*'
update-types:
- 'version-update:semver-major'
- 'version-update:semver-minor'
- package-ecosystem: 'docker'
# Look for a `Dockerfile` in the `compose/production/postgres` directory
directory: 'compose/production/postgres/'
# Every weekday
schedule:
interval: 'daily'
- package-ecosystem: 'docker'
# Look for a `Dockerfile` in the `compose/production/traefik` directory
directory: 'compose/production/traefik/'
# Every weekday
schedule:
interval: 'daily'
# Look for a `Dockerfile` in the listed directories
directories:
- 'compose/local/node/'
- 'compose/production/aws/'
- 'compose/production/postgres/'
- 'compose/production/traefik/'
{%- if cookiecutter.cloud_provider == 'None' %}
- package-ecosystem: 'docker'
# Look for a `Dockerfile` in the `compose/production/nginx` directory
directory: 'compose/production/nginx/'
- 'compose/production/nginx/'
{%- endif %}
# Every weekday
schedule:
interval: 'daily'
{%- endif %}
{%- endif %}
# Enable version updates for Python/Pip - Production
- package-ecosystem: 'pip'
# Look for a `requirements.txt` in the `root` directory
# also 'setup.cfg', 'runtime.txt' and 'requirements/*.txt'
# also 'setup.cfg', '.python-version' and 'requirements/*.txt'
directory: '/'
# Every weekday
schedule:
interval: 'daily'
groups:
python:
update-types:
- 'minor'
- 'patch'
{%- if cookiecutter.frontend_pipeline == 'Gulp' %}
@ -113,5 +77,10 @@ updates:
# Every weekday
schedule:
interval: 'daily'
groups:
javascript:
update-types:
- 'minor'
- 'patch'
{%- endif %}

View File

@ -28,7 +28,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
python-version-file: '.python-version'
{%- if cookiecutter.open_source_license != 'Not open source' %}
# Consider using pre-commit.ci for open source project
@ -57,7 +57,7 @@ jobs:
env:
{%- if cookiecutter.use_celery == 'y' %}
CELERY_BROKER_URL: 'redis://localhost:6379/0'
REDIS_URL: 'redis://localhost:6379/0'
{%- endif %}
# postgres://user:password@host:port/database
DATABASE_URL: 'postgres://postgres:postgres@localhost:5432/postgres'
@ -68,11 +68,31 @@ jobs:
uses: actions/checkout@v4
{%- if cookiecutter.use_docker == 'y' %}
- name: Build the Stack
run: docker compose -f docker-compose.local.yml build django
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build the docs
run: docker compose -f docker-compose.docs.yml build docs
- name: Build and cache local backend
uses: docker/bake-action@v6
with:
push: false
load: true
files: docker-compose.local.yml
targets: django
set: |
django.cache-from=type=gha,scope=django-cached-tests
django.cache-to=type=gha,scope=django-cached-tests,mode=max
postgres.cache-from=type=gha,scope=postgres-cached-tests
postgres.cache-to=type=gha,scope=postgres-cached-tests,mode=max
- name: Build and cache docs
uses: docker/bake-action@v6
with:
push: false
load: true
files: docker-compose.docs.yml
set: |
docs.cache-from=type=gha,scope=cached-docs
docs.cache-to=type=gha,scope=cached-docs,mode=max
- name: Check DB Migrations
run: docker compose -f docker-compose.local.yml run --rm django python manage.py makemigrations --check
@ -88,9 +108,9 @@ jobs:
{%- else %}
- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: '3.12'
python-version-file: '.python-version'
cache: pip
cache-dependency-path: |
requirements/base.txt

View File

@ -59,9 +59,6 @@ docs/_build/
# PyBuilder
target/
# pyenv
.python-version
{% if cookiecutter.use_celery == 'y' -%}
# celery beat schedule file
celerybeat-schedule

View File

@ -8,7 +8,7 @@ variables:
POSTGRES_DB: 'test_{{ cookiecutter.project_slug }}'
POSTGRES_HOST_AUTH_METHOD: trust
{%- if cookiecutter.use_celery == 'y' %}
CELERY_BROKER_URL: 'redis://redis:6379/0'
REDIS_URL: 'redis://redis:6379/0'
{%- endif %}
precommit:

View File

@ -1,5 +1,6 @@
exclude: '^docs/|/migrations/|devcontainer.json'
default_stages: [pre-commit]
minimum_pre_commit_version: "3.2.0"
default_language_version:
python: python3.12
@ -28,14 +29,14 @@ repos:
exclude: '{{cookiecutter.project_slug}}/templates/'
- repo: https://github.com/adamchainz/django-upgrade
rev: '1.21.0'
rev: '1.24.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.6.9
rev: v0.11.4
hooks:
# Linter
- id: ruff
@ -44,7 +45,7 @@ repos:
- id: ruff-format
- repo: https://github.com/Riverside-Healthcare/djLint
rev: v1.35.2
rev: v1.36.4
hooks:
- id: djlint-reformat-django
- id: djlint-django

View File

@ -0,0 +1 @@
3.12

View File

@ -12,7 +12,7 @@ License: {{cookiecutter.open_source_license}}
## Settings
Moved to [settings](http://cookiecutter-django.readthedocs.io/en/latest/settings.html).
Moved to [settings](https://cookiecutter-django.readthedocs.io/en/latest/1-getting-started/settings.html).
## Basic Commands
@ -46,7 +46,7 @@ To run the tests, check your test coverage, and generate an HTML coverage report
### Live reloading and Sass CSS compilation
Moved to [Live reloading and SASS compilation](https://cookiecutter-django.readthedocs.io/en/latest/developing-locally.html#sass-compilation-live-reloading).
Moved to [Live reloading and SASS compilation](https://cookiecutter-django.readthedocs.io/en/latest/2-local-development/developing-locally.html#using-webpack-or-gulp).
{%- if cookiecutter.use_celery == "y" %}
@ -87,7 +87,7 @@ celery -A config.celery_app worker -B -l info
In development, it is often nice to be able to see emails that are being sent from your application. For that reason local SMTP server [Mailpit](https://github.com/axllent/mailpit) with a web interface is available as docker container.
Container mailpit will start automatically when you will run all docker containers.
Please check [cookiecutter-django Docker documentation](http://cookiecutter-django.readthedocs.io/en/latest/deployment-with-docker.html) for more details how to start all containers.
Please check [cookiecutter-django Docker documentation](https://cookiecutter-django.readthedocs.io/en/latest/2-local-development/developing-locally-docker.html) for more details how to start all containers.
With Mailpit running, to view messages that are sent by your application, open your browser and go to `http://127.0.0.1:8025`
{%- else %}
@ -130,14 +130,14 @@ The following details how to deploy this application.
### Heroku
See detailed [cookiecutter-django Heroku documentation](http://cookiecutter-django.readthedocs.io/en/latest/deployment-on-heroku.html).
See detailed [cookiecutter-django Heroku documentation](https://cookiecutter-django.readthedocs.io/en/latest/3-deployment/deployment-on-heroku.html).
{%- endif %}
{%- if cookiecutter.use_docker.lower() == "y" %}
### Docker
See detailed [cookiecutter-django Docker documentation](http://cookiecutter-django.readthedocs.io/en/latest/deployment-with-docker.html).
See detailed [cookiecutter-django Docker documentation](https://cookiecutter-django.readthedocs.io/en/latest/3-deployment/deployment-with-docker.html).
{%- endif %}
{%- if cookiecutter.frontend_pipeline in ['Gulp', 'Webpack'] %}

View File

@ -1,5 +1,5 @@
# define an alias for the specific python version used in this file.
FROM docker.io/python:3.12.7-slim-bookworm AS python
FROM docker.io/python:3.12.9-slim-bookworm AS python
# Python build stage
FROM python AS python-build-stage

View File

@ -13,4 +13,4 @@ echo 'Starting flower'
exec watchfiles --filter python celery.__main__.main \
--args \
"-A config.celery_app -b \"${CELERY_BROKER_URL}\" flower --basic_auth=\"${CELERY_FLOWER_USER}:${CELERY_FLOWER_PASSWORD}\""
"-A config.celery_app -b \"${REDIS_URL}\" flower --basic_auth=\"${CELERY_FLOWER_USER}:${CELERY_FLOWER_PASSWORD}\""

View File

@ -1,5 +1,5 @@
# define an alias for the specific python version used in this file.
FROM docker.io/python:3.12.7-slim-bookworm AS python
FROM docker.io/python:3.12.9-slim-bookworm AS python
# Python build stage

View File

@ -1,4 +1,4 @@
FROM docker.io/node:22-bookworm-slim
FROM docker.io/node:22.14-bookworm-slim
WORKDIR /app

View File

@ -1,4 +1,4 @@
FROM docker.io/amazon/aws-cli:2.18.0
FROM docker.io/amazon/aws-cli:2.25.0
# Clear entrypoint from the base image, otherwise it's always calling the aws CLI
ENTRYPOINT []

View File

@ -1,5 +1,5 @@
{% if cookiecutter.frontend_pipeline in ['Gulp', 'Webpack'] -%}
FROM docker.io/node:20-bookworm-slim AS client-builder
FROM docker.io/node:22.14-bookworm-slim AS client-builder
ARG APP_HOME=/app
WORKDIR ${APP_HOME}
@ -25,7 +25,7 @@ RUN npm run build
{%- endif %}
# define an alias for the specific python version used in this file.
FROM docker.io/python:3.12.7-slim-bookworm AS python
FROM docker.io/python:3.12.9-slim-bookworm AS python
# Python build stage
FROM python AS python-build-stage
@ -37,8 +37,8 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
# dependencies for building Python packages
build-essential \
# psycopg dependencies
libpq-dev \
wait-for-it
libpq-dev
# Requirements are installed here to ensure they will be cached.
COPY ./requirements .
@ -61,7 +61,7 @@ ENV BUILD_ENV=${BUILD_ENVIRONMENT}
WORKDIR ${APP_HOME}
RUN addgroup --system django \
&& adduser --system --ingroup django django
&& adduser --system --ingroup django django
# Install required system dependencies
@ -70,6 +70,8 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
libpq-dev \
# Translations dependencies
gettext \
# entrypoint
wait-for-it \
# cleaning up unused files
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
&& rm -rf /var/lib/apt/lists/*
@ -123,9 +125,6 @@ RUN chown -R django:django ${APP_HOME}
USER django
RUN DATABASE_URL="" \
{%- if cookiecutter.use_celery == "y" %}
CELERY_BROKER_URL="" \
{%- endif %}
DJANGO_SETTINGS_MODULE="config.settings.test" \
python manage.py compilemessages

View File

@ -14,6 +14,6 @@ echo 'Starting flower'
exec celery \
-A config.celery_app \
-b "${CELERY_BROKER_URL}" \
-b "${REDIS_URL}" \
flower \
--basic_auth="${CELERY_FLOWER_USER}:${CELERY_FLOWER_PASSWORD}"

View File

@ -4,12 +4,6 @@ set -o errexit
set -o pipefail
set -o nounset
{% if cookiecutter.use_celery == 'y' %}
# N.B. If only .env files supported variable expansion...
export CELERY_BROKER_URL="${REDIS_URL}"
{% endif %}
if [ -z "${POSTGRES_USER}" ]; then
base_postgres_image_default_user='postgres'
export POSTGRES_USER="${base_postgres_image_default_user}"

View File

@ -1,4 +1,4 @@
FROM docker.io/traefik:3.1.5
FROM docker.io/traefik:3.3.5
RUN mkdir -p /etc/traefik/acme \
&& touch /etc/traefik/acme/acme.json \
&& chmod 600 /etc/traefik/acme/acme.json

View File

@ -1,4 +1,3 @@
# ruff: noqa
"""
ASGI config for {{ cookiecutter.project_name }} project.
@ -25,12 +24,9 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
# This application object is used by any ASGI server configured to use this file.
django_application = get_asgi_application()
# Apply ASGI middleware here.
# from helloworld.asgi import HelloWorldApplication
# application = HelloWorldApplication(application)
# Import websocket application here, so apps from django_application are loaded first
from config.websocket import websocket_application
from config.websocket import websocket_application # noqa: E402
async def application(scope, receive, send):

View File

@ -1,6 +1,7 @@
import os
from celery import Celery
from celery.signals import setup_logging
# set the default Django settings module for the 'celery' program.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
@ -13,5 +14,15 @@ app = Celery("{{cookiecutter.project_slug}}")
# should have a `CELERY_` prefix.
app.config_from_object("django.conf:settings", namespace="CELERY")
@setup_logging.connect
def config_loggers(*args, **kwargs):
from logging.config import dictConfig
from django.conf import settings
dictConfig(settings.LOGGING)
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

View File

@ -1,6 +1,9 @@
# ruff: noqa: ERA001, E501
"""Base settings to build other settings files upon."""
{% if cookiecutter.use_celery == 'y' -%}
import ssl
{%- endif %}
from pathlib import Path
import environ
@ -282,6 +285,9 @@ LOGGING = {
"root": {"level": "INFO", "handlers": ["console"]},
}
REDIS_URL = env("REDIS_URL", default="redis://{% if cookiecutter.use_docker == 'y' %}redis{%else%}localhost{% endif %}:6379/0")
REDIS_SSL = REDIS_URL.startswith("rediss://")
{% if cookiecutter.use_celery == 'y' -%}
# Celery
# ------------------------------------------------------------------------------
@ -289,9 +295,13 @@ if USE_TZ:
# https://docs.celeryq.dev/en/stable/userguide/configuration.html#std:setting-timezone
CELERY_TIMEZONE = TIME_ZONE
# https://docs.celeryq.dev/en/stable/userguide/configuration.html#std:setting-broker_url
CELERY_BROKER_URL = env("CELERY_BROKER_URL")
CELERY_BROKER_URL = REDIS_URL
# https://docs.celeryq.dev/en/stable/userguide/configuration.html#redis-backend-use-ssl
CELERY_BROKER_USE_SSL = {"ssl_cert_reqs": ssl.CERT_NONE} if REDIS_SSL else None
# https://docs.celeryq.dev/en/stable/userguide/configuration.html#std:setting-result_backend
CELERY_RESULT_BACKEND = CELERY_BROKER_URL
CELERY_RESULT_BACKEND = REDIS_URL
# https://docs.celeryq.dev/en/stable/userguide/configuration.html#redis-backend-use-ssl
CELERY_REDIS_BACKEND_USE_SSL = CELERY_BROKER_USE_SSL
# https://docs.celeryq.dev/en/stable/userguide/configuration.html#result-extended
CELERY_RESULT_EXTENDED = True
# https://docs.celeryq.dev/en/stable/userguide/configuration.html#result-backend-always-retry
@ -317,18 +327,20 @@ 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://docs.celeryq.dev/en/stable/userguide/configuration.html#worker-hijack-root-logger
CELERY_WORKER_HIJACK_ROOT_LOGGER = False
{%- endif %}
# django-allauth
# ------------------------------------------------------------------------------
ACCOUNT_ALLOW_REGISTRATION = env.bool("DJANGO_ACCOUNT_ALLOW_REGISTRATION", True)
# https://docs.allauth.org/en/latest/account/configuration.html
ACCOUNT_AUTHENTICATION_METHOD = "{{cookiecutter.username_type}}"
ACCOUNT_LOGIN_METHODS = {"{{cookiecutter.username_type}}"}
# https://docs.allauth.org/en/latest/account/configuration.html
ACCOUNT_EMAIL_REQUIRED = True
{%- if cookiecutter.username_type == "email" %}
# https://docs.allauth.org/en/latest/account/configuration.html
ACCOUNT_USERNAME_REQUIRED = False
{%- if cookiecutter.username_type == "username" %}
ACCOUNT_SIGNUP_FIELDS = ["email*", "username*", "password1*", "password2*"]
{%- else %}
ACCOUNT_SIGNUP_FIELDS = ["email*", "password1*", "password2*"]
# https://docs.allauth.org/en/latest/account/configuration.html
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
{%- endif %}

View File

@ -16,6 +16,7 @@ from sentry_sdk.integrations.redis import RedisIntegration
from .base import * # noqa: F403
from .base import DATABASES
from .base import INSTALLED_APPS
from .base import REDIS_URL
{%- if cookiecutter.use_drf == "y" %}
from .base import SPECTACULAR_SETTINGS
{%- endif %}
@ -37,10 +38,10 @@ DATABASES["default"]["CONN_MAX_AGE"] = env.int("CONN_MAX_AGE", default=60)
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": env("REDIS_URL"),
"LOCATION": REDIS_URL,
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
# Mimicing memcache behavior.
# Mimicking memcache behavior.
# https://github.com/jazzband/django-redis#memcached-exceptions-behavior
"IGNORE_EXCEPTIONS": True,
},
@ -170,7 +171,7 @@ STORAGES = {
"BACKEND": "storages.backends.azure_storage.AzureStorage",
"OPTIONS": {
"location": "media",
"file_overwrite": False,
"overwrite_files": False,
},
},
{%- if cookiecutter.use_whitenoise == 'y' %}
@ -323,7 +324,7 @@ COMPRESS_FILTERS = {
"js": ["compressor.filters.jsmin.JSMinFilter"],
}
{% endif %}
{%- if cookiecutter.use_whitenoise == 'n' -%}
{%- if cookiecutter.use_whitenoise == 'n' and cookiecutter.cloud_provider in ('AWS', 'GCP') -%}
# Collectfasta
# ------------------------------------------------------------------------------
# https://github.com/jasongi/collectfasta#installation

View File

@ -33,7 +33,7 @@ TEMPLATES[0]["OPTIONS"]["debug"] = True # type: ignore[index]
# MEDIA
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#media-url
MEDIA_URL = "http://media.testserver"
MEDIA_URL = "http://media.testserver/"
{%- if cookiecutter.frontend_pipeline == 'Webpack' %}
# django-webpack-loader

View File

@ -1,4 +1,3 @@
# ruff: noqa
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
@ -43,7 +42,7 @@ urlpatterns += [
# API base url
path("api/", include("config.api_router")),
# DRF auth token
path("api/auth-token/", obtain_auth_token),
path("api/auth-token/", obtain_auth_token, name="obtain_auth_token"),
path("api/schema/", SpectacularAPIView.as_view(), name="api-schema"),
path(
"api/docs/",
@ -77,4 +76,7 @@ if settings.DEBUG:
if "debug_toolbar" in settings.INSTALLED_APPS:
import debug_toolbar
urlpatterns = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns
urlpatterns = [
path("__debug__/", include(debug_toolbar.urls)),
*urlpatterns,
]

View File

@ -1,4 +1,3 @@
# ruff: noqa
"""
WSGI config for {{ cookiecutter.project_name }} project.
@ -25,16 +24,9 @@ from django.core.wsgi import get_wsgi_application
# {{ cookiecutter.project_slug }} directory.
BASE_DIR = Path(__file__).resolve(strict=True).parent.parent
sys.path.append(str(BASE_DIR / "{{ cookiecutter.project_slug }}"))
# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
# if running multiple sites in the same mod_wsgi process. To fix this, use
# mod_wsgi daemon mode with each site in its own daemon process, or use
# os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings.production"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
application = get_wsgi_application()
# Apply WSGI middleware here.
# from helloworld.wsgi import HelloWorldApplication
# application = HelloWorldApplication(application)

View File

@ -1,4 +1,4 @@
# ruff: noqa
# ruff: noqa: ERA001, PTH100
# Configuration file for the Sphinx documentation builder.
#
# This file only contains a selection of the most common options. For a full
@ -13,9 +13,10 @@
import os
import sys
import django
if os.getenv("READTHEDOCS", default=False) == "True":
if os.getenv("READTHEDOCS", default="False") == "True":
sys.path.insert(0, os.path.abspath(".."))
os.environ["DJANGO_READ_DOT_ENV_FILE"] = "True"
os.environ["USE_DOCKER"] = "no"
@ -26,16 +27,13 @@ else:
sys.path.insert(0, os.path.abspath(".."))
{%- endif %}
os.environ["DATABASE_URL"] = "sqlite:///readthedocs.db"
{%- if cookiecutter.use_celery == 'y' %}
os.environ["CELERY_BROKER_URL"] = os.getenv("REDIS_URL", "redis://redis:6379")
{%- endif %}
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
django.setup()
# -- Project information -----------------------------------------------------
project = "{{ cookiecutter.project_name }}"
copyright = """{% now 'utc', '%Y' %}, {{ cookiecutter.author_name }}"""
copyright = """{% now 'utc', '%Y' %}, {{ cookiecutter.author_name }}""" # noqa: A001
author = "{{ cookiecutter.author_name }}"

View File

@ -3,28 +3,32 @@
////////////////////////////////
// Gulp and package
const { src, dest, parallel, series, watch } = require('gulp');
const pjson = require('./package.json');
import { src, dest, parallel, series, task, watch } from 'gulp';
import pjson from './package.json' with {type: 'json'};
// Plugins
const autoprefixer = require('autoprefixer');
const browserSync = require('browser-sync').create();
const concat = require('gulp-concat');
const tildeImporter = require('node-sass-tilde-importer');
const cssnano = require('cssnano');
const imagemin = require('gulp-imagemin');
const pixrem = require('pixrem');
const plumber = require('gulp-plumber');
const postcss = require('gulp-postcss');
import autoprefixer from 'autoprefixer';
import browserSyncLib from 'browser-sync';
import concat from 'gulp-concat';
import tildeImporter from 'node-sass-tilde-importer';
import cssnano from 'cssnano';
import pixrem from 'pixrem';
import plumber from 'gulp-plumber';
import postcss from 'gulp-postcss';
import rename from 'gulp-rename';
import gulpSass from 'gulp-sass';
import * as dartSass from 'sass';
import gulUglifyES from 'gulp-uglify-es';
import { spawn } from 'node:child_process';
const browserSync = browserSyncLib.create();
const reload = browserSync.reload;
const rename = require('gulp-rename');
const sass = require('gulp-sass')(require('sass'));
const spawn = require('child_process').spawn;
const uglify = require('gulp-uglify-es').default;
const sass = gulpSass(dartSass);
const uglify = gulUglifyES.default;
// Relative paths function
function pathsConfig(appName) {
this.app = `./${pjson.name}`;
function pathsConfig() {
const appName = `./${pjson.name}`;
const vendorsRoot = 'node_modules';
return {
@ -32,13 +36,13 @@ function pathsConfig(appName) {
`${vendorsRoot}/@popperjs/core/dist/umd/popper.js`,
`${vendorsRoot}/bootstrap/dist/js/bootstrap.js`,
],
app: this.app,
templates: `${this.app}/templates`,
css: `${this.app}/static/css`,
sass: `${this.app}/static/sass`,
fonts: `${this.app}/static/fonts`,
images: `${this.app}/static/images`,
js: `${this.app}/static/js`,
app: appName,
templates: `${appName}/templates`,
css: `${appName}/static/css`,
sass: `${appName}/static/sass`,
fonts: `${appName}/static/fonts`,
images: `${appName}/static/images`,
js: `${appName}/static/js`,
};
}
@ -95,7 +99,8 @@ function vendorScripts() {
}
// Image compression
function imgCompression() {
async function imgCompression() {
const imagemin = (await import("gulp-imagemin")).default;
return src(`${paths.images}/*`)
.pipe(imagemin()) // Compresses PNG, JPEG, GIF and SVG images
.pipe(dest(paths.images));
@ -163,7 +168,7 @@ function watchPaths() {
}
// Generate all assets
const generateAssets = parallel(styles, scripts, vendorScripts, imgCompression);
const build = parallel(styles, scripts, vendorScripts, imgCompression);
// Set up dev environment
{%- if cookiecutter.use_docker == 'n' %}
@ -176,6 +181,6 @@ const dev = parallel(runServer, initBrowserSync, watchPaths);
const dev = parallel(initBrowserSync, watchPaths);
{%- endif %}
exports.default = series(generateAssets, dev);
exports['generate-assets'] = generateAssets;
exports['dev'] = dev;
task('default', series(build, dev));
task('build', build);
task('dev', dev);

View File

@ -0,0 +1,38 @@
export COMPOSE_FILE := "docker-compose.local.yml"
## Just does not yet manage signals for subprocesses reliably, which can lead to unexpected behavior.
## Exercise caution before expanding its usage in production environments.
## For more information, see https://github.com/casey/just/issues/2473 .
# Default command to list all available commands.
default:
@just --list
# build: Build python image.
build:
@echo "Building python image..."
@docker compose build
# up: Start up containers.
up:
@echo "Starting up containers..."
@docker compose up -d --remove-orphans
# down: Stop containers.
down:
@echo "Stopping containers..."
@docker compose down
# prune: Remove containers and their volumes.
prune *args:
@echo "Killing containers and removing volumes..."
@docker compose down -v {{ "{{args}}" }}
# logs: View container logs
logs *args:
@docker compose logs -f {{ "{{args}}" }}
# manage: Executes `manage.py` command.
manage +args:
@docker compose run --rm django python ./manage.py {{ "{{args}}" }}

View File

@ -1,6 +1,6 @@
# Translations
Start by configuring the `LANGUAGES` settings in `base.py`, by uncommenting languages you are willing to support. Then, translations strings will be placed in this folder when running:
Start by configuring the `LANGUAGES` settings in `base.py`, by uncommenting languages you are willing to support. Then, translation strings will be placed in this folder when running:
```bash
{% if cookiecutter.use_docker == 'y' %}docker compose -f docker-compose.local.yml run --rm django {% endif %}python manage.py makemessages --all --no-location
@ -19,7 +19,7 @@ Once all translations are done, they need to be compiled into `.mo` files (stand
{% if cookiecutter.use_docker == 'y' %}docker compose -f docker-compose.local.yml run --rm django {% endif %}python manage.py compilemessages
```
Note that the `.po` files are NOT used by the application directly, so if the `.mo` files are out of dates, the content won't appear as translated even if the `.po` files are up-to-date.
Note that the `.po` files are NOT used by the application directly, so if the `.mo` files are out of date, the content won't appear as translated even if the `.po` files are up-to-date.
## Production

View File

@ -1,28 +1,22 @@
#!/usr/bin/env python
# ruff: noqa
"""Django's command-line utility for administrative tasks."""
import os
import sys
from pathlib import Path
if __name__ == "__main__":
def main():
"""Run administrative tasks."""
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
try:
from django.core.management import execute_from_command_line
except ImportError:
# The above import may fail for some other reason. Ensure that the
# issue is really that Django is missing to avoid masking other
# exceptions on Python 2.
try:
import django
except ImportError:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
)
raise
except ImportError as exc:
raise ImportError( # noqa: TRY003
"Couldn't import Django. Are you sure it's installed and " # noqa: EM101
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?",
) from exc
# This allows easy placement of apps within the interior
# {{ cookiecutter.project_slug }} directory.
@ -30,3 +24,7 @@ if __name__ == "__main__":
sys.path.append(str(current_path / "{{ cookiecutter.project_slug }}"))
execute_from_command_line(sys.argv)
if __name__ == "__main__":
main()

View File

@ -1,5 +1,3 @@
# ruff: noqa
import os
from collections.abc import Sequence
from pathlib import Path
@ -19,7 +17,7 @@ def merge(
merged_content = ""
for merge_file in files_to_merge:
merged_content += merge_file.read_text()
merged_content += os.linesep
merged_content += "\n"
output_file.write_text(merged_content)

View File

@ -6,15 +6,15 @@
"@babel/preset-env": "^7.16.5",
"@popperjs/core": "^2.10.2",
"autoprefixer": "^10.4.0",
"babel-loader": "^9.1.2",
"babel-loader": "^10.0.0",
"bootstrap": "^5.2.3",
"browser-sync": "^3.0.2",
"css-loader": "^7.1.2",
"gulp-concat": "^2.6.1",
"concurrently": "^9.0.0",
"cssnano": "^7.0.0",
"gulp": "^4.0.2",
"gulp-imagemin": "^7.1.0",
"gulp": "^5.0.0",
"gulp-imagemin": "^9.1.0",
"gulp-plumber": "^1.2.1",
"gulp-postcss": "^10.0.0",
"gulp-rename": "^2.0.0",
@ -26,16 +26,16 @@
"postcss": "^8.3.11",
"postcss-loader": "^8.0.0",
"postcss-preset-env": "^10.0.3",
"sass": "^1.43.4",
"sass": "1.77.6",
"sass-loader": "^16.0.1",
"webpack": "^5.65.0",
"webpack": "^5.82.0",
"webpack-bundle-tracker": "^3.0.1",
"webpack-cli": "^5.0.1",
"webpack-cli": "^6.0.1",
"webpack-dev-server": "^5.0.2",
"webpack-merge": "^6.0.1"
},
"engines": {
"node": "22"
"node": "22.14"
},
"browserslist": [
"last 2 versions"

View File

@ -106,7 +106,7 @@ select = [
"SLOT",
"SIM",
"TID",
"TCH",
"TC",
"INT",
# "ARG", # Unused function argument
"PTH",
@ -135,7 +135,7 @@ ignore = [
# The fixes in extend-unsafe-fixes will require
# provide the `--unsafe-fixes` flag when fixing.
extend-unsafe-fixes = [
"UP038",
"UP038",
]
[tool.ruff.lint.isort]

View File

@ -1,5 +1,5 @@
python-slugify==8.0.4 # https://github.com/un33k/python-slugify
Pillow==10.4.0 # https://github.com/python-pillow/Pillow
Pillow==11.1.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
@ -9,42 +9,42 @@ rcssmin==1.1.2 # https://github.com/ndparker/rcssmin
{%- endif %}
argon2-cffi==23.1.0 # https://github.com/hynek/argon2_cffi
{%- if cookiecutter.use_whitenoise == 'y' %}
whitenoise==6.7.0 # https://github.com/evansd/whitenoise
whitenoise==6.9.0 # https://github.com/evansd/whitenoise
{%- endif %}
redis==5.1.1 # https://github.com/redis/redis-py
redis==5.2.1 # https://github.com/redis/redis-py
{%- if cookiecutter.use_docker == "y" or cookiecutter.windows == "n" %}
hiredis==3.0.0 # https://github.com/redis/hiredis-py
hiredis==3.1.0 # https://github.com/redis/hiredis-py
{%- endif %}
{%- if cookiecutter.use_celery == "y" %}
celery==5.4.0 # pyup: < 6.0 # https://github.com/celery/celery
celery==5.5.0 # pyup: < 6.0 # https://github.com/celery/celery
django-celery-beat==2.7.0 # 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.31.0 # https://github.com/encode/uvicorn
uvicorn-worker==0.2.0 # https://github.com/Kludex/uvicorn-worker
uvicorn[standard]==0.34.0 # https://github.com/encode/uvicorn
uvicorn-worker==0.3.0 # https://github.com/Kludex/uvicorn-worker
{%- endif %}
# Django
# ------------------------------------------------------------------------------
django==5.0.9 # pyup: < 5.1 # https://www.djangoproject.com/
django-environ==0.11.2 # https://github.com/joke2k/django-environ
django==5.1.8 # 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.0.2 # https://github.com/pennersr/django-allauth
django-allauth[mfa]==65.7.0 # https://github.com/pennersr/django-allauth
django-crispy-forms==2.3 # https://github.com/django-crispy-forms/django-crispy-forms
crispy-bootstrap5==2024.10 # https://github.com/django-crispy-forms/crispy-bootstrap5
crispy-bootstrap5==2025.4 # 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
{%- if cookiecutter.use_drf == 'y' %}
# Django REST Framework
djangorestframework==3.15.2 # https://github.com/encode/django-rest-framework
django-cors-headers==4.4.0 # https://github.com/adamchainz/django-cors-headers
djangorestframework==3.16.0 # 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.27.2 # https://github.com/tfranzel/drf-spectacular
drf-spectacular==0.28.0 # https://github.com/tfranzel/drf-spectacular
{%- endif %}
{%- if cookiecutter.frontend_pipeline == 'Webpack' %}
django-webpack-loader==3.1.1 # https://github.com/django-webpack/django-webpack-loader

View File

@ -1,44 +1,43 @@
-r production.txt
watchdog==4.0.2 # https://github.com/gorakhargosh/watchdog
Werkzeug[watchdog]==3.0.4 # https://github.com/pallets/werkzeug
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.6 # https://github.com/psycopg/psycopg
{%- else %}
psycopg[binary]==3.2.3 # https://github.com/psycopg/psycopg
psycopg[binary]==3.2.6 # https://github.com/psycopg/psycopg
{%- endif %}
{%- if cookiecutter.use_async == 'y' or cookiecutter.use_celery == 'y' %}
watchfiles==0.24.0 # https://github.com/samuelcolvin/watchfiles
watchfiles==1.0.4 # https://github.com/samuelcolvin/watchfiles
{%- endif %}
# Testing
# ------------------------------------------------------------------------------
mypy==1.11.2 # https://github.com/python/mypy
django-stubs[compatible-mypy]==5.1.0 # https://github.com/typeddjango/django-stubs
pytest==8.3.3 # https://github.com/pytest-dev/pytest
pytest-sugar==1.0.0 # https://github.com/Frozenball/pytest-sugar
mypy==1.15.0 # https://github.com/python/mypy
django-stubs[compatible-mypy]==5.1.3 # https://github.com/typeddjango/django-stubs
pytest==8.3.5 # https://github.com/pytest-dev/pytest
pytest-sugar==1.0.0 # https://github.com/Teemu/pytest-sugar
{%- if cookiecutter.use_drf == "y" %}
djangorestframework-stubs==3.15.1 # https://github.com/typeddjango/djangorestframework-stubs
djangorestframework-stubs==3.15.3 # https://github.com/typeddjango/djangorestframework-stubs
{%- endif %}
# Documentation
# ------------------------------------------------------------------------------
sphinx==8.0.2 # https://github.com/sphinx-doc/sphinx
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
# Code quality
# ------------------------------------------------------------------------------
ruff==0.6.9 # https://github.com/astral-sh/ruff
coverage==7.6.1 # https://github.com/nedbat/coveragepy
djlint==1.35.2 # https://github.com/Riverside-Healthcare/djLint
pre-commit==4.0.0 # https://github.com/pre-commit/pre-commit
ruff==0.11.4 # https://github.com/astral-sh/ruff
coverage==7.8.0 # 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
# Django
# ------------------------------------------------------------------------------
factory-boy==3.3.1 # https://github.com/FactoryBoy/factory_boy
factory-boy==3.3.2 # https://github.com/FactoryBoy/factory_boy
django-debug-toolbar==4.4.6 # https://github.com/jazzband/django-debug-toolbar
django-debug-toolbar==5.1.0 # 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
pytest-django==4.11.1 # https://github.com/pytest-dev/pytest-django

View File

@ -3,42 +3,42 @@
-r base.txt
gunicorn==23.0.0 # https://github.com/benoitc/gunicorn
psycopg[c]==3.2.3 # https://github.com/psycopg/psycopg
{%- if cookiecutter.use_whitenoise == 'n' %}
Collectfasta==3.2.0 # https://github.com/jasongi/collectfasta
psycopg[c]==3.2.6 # https://github.com/psycopg/psycopg
{%- if cookiecutter.use_whitenoise == 'n'and cookiecutter.cloud_provider in ('AWS', 'GCP') %}
Collectfasta==3.2.1 # https://github.com/jasongi/collectfasta
{%- endif %}
{%- if cookiecutter.use_sentry == "y" %}
sentry-sdk==2.15.0 # https://github.com/getsentry/sentry-python
sentry-sdk==2.25.1 # https://github.com/getsentry/sentry-python
{%- endif %}
{%- if cookiecutter.use_docker == "n" and cookiecutter.windows == "y" %}
hiredis==3.0.0 # https://github.com/redis/hiredis-py
hiredis==3.1.0 # https://github.com/redis/hiredis-py
{%- endif %}
# Django
# ------------------------------------------------------------------------------
{%- if cookiecutter.cloud_provider == 'AWS' %}
django-storages[s3]==1.14.4 # https://github.com/jschneier/django-storages
django-storages[s3]==1.14.6 # https://github.com/jschneier/django-storages
{%- elif cookiecutter.cloud_provider == 'GCP' %}
django-storages[google]==1.14.4 # https://github.com/jschneier/django-storages
django-storages[google]==1.14.6 # https://github.com/jschneier/django-storages
{%- elif cookiecutter.cloud_provider == 'Azure' %}
django-storages[azure]==1.14.4 # https://github.com/jschneier/django-storages
django-storages[azure]==1.14.6 # https://github.com/jschneier/django-storages
{%- endif %}
{%- if cookiecutter.mail_service == 'Mailgun' %}
django-anymail[mailgun]==12.0 # https://github.com/anymail/django-anymail
django-anymail[mailgun]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Amazon SES' %}
django-anymail[amazon-ses]==12.0 # https://github.com/anymail/django-anymail
django-anymail[amazon-ses]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Mailjet' %}
django-anymail[mailjet]==12.0 # https://github.com/anymail/django-anymail
django-anymail[mailjet]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Mandrill' %}
django-anymail[mandrill]==12.0 # https://github.com/anymail/django-anymail
django-anymail[mandrill]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Postmark' %}
django-anymail[postmark]==12.0 # https://github.com/anymail/django-anymail
django-anymail[postmark]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Sendgrid' %}
django-anymail[sendgrid]==12.0 # https://github.com/anymail/django-anymail
django-anymail[sendgrid]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Brevo' %}
django-anymail[brevo]==12.0 # https://github.com/anymail/django-anymail
django-anymail[brevo]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'SparkPost' %}
django-anymail[sparkpost]==12.0 # https://github.com/anymail/django-anymail
django-anymail[sparkpost]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Other SMTP' %}
django-anymail==12.0 # https://github.com/anymail/django-anymail
django-anymail==13.0 # https://github.com/anymail/django-anymail
{%- endif %}

View File

@ -1 +0,0 @@
python-3.12.7

View File

@ -0,0 +1,23 @@
##basic build dependencies of various Django apps for Debian Bookworm 12.x
#build-essential metapackage install: make, gcc, g++,
build-essential
#required to translate
gettext
python3-dev
##shared dependencies of:
##Pillow, pylibmc
zlib1g-dev
##Postgresql and psycopg dependencies
libpq-dev
##Pillow dependencies
libtiff5-dev
libjpeg62-turbo-dev
libfreetype6-dev
liblcms2-dev
libwebp-dev
##django-extensions
libgraphviz-dev

View File

@ -1,5 +1,5 @@
"""
To understand why this file is here, please read:
http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
https://cookiecutter-django.readthedocs.io/en/latest/5-help/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
"""

View File

@ -1,5 +1,5 @@
"""
To understand why this file is here, please read:
http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
https://cookiecutter-django.readthedocs.io/en/latest/5-help/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
"""

View File

@ -1,7 +1,7 @@
"""
To understand why this file is here, please read:
http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
https://cookiecutter-django.readthedocs.io/en/latest/5-help/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
"""
from django.conf import settings
from django.db import migrations

View File

@ -1,5 +1,5 @@
"""
To understand why this file is here, please read:
http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
https://cookiecutter-django.readthedocs.io/en/latest/5-help/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
"""

View File

@ -17,7 +17,7 @@ class UserAdminChangeForm(admin_forms.UserChangeForm):
{%- endif %}
class UserAdminCreationForm(admin_forms.UserCreationForm):
class UserAdminCreationForm(admin_forms.AdminUserCreationForm): # type: ignore[name-defined] # django-stubs is missing the class, thats why the error is thrown: typeddjango/django-stubs#2555
"""
Form for User Creation in the Admin Area.
To change user signup, see UserSignupForm and UserSocialSignupForm.

View File

@ -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