open-api-framework 0.10.3__tar.gz → 0.12.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/CHANGELOG.rst +45 -0
  2. {open_api_framework-0.10.3/open_api_framework.egg-info → open_api_framework-0.12.0}/PKG-INFO +24 -14
  3. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/README.rst +1 -1
  4. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/conf/base.py +155 -0
  5. {open_api_framework-0.10.3 → open_api_framework-0.12.0/open_api_framework.egg-info}/PKG-INFO +24 -14
  6. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework.egg-info/requires.txt +32 -12
  7. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/pyproject.toml +34 -14
  8. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/tests/test_generate_envvar_docs.py +10 -0
  9. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/LICENSE +0 -0
  10. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/MANIFEST.in +0 -0
  11. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/__init__.py +0 -0
  12. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/admin.py +0 -0
  13. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/apps.py +0 -0
  14. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/conf/__init__.py +0 -0
  15. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/conf/utils.py +0 -0
  16. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/context_processors.py +0 -0
  17. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/management/__init__.py +0 -0
  18. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/management/commands/__init__.py +0 -0
  19. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/management/commands/generate_envvar_docs.py +0 -0
  20. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/py.typed +0 -0
  21. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/static/open_api_framework/css/admin.css +0 -0
  22. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/templates/open_api_framework/admin/base_site.html +0 -0
  23. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/templates/open_api_framework/components/environment.html +0 -0
  24. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/templates/open_api_framework/components/version.html +0 -0
  25. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/templates/open_api_framework/env_config.rst +0 -0
  26. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/templatetags/__init__.py +0 -0
  27. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/templatetags/doc_tags.py +0 -0
  28. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/templatetags/open_api_framework.py +0 -0
  29. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework/utils.py +0 -0
  30. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework.egg-info/SOURCES.txt +0 -0
  31. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework.egg-info/dependency_links.txt +0 -0
  32. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/open_api_framework.egg-info/top_level.txt +0 -0
  33. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/setup.cfg +0 -0
  34. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/tests/test_admin.py +0 -0
  35. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/tests/test_config_helpers.py +0 -0
  36. {open_api_framework-0.10.3 → open_api_framework-0.12.0}/tests/test_settings.py +0 -0
@@ -1,6 +1,51 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ 0.12.0 (2025-07-15)
5
+ -------------------
6
+
7
+ **💥 Breaking changes**
8
+
9
+ * Specify optional dependency groups:
10
+
11
+ * **celery**: ``celery``, ``flower``
12
+ * **cors**: ``django-cors-headers``
13
+ * **markup**: ``django-markup``
14
+ * **geo**: ``djangorestframework-gis``
15
+ * **csp**: ``django-csp``
16
+ * **commonground**: ``commonground-api-common``
17
+ * **inclusions**: ``djangorestframework-inclusions``
18
+ * **sanitization**: ``bleach``
19
+ * **server**: ``uwsgi``
20
+ * **redis**: ``django-redis``
21
+
22
+ **New features**
23
+
24
+ * Add DB connection pooling envvars + configuration (with workaround to make sure it works with APM)
25
+
26
+ * ``DB_POOL_ENABLED``
27
+ * ``DB_POOL_MIN_SIZE``
28
+ * ``DB_POOL_MAX_SIZE``
29
+ * ``DB_POOL_TIMEOUT``
30
+ * ``DB_POOL_MAX_WAITING``
31
+ * ``DB_POOL_MAX_LIFETIME``
32
+ * ``DB_POOL_MAX_IDLE``
33
+ * ``DB_POOL_RECONNECT_TIMEOUT``
34
+ * ``DB_POOL_NUM_WORKERS``
35
+
36
+ * Add ``DB_CONN_MAX_AGE`` envvar (automatically set to 0 if connection pooling is enabled)
37
+
38
+ **Maintenance**
39
+
40
+ * Pin ```commonground-api-common``` to 2.7.0 or higher
41
+
42
+ 0.11.0 (2025-07-03)
43
+ -------------------
44
+
45
+ **New features**
46
+
47
+ * Replace ``psycopg2`` with ``psycopg[binary]`` to support connection pooling
48
+
4
49
  0.10.3 (2025-06-17)
