From 6630e83522f016148d0edea1b5ec6e559f82aaa2 Mon Sep 17 00:00:00 2001
From: Steven Bal <steven@maykinmedia.nl>
Date: Thu, 2 Jan 2025 15:34:38 +0100
Subject: [PATCH 1/2] :wrench: [maykinmedia/open-api-framework#81] Switch from
 pip-compile to UV

---
 .github/workflows/oaf-check.yml |   2 +-
 bin/compile_dependencies.bat    |  29 --
 bin/compile_dependencies.sh     |  33 +-
 requirements/base.txt           |  25 +-
 requirements/ci.txt             | 161 ++++++--
 requirements/dev.in             |   3 +
 requirements/dev.txt            | 638 ++++++++++++++++++++++----------
 requirements/{ci.in => docs.in} |   4 +-
 requirements/test-tools.in      |   5 +
 9 files changed, 617 insertions(+), 283 deletions(-)
 delete mode 100644 bin/compile_dependencies.bat
 rename requirements/{ci.in => docs.in} (73%)

diff --git a/.github/workflows/oaf-check.yml b/.github/workflows/oaf-check.yml
index 9dc8bf35..e4ad2a4e 100644
--- a/.github/workflows/oaf-check.yml
+++ b/.github/workflows/oaf-check.yml
@@ -23,7 +23,7 @@ jobs:
           cache: 'pip'
           cache-dependency-path: 'requirements/dev.txt'
       - name: Install dependencies
-        run: pip install $(grep "pip-tools==" requirements/dev.txt)
+        run: pip install uv
       - name: Run compile dependencies
         run: ./bin/compile_dependencies.sh --upgrade-package open-api-framework
 
diff --git a/bin/compile_dependencies.bat b/bin/compile_dependencies.bat
deleted file mode 100644
index 08293fb5..00000000
--- a/bin/compile_dependencies.bat
+++ /dev/null
@@ -1,29 +0,0 @@
-@echo off
-
-for /F "tokens=1" %%i in ('git rev-parse --show-toplevel') do set toplevel=%%i
-
-cd %toplevel%
-
-REM Base deps
-pip-compile^
-    --no-emit-index-url^
-    %*^
-    requirements/base.in
-
-REM Dependencies for testing
-pip-compile^
-    --no-emit-index-url^
-    --output-file requirements/ci.txt^
-    %*^
-    requirements/base.txt^
-    requirements/test-tools.in^
-    requirements/ci.in
-
-REM Dev depedencies
-pip-compile^
-    --no-emit-index-url^
-    --output-file requirements/dev.txt^
-    %*^
-    requirements/base.txt^
-    requirements/test-tools.in^
-    requirements/dev.in
diff --git a/bin/compile_dependencies.sh b/bin/compile_dependencies.sh
index 829b73c9..4c5fc48e 100755
--- a/bin/compile_dependencies.sh
+++ b/bin/compile_dependencies.sh
@@ -1,5 +1,4 @@
-#!/bin/bash
-
+#!/bin/sh
 #
 # Compile the dependencies for production, CI and development.
 #
@@ -7,38 +6,38 @@
 #
 #     ./bin/compile_dependencies.sh
 #
-# Any extra flags/arguments passed to this wrapper script are passed down to pip-compile.
+# Any extra flags/arguments passed to this wrapper script are passed down to uv pip compile.
 # E.g. to update a package:
 #
 #     ./bin/compile_dependencies.sh --upgrade-package django
-
-
 set -ex
 
+command -v uv || (echo "uv not found on PATH. Install it https://astral.sh/uv" >&2 && exit 1)
+
+cwd="${PWD}"
 toplevel=$(git rev-parse --show-toplevel)
 
-cd $toplevel
+cd "${toplevel}"
+
+export UV_CUSTOM_COMPILE_COMMAND="./bin/compile_dependencies.sh"
 
 # Base (& prod) deps
-pip-compile \
-    --no-emit-index-url \
+uv pip compile \
+    --output-file requirements/base.txt \
     "$@" \
     requirements/base.in
 
 # Dependencies for testing
-pip-compile \
-    --no-emit-index-url \
+uv pip compile \
     --output-file requirements/ci.txt \
     "$@" \
-    requirements/base.txt \
     requirements/test-tools.in \
-    requirements/ci.in
+    requirements/docs.in
 
-# Dev depedencies
-pip-compile \
-    --no-emit-index-url \
+# Dev depedencies - exact same set as CI + some extra tooling
+uv pip compile \
     --output-file requirements/dev.txt \
     "$@" \
-    requirements/base.txt \
-    requirements/test-tools.in \
     requirements/dev.in
+
+cd "${cwd}"
diff --git a/requirements/base.txt b/requirements/base.txt
index 47cb62e8..6944537f 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -1,9 +1,5 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-#    pip-compile --no-emit-index-url requirements/base.in
-#
+# This file was autogenerated by uv via the following command:
+#    ./bin/compile_dependencies.sh
 amqp==5.2.0
     # via kombu
 annotated-types==0.7.0
@@ -169,7 +165,7 @@ django-solo==2.2.0
     #   mozilla-django-oidc-db
     #   notifications-api-common
     #   zgw-consumers
-django-two-factor-auth[phonenumberslite,webauthn]==1.17.0
+django-two-factor-auth==1.17.0
     # via maykin-2fa
 djangorestframework==3.15.2
     # via
@@ -191,7 +187,7 @@ djangorestframework-inclusions==1.2.0
     # via open-api-framework
 drf-nested-routers==0.94.1
     # via commonground-api-common
-drf-spectacular[sidecar]==0.27.2
+drf-spectacular==0.27.2
     # via open-api-framework
 drf-spectacular-sidecar==2024.7.1
     # via drf-spectacular
@@ -244,11 +240,11 @@ maykin-2fa==1.0.1
     # via open-api-framework
 mozilla-django-oidc==4.0.0
     # via mozilla-django-oidc-db
-mozilla-django-oidc-db[setup-configuration]==0.21.1
+mozilla-django-oidc-db==0.21.1
     # via
     #   -r requirements/base.in
     #   open-api-framework
-notifications-api-common[setup-configuration]==0.4.0
+notifications-api-common==0.4.0
     # via
     #   -r requirements/base.in
     #   commonground-api-common
@@ -276,7 +272,7 @@ pydantic==2.9.2
     #   pydantic-settings
 pydantic-core==2.23.4
     # via pydantic
-pydantic-settings[yaml]==2.6.1
+pydantic-settings==2.6.1
     # via django-setup-configuration
 pyjwt==2.4.0
     # via
@@ -327,6 +323,8 @@ requests-mock==1.12.1
     # via commonground-api-common
 sentry-sdk==2.12.0
     # via open-api-framework
+setuptools==75.6.0
+    # via josepy
 six==1.16.0
     # via
     #   bleach
@@ -372,12 +370,9 @@ webencodings==0.5.1
     # via bleach
 wrapt==1.14.1
     # via elastic-apm
-zgw-consumers[setup-configuration]==0.36.1
+zgw-consumers==0.36.1
     # via
     #   -r requirements/base.in
     #   commonground-api-common
     #   notifications-api-common
     #   open-api-framework
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/requirements/ci.txt b/requirements/ci.txt
index af40972f..bee0fc74 100644
--- a/requirements/ci.txt
+++ b/requirements/ci.txt
@@ -1,37 +1,39 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-#    pip-compile --no-emit-index-url --output-file=requirements/ci.txt requirements/base.txt requirements/ci.in requirements/test-tools.in
-#
+# This file was autogenerated by uv via the following command:
+#    ./bin/compile_dependencies.sh
 alabaster==0.7.16
     # via sphinx
 amqp==5.2.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   kombu
 annotated-types==0.7.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   pydantic
 ape-pie==0.2.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
     #   notifications-api-common
     #   zgw-consumers
 asgiref==3.7.2
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django
     #   django-axes
     #   django-cors-headers
 asn1crypto==1.5.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   webauthn
 attrs==20.3.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   glom
     #   jsonschema
@@ -41,31 +43,37 @@ beautifulsoup4==4.9.3
     # via webtest
 billiard==4.2.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   celery
 black==24.8.0
     # via -r requirements/test-tools.in
 bleach==6.1.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 boltons==21.0.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   face
     #   glom
 cbor2==5.6.2
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   webauthn
 celery==5.4.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   flower
     #   notifications-api-common
     #   open-api-framework
 certifi==2024.7.4
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-simple-certmanager
     #   elastic-apm
@@ -73,14 +81,17 @@ certifi==2024.7.4
     #   sentry-sdk
 cffi==1.16.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   cryptography
 charset-normalizer==3.3.2
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   requests
 click==8.1.7
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   black
     #   celery
@@ -89,30 +100,36 @@ click==8.1.7
     #   click-repl
 click-didyoumean==0.3.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   celery
 click-plugins==1.1.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   celery
 click-repl==0.3.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   celery
 codecov==2.1.13
-    # via -r requirements/ci.in
+    # via -r requirements/test-tools.in
 commonground-api-common==2.1.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 commonmark==0.9.1
     # via recommonmark
 coreapi==2.3.3
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
 coreschema==0.0.4
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   coreapi
 coverage==4.5.4
@@ -121,6 +138,7 @@ coverage==4.5.4
     #   codecov
 cryptography==42.0.4
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-simple-certmanager
     #   josepy
@@ -131,6 +149,7 @@ cssselect==1.1.0
     # via pyquery
 django==4.2.15
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
     #   django-admin-index
@@ -169,109 +188,130 @@ django==4.2.15
     #   zgw-consumers
 django-admin-index==3.1.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 django-appconf==1.0.6
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-log-outgoing-requests
 django-axes==6.5.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 django-cors-headers==4.4.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 django-csp==3.8
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 django-filter==24.2
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
     #   open-api-framework
 django-formtools==2.3
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-two-factor-auth
 django-jsonform==2.22.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   mozilla-django-oidc-db
     #   open-api-framework
 django-log-outgoing-requests==0.6.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 django-markup==1.8.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 django-ordered-model==3.7.4
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-admin-index
 django-otp==1.0.6
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-two-factor-auth
 django-phonenumber-field==5.2.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-two-factor-auth
 django-privates==2.0.0.post0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-simple-certmanager
 django-redis==5.4.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 django-relativedelta==2.0.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   zgw-consumers
 django-rest-framework-condition==0.1.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
 django-sendfile2==0.7.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-privates
 django-sessionprofile==3.0.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 django-setup-configuration==0.5.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
-    #   mozilla-django-oidc-db
-    #   notifications-api-common
     #   open-api-framework
-    #   zgw-consumers
 django-simple-certmanager==1.4.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   zgw-consumers
 django-solo==2.2.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
     #   django-log-outgoing-requests
     #   mozilla-django-oidc-db
     #   notifications-api-common
     #   zgw-consumers
-django-two-factor-auth[phonenumberslite,webauthn]==1.17.0
+django-two-factor-auth==1.17.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   maykin-2fa
 django-webtest==1.9.7
     # via -r requirements/test-tools.in
 djangorestframework==3.15.2
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
     #   djangorestframework-gis
@@ -283,15 +323,18 @@ djangorestframework==3.15.2
     #   open-api-framework
 djangorestframework-camel-case==1.4.2
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
     #   notifications-api-common
 djangorestframework-gis==1.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 djangorestframework-inclusions==1.2.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 docutils==0.18.1
@@ -302,30 +345,37 @@ docutils==0.18.1
     #   sphinx-tabs
 drf-nested-routers==0.94.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
-drf-spectacular[sidecar]==0.27.2
+drf-spectacular==0.27.2
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 drf-spectacular-sidecar==2024.7.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   drf-spectacular
 drf-yasg==1.21.7
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
 ecs-logging==2.1.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   elastic-apm
 elastic-apm==6.23.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 face==20.1.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   glom
 factory-boy==3.2.0
@@ -336,25 +386,29 @@ flake8==7.1.1
     # via -r requirements/test-tools.in
 flower==2.0.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 freezegun==1.1.0
     # via -r requirements/test-tools.in
 furl==2.1.3
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   ape-pie
-    #   notifications-api-common
 glom==23.5.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   mozilla-django-oidc-db
 humanize==4.9.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   flower
 idna==3.7
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   requests
     #   yarl
@@ -362,6 +416,7 @@ imagesize==1.4.1
     # via sphinx
 inflection==0.5.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   drf-spectacular
     #   drf-yasg
@@ -369,75 +424,92 @@ iniconfig==2.0.0
     # via pytest
 iso-639==0.4.5
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
 isodate==0.6.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
 isort==5.13.2
     # via -r requirements/test-tools.in
 itypes==1.2.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   coreapi
 jinja2==3.1.4
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   coreschema
     #   sphinx
 josepy==1.9.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   mozilla-django-oidc
 jsonschema==4.17.3
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   drf-spectacular
 kombu==5.3.5
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   celery
 lxml==4.9.4
     # via pyquery
 markupsafe==2.1.3
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   jinja2
 maykin-2fa==1.0.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 mccabe==0.7.0
     # via flake8
 mozilla-django-oidc==4.0.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   mozilla-django-oidc-db
-mozilla-django-oidc-db[setup-configuration]==0.21.1
+mozilla-django-oidc-db==0.21.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 multidict==6.0.5
     # via yarl
 mypy-extensions==1.0.0
     # via black
-notifications-api-common[setup-configuration]==0.4.0
+notifications-api-common==0.4.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
 open-api-framework==0.9.1
-    # via -r requirements/base.txt
+    # via
+    #   -c requirements/base.txt
+    #   -r requirements/base.txt
 orderedmultidict==1.0.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   furl
 oyaml==1.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
 packaging==23.2
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   black
     #   drf-yasg
@@ -447,6 +519,7 @@ pathspec==0.12.1
     # via black
 phonenumberslite==8.13.30
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-two-factor-auth
 platformdirs==4.3.3
@@ -455,33 +528,40 @@ pluggy==1.5.0
     # via pytest
 prometheus-client==0.20.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   flower
 prompt-toolkit==3.0.43
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   click-repl
 psycopg2==2.9.9
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 pycodestyle==2.12.1
     # via flake8
 pycparser==2.20
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   cffi
 pydantic==2.9.2
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-setup-configuration
     #   pydantic-settings
 pydantic-core==2.23.4
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   pydantic
-pydantic-settings[yaml]==2.6.1
+pydantic-settings==2.6.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-setup-configuration
 pyflakes==3.2.0
@@ -492,11 +572,13 @@ pygments==2.18.0
     #   sphinx-tabs
 pyjwt==2.4.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
     #   zgw-consumers
 pyopenssl==24.0.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-simple-certmanager
     #   josepy
@@ -505,12 +587,14 @@ pyquery==1.4.3
     # via -r requirements/test-tools.in
 pyrsistent==0.17.3
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   jsonschema
 pytest==8.3.3
-    # via -r requirements/ci.in
+    # via -r requirements/test-tools.in
 python-dateutil==2.9.0.post0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   celery
     #   django-relativedelta
@@ -518,20 +602,24 @@ python-dateutil==2.9.0.post0
     #   freezegun
 python-decouple==3.8
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 python-dotenv==1.0.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
     #   pydantic-settings
 pytz==2024.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   drf-yasg
     #   flower
 pyyaml==6.0.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   drf-spectacular
     #   drf-yasg
@@ -540,16 +628,19 @@ pyyaml==6.0.1
     #   vcrpy
 qrcode==6.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-two-factor-auth
 recommonmark==0.7.1
-    # via -r requirements/ci.in
+    # via -r requirements/docs.in
 redis==3.5.3
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-redis
 requests==2.32.3
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   ape-pie
     #   codecov
@@ -563,15 +654,23 @@ requests==2.32.3
     #   zgw-consumers
 requests-mock==1.12.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   -r requirements/test-tools.in
     #   commonground-api-common
 sentry-sdk==2.12.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
+setuptools==75.6.0
+    # via
+    #   -c requirements/base.txt
+    #   -r requirements/base.txt
+    #   josepy
 six==1.16.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   bleach
     #   furl
@@ -586,15 +685,15 @@ soupsieve==2.2.1
     # via beautifulsoup4
 sphinx==7.1.2
     # via
-    #   -r requirements/ci.in
+    #   -r requirements/docs.in
     #   recommonmark
     #   sphinx-rtd-theme
     #   sphinx-tabs
     #   sphinxcontrib-jquery
 sphinx-rtd-theme==2.0.0
-    # via -r requirements/ci.in
+    # via -r requirements/docs.in
 sphinx-tabs==3.4.4
-    # via -r requirements/ci.in
+    # via -r requirements/docs.in
 sphinxcontrib-applehelp==2.0.0
     # via sphinx
 sphinxcontrib-devhelp==2.0.0
@@ -611,6 +710,7 @@ sphinxcontrib-serializinghtml==2.0.0
     # via sphinx
 sqlparse==0.5.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django
 tblib==1.7.0
@@ -619,10 +719,12 @@ text-unidecode==1.3
     # via faker
 tornado==6.4.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   flower
 typing-extensions==4.9.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   mozilla-django-oidc-db
     #   pydantic
@@ -630,28 +732,33 @@ typing-extensions==4.9.0
     #   zgw-consumers
 tzdata==2024.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   celery
 uritemplate==3.0.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   coreapi
     #   drf-spectacular
     #   drf-yasg
 urllib3==2.2.2
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   elastic-apm
     #   requests
     #   sentry-sdk
 uwsgi==2.0.23
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   open-api-framework
 vcrpy==6.0.1
     # via -r requirements/test-tools.in
 vine==5.1.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   amqp
     #   celery
@@ -660,14 +767,17 @@ waitress==2.1.2
     # via webtest
 wcwidth==0.2.13
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   prompt-toolkit
 webauthn==2.0.0
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   django-two-factor-auth
 webencodings==0.5.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   bleach
 webob==1.8.8
@@ -676,17 +786,16 @@ webtest==2.0.35
     # via django-webtest
 wrapt==1.14.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   elastic-apm
     #   vcrpy
 yarl==1.9.4
     # via vcrpy
-zgw-consumers[setup-configuration]==0.36.1
+zgw-consumers==0.36.1
     # via
+    #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
     #   notifications-api-common
     #   open-api-framework
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/requirements/dev.in b/requirements/dev.in
index b0491726..141e314c 100644
--- a/requirements/dev.in
+++ b/requirements/dev.in
@@ -1,3 +1,6 @@
+-c ci.txt
+-r ci.txt
+
 # Helpers
 pip-tools
 bumpversion
diff --git a/requirements/dev.txt b/requirements/dev.txt
index 8adf6677..b69d3a13 100644
--- a/requirements/dev.txt
+++ b/requirements/dev.txt
@@ -1,57 +1,73 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-#    pip-compile --no-emit-index-url --output-file=requirements/dev.txt requirements/base.txt requirements/dev.in requirements/test-tools.in
-#
-alabaster==0.7.12
-    # via sphinx
+# This file was autogenerated by uv via the following command:
+#    ./bin/compile_dependencies.sh
+alabaster==0.7.16
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   sphinx
 amqp==5.2.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   kombu
 annotated-types==0.7.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   pydantic
 ape-pie==0.2.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
     #   notifications-api-common
     #   zgw-consumers
 asgiref==3.7.2
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django
     #   django-axes
     #   django-cors-headers
 asn1crypto==1.5.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   webauthn
 attrs==20.3.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   glom
     #   jsonschema
-babel==2.9.1
-    # via sphinx
+babel==2.16.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   sphinx
 beautifulsoup4==4.9.3
-    # via webtest
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   webtest
 billiard==4.2.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   celery
-black==24.3.0
-    # via -r requirements/test-tools.in
+black==24.8.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
 bleach==6.1.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 boltons==21.0.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   face
     #   glom
 build==1.0.3
@@ -62,32 +78,38 @@ bumpversion==0.6.0
     # via -r requirements/dev.in
 cbor2==5.6.2
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   webauthn
 celery==5.4.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   flower
     #   notifications-api-common
     #   open-api-framework
 certifi==2024.7.4
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-simple-certmanager
     #   elastic-apm
     #   requests
     #   sentry-sdk
 cffi==1.16.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   cryptography
 charset-normalizer==3.3.2
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   requests
 click==8.1.7
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   black
     #   celery
     #   click-didyoumean
@@ -96,45 +118,66 @@ click==8.1.7
     #   pip-tools
 click-didyoumean==0.3.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   celery
 click-plugins==1.1.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   celery
 click-repl==0.3.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   celery
+codecov==2.1.13
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
 commonground-api-common==2.1.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 commonmark==0.9.1
-    # via recommonmark
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   recommonmark
 coreapi==2.3.3
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
 coreschema==0.0.4
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   coreapi
 coverage==4.5.4
-    # via -r requirements/test-tools.in
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   codecov
 cryptography==42.0.4
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-simple-certmanager
     #   josepy
     #   mozilla-django-oidc
     #   pyopenssl
     #   webauthn
 cssselect==1.1.0
-    # via pyquery
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   pyquery
 django==4.2.15
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
     #   django-admin-index
     #   django-appconf
@@ -174,23 +217,28 @@ django==4.2.15
     #   zgw-consumers
 django-admin-index==3.1.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 django-appconf==1.0.6
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-log-outgoing-requests
 django-axes==6.5.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 django-cors-headers==4.4.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 django-csp==3.8
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 django-debug-toolbar==4.2.0
     # via -r requirements/dev.in
@@ -198,90 +246,108 @@ django-extensions==3.2.3
     # via -r requirements/dev.in
 django-filter==24.2
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
     #   open-api-framework
 django-formtools==2.3
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-two-factor-auth
 django-jsonform==2.22.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   mozilla-django-oidc-db
     #   open-api-framework
 django-log-outgoing-requests==0.6.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 django-markup==1.8.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 django-ordered-model==3.7.4
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-admin-index
 django-otp==1.0.6
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-two-factor-auth
 django-phonenumber-field==5.2.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-two-factor-auth
 django-privates==2.0.0.post0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-simple-certmanager
 django-redis==5.4.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 django-relativedelta==2.0.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   zgw-consumers
 django-rest-framework-condition==0.1.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
 django-sendfile2==0.7.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-privates
 django-sessionprofile==3.0.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 django-setup-configuration==0.5.0
     # via
-    #   -r requirements/base.txt
-    #   mozilla-django-oidc-db
-    #   notifications-api-common
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
-    #   zgw-consumers
 django-simple-certmanager==1.4.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   zgw-consumers
 django-solo==2.2.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
     #   django-log-outgoing-requests
     #   mozilla-django-oidc-db
     #   notifications-api-common
     #   zgw-consumers
-django-two-factor-auth[phonenumberslite,webauthn]==1.17.0
+django-two-factor-auth==1.17.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   maykin-2fa
 django-webtest==1.9.7
-    # via -r requirements/test-tools.in
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
 djangorestframework==3.15.2
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
     #   djangorestframework-gis
     #   djangorestframework-inclusions
@@ -292,219 +358,316 @@ djangorestframework==3.15.2
     #   open-api-framework
 djangorestframework-camel-case==1.4.2
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
     #   notifications-api-common
 djangorestframework-gis==1.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 djangorestframework-inclusions==1.2.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 docutils==0.18.1
     # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   recommonmark
     #   sphinx
     #   sphinx-rtd-theme
     #   sphinx-tabs
 drf-nested-routers==0.94.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
-drf-spectacular[sidecar]==0.27.2
+drf-spectacular==0.27.2
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 drf-spectacular-sidecar==2024.7.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   drf-spectacular
 drf-yasg==1.21.7
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
 ecs-logging==2.1.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   elastic-apm
 elastic-apm==6.23.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 face==20.1.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   glom
 factory-boy==3.2.0
-    # via -r requirements/test-tools.in
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
 faker==8.1.0
-    # via factory-boy
-flake8==7.0.0
-    # via -r requirements/test-tools.in
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   factory-boy
+flake8==7.1.1
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
 flower==2.0.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 freezegun==1.1.0
-    # via -r requirements/test-tools.in
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
 furl==2.1.3
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   ape-pie
-    #   notifications-api-common
 glom==23.5.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   mozilla-django-oidc-db
 humanize==4.9.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   flower
 idna==3.7
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   requests
     #   yarl
 imagesize==1.4.1
-    # via sphinx
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   sphinx
 inflection==0.5.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   drf-spectacular
     #   drf-yasg
+iniconfig==2.0.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   pytest
 iso-639==0.4.5
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
 isodate==0.6.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
 isort==5.13.2
-    # via -r requirements/test-tools.in
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
 itypes==1.2.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   coreapi
 jinja2==3.1.4
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   coreschema
     #   sphinx
 josepy==1.9.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   mozilla-django-oidc
 jsonschema==4.17.3
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   drf-spectacular
 kombu==5.3.5
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   celery
 lxml==4.9.4
-    # via pyquery
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   pyquery
 markupsafe==2.1.3
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   jinja2
 maykin-2fa==1.0.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 mccabe==0.7.0
-    # via flake8
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   flake8
 mozilla-django-oidc==4.0.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   mozilla-django-oidc-db
-mozilla-django-oidc-db[setup-configuration]==0.21.1
+mozilla-django-oidc-db==0.21.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 multidict==6.0.5
-    # via yarl
-mypy-extensions==0.4.3
-    # via black
-notifications-api-common[setup-configuration]==0.4.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   yarl
+mypy-extensions==1.0.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   black
+notifications-api-common==0.4.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
 open-api-framework==0.9.1
-    # via -r requirements/base.txt
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
 orderedmultidict==1.0.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   furl
 oyaml==1.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
 packaging==23.2
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   black
     #   build
     #   drf-yasg
+    #   pytest
     #   sphinx
-pathspec==0.11.2
-    # via black
+pathspec==0.12.1
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   black
 phonenumberslite==8.13.30
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-two-factor-auth
+pip==24.3.1
+    # via pip-tools
 pip-tools==7.4.1
     # via -r requirements/dev.in
-platformdirs==4.0.0
-    # via black
+platformdirs==4.3.3
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   black
+pluggy==1.5.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   pytest
 prometheus-client==0.20.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   flower
 prompt-toolkit==3.0.43
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   click-repl
 psycopg2==2.9.9
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
-pycodestyle==2.11.1
-    # via flake8
+pycodestyle==2.12.1
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   flake8
 pycparser==2.20
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   cffi
 pydantic==2.9.2
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-setup-configuration
     #   pydantic-settings
 pydantic-core==2.23.4
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   pydantic
-pydantic-settings[yaml]==2.6.1
+pydantic-settings==2.6.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-setup-configuration
 pyflakes==3.2.0
-    # via flake8
-pygments==2.17.2
     # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   flake8
+pygments==2.18.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   sphinx
     #   sphinx-tabs
 pyjwt==2.4.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
     #   zgw-consumers
 pyopenssl==24.0.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-simple-certmanager
     #   josepy
     #   webauthn
@@ -513,36 +676,47 @@ pyproject-hooks==1.0.0
     #   build
     #   pip-tools
 pyquery==1.4.3
-    # via -r requirements/test-tools.in
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
 pyrsistent==0.17.3
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   jsonschema
+pytest==8.3.3
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
 python-dateutil==2.9.0.post0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   celery
     #   django-relativedelta
     #   faker
     #   freezegun
 python-decouple==3.8
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 python-dotenv==1.0.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
     #   pydantic-settings
 pytz==2024.1
     # via
-    #   -r requirements/base.txt
-    #   babel
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   drf-yasg
     #   flower
 pyyaml==6.0.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   drf-spectacular
     #   drf-yasg
     #   oyaml
@@ -550,18 +724,25 @@ pyyaml==6.0.1
     #   vcrpy
 qrcode==6.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-two-factor-auth
 recommonmark==0.7.1
-    # via -r requirements/dev.in
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   -r requirements/dev.in
 redis==3.5.3
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-redis
 requests==2.32.3
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   ape-pie
+    #   codecov
     #   commonground-api-common
     #   coreapi
     #   django-log-outgoing-requests
@@ -572,16 +753,24 @@ requests==2.32.3
     #   zgw-consumers
 requests-mock==1.12.1
     # via
-    #   -r requirements/base.txt
-    #   -r requirements/test-tools.in
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
 sentry-sdk==2.12.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
+setuptools==75.6.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   josepy
+    #   pip-tools
 six==1.16.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   bleach
     #   furl
     #   isodate
@@ -589,117 +778,180 @@ six==1.16.0
     #   python-dateutil
     #   qrcode
     #   webtest
-snowballstemmer==2.1.0
-    # via sphinx
+snowballstemmer==2.2.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   sphinx
 soupsieve==2.2.1
-    # via beautifulsoup4
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   beautifulsoup4
 sphinx==7.1.2
     # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   -r requirements/dev.in
     #   recommonmark
     #   sphinx-rtd-theme
     #   sphinx-tabs
     #   sphinxcontrib-jquery
 sphinx-rtd-theme==2.0.0
-    # via -r requirements/dev.in
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   -r requirements/dev.in
 sphinx-tabs==3.4.4
-    # via -r requirements/dev.in
-sphinxcontrib-applehelp==1.0.4
-    # via sphinx
-sphinxcontrib-devhelp==1.0.2
-    # via sphinx
-sphinxcontrib-htmlhelp==2.0.1
-    # via sphinx
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   -r requirements/dev.in
+sphinxcontrib-applehelp==2.0.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   sphinx
+sphinxcontrib-devhelp==2.0.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   sphinx
+sphinxcontrib-htmlhelp==2.1.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   sphinx
 sphinxcontrib-jquery==4.1
-    # via sphinx-rtd-theme
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   sphinx-rtd-theme
 sphinxcontrib-jsmath==1.0.1
-    # via sphinx
-sphinxcontrib-qthelp==1.0.3
-    # via sphinx
-sphinxcontrib-serializinghtml==1.1.5
-    # via sphinx
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   sphinx
+sphinxcontrib-qthelp==2.0.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   sphinx
+sphinxcontrib-serializinghtml==2.0.0
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   sphinx
 sqlparse==0.5.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django
     #   django-debug-toolbar
 tblib==1.7.0
-    # via -r requirements/test-tools.in
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
 text-unidecode==1.3
-    # via faker
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   faker
 tornado==6.4.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   flower
 typing-extensions==4.9.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   mozilla-django-oidc-db
     #   pydantic
     #   pydantic-core
     #   zgw-consumers
 tzdata==2024.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   celery
 uritemplate==3.0.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   coreapi
     #   drf-spectacular
     #   drf-yasg
 urllib3==2.2.2
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   elastic-apm
     #   requests
     #   sentry-sdk
 uwsgi==2.0.23
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   open-api-framework
 vcrpy==6.0.1
-    # via -r requirements/test-tools.in
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
 vine==5.1.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   amqp
     #   celery
     #   kombu
 waitress==2.1.2
-    # via webtest
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   webtest
 wcwidth==0.2.13
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   prompt-toolkit
 webauthn==2.0.0
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   django-two-factor-auth
 webencodings==0.5.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   bleach
 webob==1.8.8
-    # via webtest
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   webtest
 webtest==2.0.35
-    # via django-webtest
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   django-webtest
 wheel==0.42.0
     # via pip-tools
 wrapt==1.14.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   elastic-apm
     #   vcrpy
 yarl==1.9.4
-    # via vcrpy
-zgw-consumers[setup-configuration]==0.36.1
     # via
-    #   -r requirements/base.txt
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
+    #   vcrpy
+zgw-consumers==0.36.1
+    # via
+    #   -c requirements/ci.txt
+    #   -r requirements/ci.txt
     #   commonground-api-common
     #   notifications-api-common
     #   open-api-framework
-
-# The following packages are considered to be unsafe in a requirements file:
-# pip
-# setuptools
diff --git a/requirements/ci.in b/requirements/docs.in
similarity index 73%
rename from requirements/ci.in
rename to requirements/docs.in
index dada2d7b..fcfb5cf3 100644
--- a/requirements/ci.in
+++ b/requirements/docs.in
@@ -1,5 +1,5 @@
-codecov
-pytest
+-c base.txt
+-r base.txt
 
 # Documentation
 sphinx
diff --git a/requirements/test-tools.in b/requirements/test-tools.in
index 9af8e834..09d0e9cf 100644
--- a/requirements/test-tools.in
+++ b/requirements/test-tools.in
@@ -1,4 +1,9 @@
+-c base.txt
+-r base.txt
+
 # Dependencies only relevant for (unit) testing
+codecov
+pytest
 coverage < 5.0
 django-webtest
 factory-boy

From ccb4369f4b92e97be3925eb2b91ae38c1326c0cd Mon Sep 17 00:00:00 2001
From: Steven Bal <steven@maykinmedia.nl>
Date: Thu, 2 Jan 2025 15:37:34 +0100
Subject: [PATCH 2/2] :arrow_up: [maykinmedia/open-api-framework#93] Security
 updates

---
 requirements/base.txt |  8 ++++----
 requirements/ci.txt   | 10 +++++-----
 requirements/dev.txt  | 10 +++++-----
 3 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/requirements/base.txt b/requirements/base.txt
index 6944537f..1847f726 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -70,7 +70,7 @@ cryptography==42.0.4
     #   mozilla-django-oidc
     #   pyopenssl
     #   webauthn
-django==4.2.15
+django==4.2.17
     # via
     #   commonground-api-common
     #   django-admin-index
@@ -224,7 +224,7 @@ isodate==0.6.0
     # via commonground-api-common
 itypes==1.2.0
     # via coreapi
-jinja2==3.1.4
+jinja2==3.1.5
     # via coreschema
 josepy==1.9.0
     # via mozilla-django-oidc
@@ -248,7 +248,7 @@ notifications-api-common==0.4.0
     # via
     #   -r requirements/base.in
     #   commonground-api-common
-open-api-framework==0.9.1
+open-api-framework==0.9.2
     # via -r requirements/base.in
 orderedmultidict==1.0.1
     # via furl
@@ -335,7 +335,7 @@ six==1.16.0
     #   qrcode
 sqlparse==0.5.0
     # via django
-tornado==6.4.1
+tornado==6.4.2
     # via flower
 typing-extensions==4.9.0
     # via
diff --git a/requirements/ci.txt b/requirements/ci.txt
index bee0fc74..d2abb350 100644
--- a/requirements/ci.txt
+++ b/requirements/ci.txt
@@ -147,7 +147,7 @@ cryptography==42.0.4
     #   webauthn
 cssselect==1.1.0
     # via pyquery
-django==4.2.15
+django==4.2.17
     # via
     #   -c requirements/base.txt
     #   -r requirements/base.txt
@@ -439,7 +439,7 @@ itypes==1.2.0
     #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   coreapi
-jinja2==3.1.4
+jinja2==3.1.5
     # via
     #   -c requirements/base.txt
     #   -r requirements/base.txt
@@ -493,7 +493,7 @@ notifications-api-common==0.4.0
     #   -c requirements/base.txt
     #   -r requirements/base.txt
     #   commonground-api-common
-open-api-framework==0.9.1
+open-api-framework==0.9.2
     # via
     #   -c requirements/base.txt
     #   -r requirements/base.txt
@@ -717,7 +717,7 @@ tblib==1.7.0
     # via -r requirements/test-tools.in
 text-unidecode==1.3
     # via faker
-tornado==6.4.1
+tornado==6.4.2
     # via
     #   -c requirements/base.txt
     #   -r requirements/base.txt
@@ -763,7 +763,7 @@ vine==5.1.0
     #   amqp
     #   celery
     #   kombu
-waitress==2.1.2
+waitress==3.0.1
     # via webtest
 wcwidth==0.2.13
     # via
diff --git a/requirements/dev.txt b/requirements/dev.txt
index b69d3a13..cda9f974 100644
--- a/requirements/dev.txt
+++ b/requirements/dev.txt
@@ -174,7 +174,7 @@ cssselect==1.1.0
     #   -c requirements/ci.txt
     #   -r requirements/ci.txt
     #   pyquery
-django==4.2.15
+django==4.2.17
     # via
     #   -c requirements/ci.txt
     #   -r requirements/ci.txt
@@ -493,7 +493,7 @@ itypes==1.2.0
     #   -c requirements/ci.txt
     #   -r requirements/ci.txt
     #   coreapi
-jinja2==3.1.4
+jinja2==3.1.5
     # via
     #   -c requirements/ci.txt
     #   -r requirements/ci.txt
@@ -559,7 +559,7 @@ notifications-api-common==0.4.0
     #   -c requirements/ci.txt
     #   -r requirements/ci.txt
     #   commonground-api-common
-open-api-framework==0.9.1
+open-api-framework==0.9.2
     # via
     #   -c requirements/ci.txt
     #   -r requirements/ci.txt
@@ -857,7 +857,7 @@ text-unidecode==1.3
     #   -c requirements/ci.txt
     #   -r requirements/ci.txt
     #   faker
-tornado==6.4.1
+tornado==6.4.2
     # via
     #   -c requirements/ci.txt
     #   -r requirements/ci.txt
@@ -905,7 +905,7 @@ vine==5.1.0
     #   amqp
     #   celery
     #   kombu
-waitress==2.1.2
+waitress==3.0.1
     # via
     #   -c requirements/ci.txt
     #   -r requirements/ci.txt