5
50
  -------------------
6
51
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: open-api-framework
3
- Version: 0.10.3
3
+ Version: 0.12.0
4
4
  Summary: A metapackage for registration components, that bundles the dependencies shared between these components and provides generic settings
5
5
  Author-email: Maykin Media <support@maykinmedia.nl>
6
6
  License: Copyright © Maykin 2024
@@ -30,30 +30,19 @@ Description-Content-Type: text/x-rst
30
30
  License-File: LICENSE
31
31
  Requires-Dist: django>=5.2
32
32
  Requires-Dist: django-axes>=6.5.1
33
- Requires-Dist: django-cors-headers>=4.4.0
34
- Requires-Dist: django-markup>=1.8.1
35
33
  Requires-Dist: django-jsonform>=2.22.0
36
34
  Requires-Dist: django-log-outgoing-requests>=0.6.1
37
35
  Requires-Dist: django-admin-index>=3.1.0
38
- Requires-Dist: django-redis>=5.4.0
39
36
  Requires-Dist: djangorestframework>=3.15.2
40
- Requires-Dist: djangorestframework-gis>=1.0
41
37
  Requires-Dist: django-filter>=24.2
42
38
  Requires-Dist: drf-spectacular[sidecar]>=0.27.2
43
- Requires-Dist: django-csp>=3.8
44
- Requires-Dist: djangorestframework-inclusions>=1.2.0
45
- Requires-Dist: commonground-api-common>=2.1.2
46
39
  Requires-Dist: mozilla-django-oidc-db>=0.19.0
47
- Requires-Dist: psycopg2>=2.9.9
48
- Requires-Dist: bleach>=6.1.0
40
+ Requires-Dist: psycopg[binary]>=3.2.9
49
41
  Requires-Dist: python-dotenv>=1.0.0
50
42
  Requires-Dist: python-decouple>=3.8
51
43
  Requires-Dist: requests>=2.32.3
52
- Requires-Dist: uwsgi>=2.0.23
53
44
  Requires-Dist: sentry-sdk>=2.11.0
54
45
  Requires-Dist: elastic-apm>=6.22.0
55
- Requires-Dist: celery>=5.4.0
56
- Requires-Dist: flower>=2.0.1
57
46
  Requires-Dist: maykin-2fa>=1.0.1
58
47
  Requires-Dist: django-setup-configuration>=0.1.0
59
48
  Requires-Dist: django-sessionprofile>=3.0.0
@@ -75,12 +64,33 @@ Requires-Dist: sphinx-rtd-theme; extra == "docs"
75
64
  Provides-Extra: release
76
65
  Requires-Dist: bump-my-version; extra == "release"
77
66
  Requires-Dist: twine; extra == "release"
67
+ Provides-Extra: celery
68
+ Requires-Dist: celery>=5.4.0; extra == "celery"
69
+ Requires-Dist: flower>=2.0.1; extra == "celery"
70
+ Provides-Extra: cors
71
+ Requires-Dist: django-cors-headers>=4.4.0; extra == "cors"
72
+ Provides-Extra: markup
73
+ Requires-Dist: django-markup>=1.8.1; extra == "markup"
74
+ Provides-Extra: geo
75
+ Requires-Dist: djangorestframework-gis>=1.0; extra == "geo"
76
+ Provides-Extra: csp
77
+ Requires-Dist: django-csp>=3.8; extra == "csp"
78
+ Provides-Extra: commonground
79
+ Requires-Dist: commonground-api-common>=2.7.0; extra == "commonground"
80
+ Provides-Extra: inclusions
81
+ Requires-Dist: djangorestframework-inclusions>=1.2.0; extra == "inclusions"
82
+ Provides-Extra: sanitization
83
+ Requires-Dist: bleach>=6.1.0; extra == "sanitization"
84
+ Provides-Extra: server
85
+ Requires-Dist: uwsgi>=2.0.23; extra == "server"
86
+ Provides-Extra: redis
87
+ Requires-Dist: django-redis>=5.4.0; extra == "redis"
78
88
  Dynamic: license-file
79
89
 
80
90
  Open API Framework
81
91
  ==================
82
92
 
83
- :Version: 0.10.3
93
+ :Version: 0.12.0
84
94
  :Source: https://github.com/maykinmedia/open-api-framework
85
95
  :Keywords: metapackage, dependencies
86
96
 
@@ -1,7 +1,7 @@
1
1
  Open API Framework
2
2
  ==================
3
3
 
4
- :Version: 0.10.3
4
+ :Version: 0.12.0
5
5
  :Source: https://github.com/maykinmedia/open-api-framework
6
6
  :Keywords: metapackage, dependencies
7
7
 
@@ -138,6 +138,161 @@ DATABASES = {
138
138
  }
139
139
  }
140
140
 
141
+ DATABASES["default"]["CONN_MAX_AGE"] = config(
142
+ "DB_CONN_MAX_AGE",
143
+ default=0,
144
+ # The default is set to `60` in the docker settings, so that's what is mentioned
145
+ # in the help text as well
146
+ help_text=(
147
+ "The lifetime of a database connection, as an integer of seconds. "
148
+ "Use 0 to close database connections at the end of each request — Django’s historical behavior. "
149
+ "This setting is ignored if connection pooling is used. Defaults to: ``60``."
150
+ ),
151
+ group="Database",
152
+ auto_display_default=False,
153
+ cast=lambda x: int(x) if x != "None" else None,
154
+ )
155
+
156
+ # https://docs.djangoproject.com/en/5.2/ref/databases/#connection-pool
157
+ # https://www.psycopg.org/psycopg3/docs/api/pool.html#the-connectionpool-class
158
+
159
+ DB_POOL_ENABLED = config(
160
+ "DB_POOL_ENABLED",
161
+ default=False,
162
+ help_text=("Whether to use connection pooling."),
163
+ group="Database",
164
+ )
165
+
166
+ DB_POOL_MIN_SIZE = config(
167
+ "DB_POOL_MIN_SIZE",
168
+ default=4,
169
+ help_text=(
170
+ "The minimum number of connection the pool will hold. "
171
+ "The pool will actively try to create new connections if some are lost (closed, broken) "
172
+ "and will try to never go below min_size."
173
+ ),
174
+ group="Database",
175
+ cast=int,
176
+ )
177
+
178
+ DB_POOL_MAX_SIZE = config(
179
+ "DB_POOL_MAX_SIZE",
180
+ default=None,
181
+ help_text=(
182
+ "The maximum number of connections the pool will hold. "
183
+ "If None, or equal to min_size, the pool will not grow or shrink. "
184
+ "If larger than min_size, the pool can grow if more than min_size connections "
185
+ "are requested at the same time and will shrink back after the extra connections "
186
+ "have been unused for more than max_idle seconds."
187
+ ),
188
+ group="Database",
189
+ cast=lambda x: int(x) if x is not None else None,
190
+ )
191
+
192
+ DB_POOL_TIMEOUT = config(
193
+ "DB_POOL_TIMEOUT",
194
+ default=30,
195
+ help_text=(
196
+ "The default maximum time in seconds that a client can wait "
197
+ "to receive a connection from the pool (using connection() or getconn()). "
198
+ "Note that these methods allow to override the timeout default."
199
+ ),
200
+ group="Database",
201
+ cast=int,
202
+ )
203
+
204
+ DB_POOL_MAX_WAITING = config(
205
+ "DB_POOL_MAX_WAITING",
206
+ default=0,
207
+ help_text=(
208
+ "Maximum number of requests that can be queued to the pool, "
209
+ "after which new requests will fail, raising TooManyRequests. 0 means no queue limit."
210
+ ),
211
+ group="Database",
212
+ cast=int,
213
+ )
214
+
215
+ DB_POOL_MAX_LIFETIME = config(
216
+ "DB_POOL_MAX_LIFETIME",
217
+ default=60 * 60,
218
+ help_text=(
219
+ "The maximum lifetime of a connection in the pool, in seconds. "
220
+ "Connections used for longer get closed and replaced by a new one. "
221
+ "The amount is reduced by a random 10% to avoid mass eviction"
222
+ ),
223
+ group="Database",
224
+ cast=int,
225
+ )
226
+
227
+ DB_POOL_MAX_IDLE = config(
228
+ "DB_POOL_MAX_IDLE",
229
+ default=10 * 60,
230
+ help_text=(
231
+ "Maximum time, in seconds, that a connection can stay unused in the pool "
232
+ "before being closed, and the pool shrunk. This only happens to "
233
+ "connections more than min_size, if max_size allowed the pool to grow."
234
+ ),
235
+ group="Database",
236
+ cast=int,
237
+ )
238
+
239
+ DB_POOL_RECONNECT_TIMEOUT = config(
240
+ "DB_POOL_RECONNECT_TIMEOUT",
241
+ default=5 * 60,
242
+ help_text=(
243
+ "Maximum time, in seconds, the pool will try to create a connection. "
244
+ "If a connection attempt fails, the pool will try to reconnect a few times, "
245
+ "using an exponential backoff and some random factor to avoid mass attempts. "
246
+ "If repeated attempts fail, after reconnect_timeout second the connection "
247
+ "attempt is aborted and the reconnect_failed() callback invoked."
248
+ ),
249
+ group="Database",
250
+ cast=int,
251
+ )
252
+
253
+ DB_POOL_NUM_WORKERS = config(
254
+ "DB_POOL_NUM_WORKERS",
255
+ default=3,
256
+ help_text=(
257
+ "Number of background worker threads used to maintain the pool state. "
258
+ "Background workers are used for example to create new connections and "
259
+ "to clean up connections when they are returned to the pool."
260
+ ),
261
+ group="Database",
262
+ cast=int,
263
+ )
264
+
265
+
266
+ if DB_POOL_ENABLED:
267
+ # FIXME Workaround for https://github.com/elastic/apm-agent-python/issues/2094
268
+ # apm-agent-python does not instrument ConnectionPool yet
269
+ import psycopg
270
+
271
+ class WrapperConnectionClass(psycopg.Connection):
272
+ @classmethod
273
+ def connect(
274
+ cls,
275
+ conninfo: str = "",
276
+ **kwargs,
277
+ ) -> "psycopg.Connection[psycopg.rows.TupleRow]":
278
+ return psycopg.connect(conninfo, **kwargs)
279
+
280
+ DATABASES["default"]["OPTIONS"] = {
281
+ "pool": {
282
+ "min_size": DB_POOL_MIN_SIZE,
283
+ "max_size": DB_POOL_MAX_SIZE,
284
+ "timeout": DB_POOL_TIMEOUT,
285
+ "max_waiting": DB_POOL_MAX_WAITING,
286
+ "max_lifetime": DB_POOL_MAX_LIFETIME,
287
+ "max_idle": DB_POOL_MAX_IDLE,
288
+ "reconnect_timeout": DB_POOL_RECONNECT_TIMEOUT,
289
+ "num_workers": DB_POOL_NUM_WORKERS,
290
+ "connection_class": WrapperConnectionClass,
291
+ }
292
+ }
293
+ # Cannot use a `CONN_MAX_AGE` other than 0 with connection pooling
294
+ DATABASES["default"]["CONN_MAX_AGE"] = 0
295
+
141
296
  # keep the current schema for now and deal with migrating to BigAutoField later, see
142
297
  # https://docs.djangoproject.com/en/4.0/ref/settings/#std:setting-DEFAULT_AUTO_FIELD
143
298
  DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: open-api-framework
3
- Version: 0.10.3
3
+ Version: 0.12.0
4
4
  Summary: A metapackage for registration components, that bundles the dependencies shared between these components and provides generic settings
5
5
  Author-email: Maykin Media <support@maykinmedia.nl>
6
6
  License: Copyright © Maykin 2024
@@ -30,30 +30,19 @@ Description-Content-Type: text/x-rst
30
30
  License-File: LICENSE
31
31
  Requires-Dist: django>=5.2
32
32
  Requires-Dist: django-axes>=6.5.1
33
- Requires-Dist: django-cors-headers>=4.4.0
34
- Requires-Dist: django-markup>=1.8.1
35
33
  Requires-Dist: django-jsonform>=2.22.0
36
34
  Requires-Dist: django-log-outgoing-requests>=0.6.1
37
35
  Requires-Dist: django-admin-index>=3.1.0
38
- Requires-Dist: django-redis>=5.4.0
39
36
  Requires-Dist: djangorestframework>=3.15.2
40
- Requires-Dist: djangorestframework-gis>=1.0
41
37
  Requires-Dist: django-filter>=24.2
42
38
  Requires-Dist: drf-spectacular[sidecar]>=0.27.2
43
- Requires-Dist: django-csp>=3.8
44
- Requires-Dist: djangorestframework-inclusions>=1.2.0
45
- Requires-Dist: commonground-api-common>=2.1.2
46
39
  Requires-Dist: mozilla-django-oidc-db>=0.19.0
47
- Requires-Dist: psycopg2>=2.9.9
48
- Requires-Dist: bleach>=6.1.0
40
+ Requires-Dist: psycopg[binary]>=3.2.9
49
41
  Requires-Dist: python-dotenv>=1.0.0
50
42
  Requires-Dist: python-decouple>=3.8
51
43
  Requires-Dist: requests>=2.32.3
52
- Requires-Dist: uwsgi>=2.0.23
53
44
  Requires-Dist: sentry-sdk>=2.11.0
54
45
  Requires-Dist: elastic-apm>=6.22.0
55
- Requires-Dist: celery>=5.4.0
56
- Requires-Dist: flower>=2.0.1
57
46
  Requires-Dist: maykin-2fa>=1.0.1
58
47
  Requires-Dist: django-setup-configuration>=0.1.0
59
48
  Requires-Dist: django-sessionprofile>=3.0.0
@@ -75,12 +64,33 @@ Requires-Dist: sphinx-rtd-theme; extra == "docs"
75
64
  Provides-Extra: release
76
65
  Requires-Dist: bump-my-version; extra == "release"
77
66
  Requires-Dist: twine; extra == "release"
67
+ Provides-Extra: celery
68
+ Requires-Dist: celery>=5.4.0; extra == "celery"
69
+ Requires-Dist: flower>=2.0.1; extra == "celery"
70
+ Provides-Extra: cors
71
+ Requires-Dist: django-cors-headers>=4.4.0; extra == "cors"
72
+ Provides-Extra: markup
73
+ Requires-Dist: django-markup>=1.8.1; extra == "markup"
74
+ Provides-Extra: geo
75
+ Requires-Dist: djangorestframework-gis>=1.0; extra == "geo"
76
+ Provides-Extra: csp
77
+ Requires-Dist: django-csp>=3.8; extra == "csp"
78
+ Provides-Extra: commonground
79
+ Requires-Dist: commonground-api-common>=2.7.0; extra == "commonground"
80
+ Provides-Extra: inclusions
81
+ Requires-Dist: djangorestframework-inclusions>=1.2.0; extra == "inclusions"
82
+ Provides-Extra: sanitization
83
+ Requires-Dist: bleach>=6.1.0; extra == "sanitization"
84
+ Provides-Extra: server
85
+ Requires-Dist: uwsgi>=2.0.23; extra == "server"
86
+ Provides-Extra: redis
87
+ Requires-Dist: django-redis>=5.4.0; extra == "redis"
78
88
  Dynamic: license-file
79
89
 
80
90
  Open API Framework
81
91
  ==================
82
92
 
83
- :Version: 0.10.3
93
+ :Version: 0.12.0
84
94
  :Source: https://github.com/maykinmedia/open-api-framework
85
95
  :Keywords: metapackage, dependencies
86
96
 
@@ -1,45 +1,65 @@
1
1
  django>=5.2
2
2
  django-axes>=6.5.1
3
- django-cors-headers>=4.4.0
4
- django-markup>=1.8.1
5
3
  django-jsonform>=2.22.0
6
4
  django-log-outgoing-requests>=0.6.1
7
5
  django-admin-index>=3.1.0
8
- django-redis>=5.4.0
9
6
  djangorestframework>=3.15.2
10
- djangorestframework-gis>=1.0
11
7
  django-filter>=24.2
12
8
  drf-spectacular[sidecar]>=0.27.2
13
- django-csp>=3.8
14
- djangorestframework-inclusions>=1.2.0
15
- commonground-api-common>=2.1.2
16
9
  mozilla-django-oidc-db>=0.19.0
17
- psycopg2>=2.9.9
18
- bleach>=6.1.0
10
+ psycopg[binary]>=3.2.9
19
11
  python-dotenv>=1.0.0
20
12
  python-decouple>=3.8
21
13
  requests>=2.32.3
22
- uwsgi>=2.0.23
23
14
  sentry-sdk>=2.11.0
24
15
  elastic-apm>=6.22.0
25
- celery>=5.4.0
26
- flower>=2.0.1
27
16
  maykin-2fa>=1.0.1
28
17
  django-setup-configuration>=0.1.0
29
18
  django-sessionprofile>=3.0.0
30
19
  django-upgrade-check>=1.1.0
31
20
 
21
+ [celery]
22
+ celery>=5.4.0
23
+ flower>=2.0.1
24
+
25
+ [commonground]
26
+ commonground-api-common>=2.7.0
27
+
28
+ [cors]
29
+ django-cors-headers>=4.4.0
30
+
32
31
  [coverage]
33
32
  pytest-cov
34
33
 
34
+ [csp]
35
+ django-csp>=3.8
36
+
35
37
  [docs]
36
38
  sphinx
37
39
  sphinx-rtd-theme
38
40
 
41
+ [geo]
42
+ djangorestframework-gis>=1.0
43
+
44
+ [inclusions]
45
+ djangorestframework-inclusions>=1.2.0
46
+
47
+ [markup]
48
+ django-markup>=1.8.1
49
+
50
+ [redis]
51
+ django-redis>=5.4.0
52
+
39
53
  [release]
40
54
  bump-my-version
41
55
  twine
42
56
 
57
+ [sanitization]
58
+ bleach>=6.1.0
59
+
60
+ [server]
61
+ uwsgi>=2.0.23
62
+
43
63
  [tests]
44
64
  pytest
45
65
  pytest-django
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "open-api-framework"
7
- version = "0.10.3"
7
+ version = "0.12.0"
8
8
  description = "A metapackage for registration components, that bundles the dependencies shared between these components and provides generic settings"
9
9
  authors = [
10
10
  {name = "Maykin Media", email = "support@maykinmedia.nl"}
@@ -27,30 +27,19 @@ requires-python = ">=3.12"
27
27
  dependencies = [
28
28
  "django>=5.2",
29
29
  "django-axes>=6.5.1",
30
- "django-cors-headers>=4.4.0",
31
- "django-markup>=1.8.1",
32
30
  "django-jsonform>=2.22.0",
33
31
  "django-log-outgoing-requests>=0.6.1",
34
32
  "django-admin-index>=3.1.0",
35
- "django-redis>=5.4.0",
36
33
  "djangorestframework>=3.15.2",
37
- "djangorestframework-gis>=1.0",
38
34
  "django-filter>=24.2",
39
35
  "drf-spectacular[sidecar]>=0.27.2",
40
- "django-csp>=3.8",
41
- "djangorestframework-inclusions>=1.2.0",
42
- "commonground-api-common>=2.1.2",
43
36
  "mozilla-django-oidc-db>=0.19.0",
44
- "psycopg2>=2.9.9",
45
- "bleach>=6.1.0",
37
+ "psycopg[binary]>=3.2.9",
46
38
  "python-dotenv>=1.0.0",
47
39
  "python-decouple>=3.8",
48
40
  "requests>=2.32.3",
49
- "uwsgi>=2.0.23",
50
41
  "sentry-sdk>=2.11.0",
51
42
  "elastic-apm>=6.22.0",
52
- "celery>=5.4.0",
53
- "flower>=2.0.1",
54
43
  "maykin-2fa>=1.0.1",
55
44
  "django-setup-configuration>=0.1.0",
56
45
  "django-sessionprofile>=3.0.0",
@@ -85,6 +74,37 @@ release = [
85
74
  "bump-my-version",
86
75
  "twine",
87
76
  ]
77
+ celery = [
78
+ "celery>=5.4.0",
79
+ "flower>=2.0.1"
80
+ ]
81
+ cors = [
82
+ "django-cors-headers>=4.4.0"
83
+ ]
84
+ markup = [
85
+ "django-markup>=1.8.1"
86
+ ]
87
+ geo = [
88
+ "djangorestframework-gis>=1.0"
89
+ ]
90
+ csp = [
91
+ "django-csp>=3.8"
92
+ ]
93
+ commonground = [
94
+ "commonground-api-common>=2.7.0"
95
+ ]
96
+ inclusions = [
97
+ "djangorestframework-inclusions>=1.2.0"
98
+ ]
99
+ sanitization = [
100
+ "bleach>=6.1.0"
101
+ ]
102
+ server = [
103
+ "uwsgi>=2.0.23"
104
+ ]
105
+ redis = [
106
+ "django-redis>=5.4.0"
107
+ ]
88
108
 
89
109
  [tool.setuptools.packages.find]
90
110
  include = ["open_api_framework*"]
@@ -100,7 +120,7 @@ env = [
100
120
  ]
101
121
 
102
122
  [tool.bumpversion]
103
- current_version = "0.10.3"
123
+ current_version = "0.12.0"
104
124
  files = [
105
125
  {filename = "pyproject.toml"},
106
126
  {filename = "README.rst"},
@@ -33,6 +33,16 @@ Database
33
33
  * ``DB_PASSWORD``: password of the database user. Defaults to: ``testapp``.
34
34
  * ``DB_HOST``: hostname of the PostgreSQL database. Defaults to ``db`` for the docker environment, otherwise defaults to ``localhost``.
35
35
  * ``DB_PORT``: port number of the database. Defaults to: ``5432``.
36
+ * ``DB_CONN_MAX_AGE``: The lifetime of a database connection, as an integer of seconds. Use 0 to close database connections at the end of each request — Django’s historical behavior. This setting is ignored if connection pooling is used. Defaults to: ``60``.
37
+ * ``DB_POOL_ENABLED``: Whether to use connection pooling. Defaults to: ``False``.
38
+ * ``DB_POOL_MIN_SIZE``: The minimum number of connection the pool will hold. The pool will actively try to create new connections if some are lost (closed, broken) and will try to never go below min_size. Defaults to: ``4``.
39
+ * ``DB_POOL_MAX_SIZE``: The maximum number of connections the pool will hold. If None, or equal to min_size, the pool will not grow or shrink. If larger than min_size, the pool can grow if more than min_size connections are requested at the same time and will shrink back after the extra connections have been unused for more than max_idle seconds. Defaults to: ``None``.
40
+ * ``DB_POOL_TIMEOUT``: The default maximum time in seconds that a client can wait to receive a connection from the pool (using connection() or getconn()). Note that these methods allow to override the timeout default. Defaults to: ``30``.
41
+ * ``DB_POOL_MAX_WAITING``: Maximum number of requests that can be queued to the pool, after which new requests will fail, raising TooManyRequests. 0 means no queue limit. Defaults to: ``0``.
42
+ * ``DB_POOL_MAX_LIFETIME``: The maximum lifetime of a connection in the pool, in seconds. Connections used for longer get closed and replaced by a new one. The amount is reduced by a random 10% to avoid mass eviction. Defaults to: ``3600``.
43
+ * ``DB_POOL_MAX_IDLE``: Maximum time, in seconds, that a connection can stay unused in the pool before being closed, and the pool shrunk. This only happens to connections more than min_size, if max_size allowed the pool to grow. Defaults to: ``600``.
44
+ * ``DB_POOL_RECONNECT_TIMEOUT``: Maximum time, in seconds, the pool will try to create a connection. If a connection attempt fails, the pool will try to reconnect a few times, using an exponential backoff and some random factor to avoid mass attempts. If repeated attempts fail, after reconnect_timeout second the connection attempt is aborted and the reconnect_failed() callback invoked. Defaults to: ``300``.
45
+ * ``DB_POOL_NUM_WORKERS``: Number of background worker threads used to maintain the pool state. Background workers are used for example to create new connections and to clean up connections when they are returned to the pool. Defaults to: ``3``.
36
46
 
37
47
 
38
48
  Logging