python3-commons 0.21.0__tar.gz → 0.21.2__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 (79) hide show
  1. {python3_commons-0.21.0 → python3_commons-0.21.2}/.pre-commit-config.yaml +2 -2
  2. python3_commons-0.21.2/.python-version +1 -0
  3. {python3_commons-0.21.0/src/python3_commons.egg-info → python3_commons-0.21.2}/PKG-INFO +6 -6
  4. {python3_commons-0.21.0 → python3_commons-0.21.2}/pyproject.toml +5 -5
  5. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/db/__init__.py +18 -4
  6. {python3_commons-0.21.0 → python3_commons-0.21.2/src/python3_commons.egg-info}/PKG-INFO +6 -6
  7. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons.egg-info/requires.txt +5 -5
  8. {python3_commons-0.21.0 → python3_commons-0.21.2}/uv.lock +162 -158
  9. python3_commons-0.21.0/.python-version +0 -1
  10. {python3_commons-0.21.0 → python3_commons-0.21.2}/.coveragerc +0 -0
  11. {python3_commons-0.21.0 → python3_commons-0.21.2}/.devcontainer/Dockerfile +0 -0
  12. {python3_commons-0.21.0 → python3_commons-0.21.2}/.devcontainer/devcontainer.json +0 -0
  13. {python3_commons-0.21.0 → python3_commons-0.21.2}/.devcontainer/docker-compose.yml +0 -0
  14. {python3_commons-0.21.0 → python3_commons-0.21.2}/.env_template +0 -0
  15. {python3_commons-0.21.0 → python3_commons-0.21.2}/.github/workflows/checks.yml +0 -0
  16. {python3_commons-0.21.0 → python3_commons-0.21.2}/.github/workflows/python-publish.yaml +0 -0
  17. {python3_commons-0.21.0 → python3_commons-0.21.2}/.github/workflows/release-on-tag-push.yml +0 -0
  18. {python3_commons-0.21.0 → python3_commons-0.21.2}/.gitignore +0 -0
  19. {python3_commons-0.21.0 → python3_commons-0.21.2}/AUTHORS.rst +0 -0
  20. {python3_commons-0.21.0 → python3_commons-0.21.2}/CHANGELOG.rst +0 -0
  21. {python3_commons-0.21.0 → python3_commons-0.21.2}/LICENSE +0 -0
  22. {python3_commons-0.21.0 → python3_commons-0.21.2}/README.md +0 -0
  23. {python3_commons-0.21.0 → python3_commons-0.21.2}/README.rst +0 -0
  24. {python3_commons-0.21.0 → python3_commons-0.21.2}/docs/Makefile +0 -0
  25. {python3_commons-0.21.0 → python3_commons-0.21.2}/docs/_static/.gitignore +0 -0
  26. {python3_commons-0.21.0 → python3_commons-0.21.2}/docs/authors.rst +0 -0
  27. {python3_commons-0.21.0 → python3_commons-0.21.2}/docs/changelog.rst +0 -0
  28. {python3_commons-0.21.0 → python3_commons-0.21.2}/docs/conf.py +0 -0
  29. {python3_commons-0.21.0 → python3_commons-0.21.2}/docs/index.rst +0 -0
  30. {python3_commons-0.21.0 → python3_commons-0.21.2}/docs/license.rst +0 -0
  31. {python3_commons-0.21.0 → python3_commons-0.21.2}/setup.cfg +0 -0
  32. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/__init__.py +0 -0
  33. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/api_client.py +0 -0
  34. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/async_functools.py +0 -0
  35. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/audit.py +0 -0
  36. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/auth.py +0 -0
  37. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/cache.py +0 -0
  38. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/conf.py +0 -0
  39. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/db/helpers.py +0 -0
  40. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/db/models/__init__.py +0 -0
  41. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/db/models/auth.py +0 -0
  42. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/db/models/common.py +0 -0
  43. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/db/models/rbac.py +0 -0
  44. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/db/models/users.py +0 -0
  45. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/exceptions.py +0 -0
  46. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/fs.py +0 -0
  47. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/generators.py +0 -0
  48. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/helpers.py +0 -0
  49. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/log/__init__.py +0 -0
  50. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/log/filters.py +0 -0
  51. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/log/formatters.py +0 -0
  52. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/object_storage.py +0 -0
  53. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/permissions.py +0 -0
  54. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/serializers/__init__.py +0 -0
  55. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/serializers/common.py +0 -0
  56. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/serializers/json.py +0 -0
  57. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/serializers/msgpack.py +0 -0
  58. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/serializers/msgspec.py +0 -0
  59. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons/soap_client.py +0 -0
  60. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons.egg-info/SOURCES.txt +0 -0
  61. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons.egg-info/dependency_links.txt +0 -0
  62. {python3_commons-0.21.0 → python3_commons-0.21.2}/src/python3_commons.egg-info/top_level.txt +0 -0
  63. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/__init__.py +0 -0
  64. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/integration/__init__.py +0 -0
  65. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/integration/conftest.py +0 -0
  66. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/integration/test_auth.py +0 -0
  67. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/integration/test_cache.py +0 -0
  68. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/integration/test_osc.py +0 -0
  69. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/unit/__init__.py +0 -0
  70. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/unit/conftest.py +0 -0
  71. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/unit/db/__init__.py +0 -0
  72. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/unit/db/test_async_session_manager.py +0 -0
  73. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/unit/log/__init__.py +0 -0
  74. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/unit/log/test_formatters.py +0 -0
  75. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/unit/test_async_functools.py +0 -0
  76. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/unit/test_audit.py +0 -0
  77. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/unit/test_helpers.py +0 -0
  78. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/unit/test_msgpack.py +0 -0
  79. {python3_commons-0.21.0 → python3_commons-0.21.2}/tests/unit/test_msgspec.py +0 -0
@@ -1,12 +1,12 @@
1
1
  repos:
2
2
  - repo: https://github.com/astral-sh/uv-pre-commit
3
- rev: 0.11.18
3
+ rev: 0.11.21
4
4
  hooks:
5
5
  - id: uv-lock
6
6
  # - id: uv-export
7
7
 
8
8
  - repo: https://github.com/astral-sh/ruff-pre-commit
9
- rev: v0.15.15
9
+ rev: v0.15.17
10
10
  hooks:
11
11
  # Run the linter.
12
12
  - id: ruff-check
@@ -0,0 +1 @@
1
+ ==3.14.6
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python3-commons
3
- Version: 0.21.0
3
+ Version: 0.21.2
4
4
  Summary: Re-usable Python3 code
5
5
  Author-email: Oleg Korsak <kamikaze.is.waiting.you@gmail.com>
6
6
  License-Expression: GPL-3.0
@@ -12,13 +12,13 @@ Requires-Python: <3.15.0,>=3.14.0
12
12
  Description-Content-Type: text/x-rst
13
13
  License-File: LICENSE
14
14
  License-File: AUTHORS.rst
15
- Requires-Dist: msgpack~=1.1.2
15
+ Requires-Dist: msgpack~=1.2.0
16
16
  Requires-Dist: msgspec~=0.21.1
17
17
  Requires-Dist: pydantic-settings~=2.14.1
18
18
  Provides-Extra: all
19
19
  Requires-Dist: python3_commons[api-client,audit,authn,authz,cache,database,object-storage,soap-client]; extra == "all"
20
20
  Provides-Extra: api-client
21
- Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.0; extra == "api-client"
21
+ Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.1; extra == "api-client"
22
22
  Requires-Dist: certifi~=2026.5.20; extra == "api-client"
23
23
  Requires-Dist: python3_commons[audit,object-storage]; extra == "api-client"
24
24
  Provides-Extra: audit
@@ -26,7 +26,7 @@ Requires-Dist: lxml~=6.1.1; extra == "audit"
26
26
  Requires-Dist: zeep[async]~=4.3.2; extra == "audit"
27
27
  Requires-Dist: python3_commons[object-storage]; extra == "audit"
28
28
  Provides-Extra: authn
29
- Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.0; extra == "authn"
29
+ Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.1; extra == "authn"
30
30
  Requires-Dist: certifi~=2026.5.20; extra == "authn"
31
31
  Requires-Dist: python3_commons[api-client]; extra == "authn"
32
32
  Provides-Extra: authz
@@ -39,9 +39,9 @@ Requires-Dist: asyncpg~=0.31.0; extra == "database"
39
39
  Requires-Dist: SQLAlchemy[asyncio]~=2.0.50; extra == "database"
40
40
  Provides-Extra: object-storage
41
41
  Requires-Dist: aiobotocore~=3.7.0; extra == "object-storage"
42
- Requires-Dist: object-storage-client~=0.0.34; extra == "object-storage"
42
+ Requires-Dist: object-storage-client~=0.0.35; extra == "object-storage"
43
43
  Provides-Extra: soap-client
44
- Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.0; extra == "soap-client"
44
+ Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.1; extra == "soap-client"
45
45
  Requires-Dist: certifi~=2026.5.20; extra == "soap-client"
46
46
  Requires-Dist: lxml~=6.1.1; extra == "soap-client"
47
47
  Requires-Dist: requests~=2.34.2; extra == "soap-client"
@@ -18,7 +18,7 @@ classifiers = [
18
18
  keywords = []
19
19
  requires-python = ">=3.14.0,<3.15.0"
20
20
  dependencies = [
21
- "msgpack~=1.1.2",
21
+ "msgpack~=1.2.0",
22
22
  "msgspec~=0.21.1",
23
23
  "pydantic-settings~=2.14.1"
24
24
  ]
@@ -28,7 +28,7 @@ all = [
28
28
  "python3_commons[api-client,audit,authn,authz,cache,database,object-storage,soap-client]"
29
29
  ]
30
30
  api-client = [
31
- "aiohttp[speedups]>=3.14.0,<3.15.0",
31
+ "aiohttp[speedups]>=3.14.1,<3.15.0",
32
32
  "certifi~=2026.5.20",
33
33
  "python3_commons[audit,object-storage]"
34
34
  ]
@@ -38,7 +38,7 @@ audit = [
38
38
  "python3_commons[object-storage]"
39
39
  ]
40
40
  authn = [
41
- "aiohttp[speedups]>=3.14.0,<3.15.0",
41
+ "aiohttp[speedups]>=3.14.1,<3.15.0",
42
42
  "certifi~=2026.5.20",
43
43
  "python3_commons[api-client]"
44
44
  ]
@@ -55,10 +55,10 @@ database = [
55
55
  ]
56
56
  object-storage = [
57
57
  "aiobotocore~=3.7.0",
58
- "object-storage-client~=0.0.34"
58
+ "object-storage-client~=0.0.35"
59
59
  ]
60
60
  soap-client = [
61
- "aiohttp[speedups]>=3.14.0,<3.15.0",
61
+ "aiohttp[speedups]>=3.14.1,<3.15.0",
62
62
  "certifi~=2026.5.20",
63
63
  "lxml~=6.1.1",
64
64
  "requests~=2.34.2",
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import contextlib
2
3
  import logging
3
4
  import time
@@ -69,14 +70,19 @@ class AsyncSessionManager:
69
70
 
70
71
  logger.debug('Building engine for %r (dsn=%s)', name, dsn)
71
72
 
73
+ # pool_timeout: seconds SQLAlchemy waits for a connection from the pool.
74
+ # Cap it at the manager's acquire timeout so the pool never blocks
75
+ # longer than the deadline we advertise to callers; falls back to the
76
+ # default so the pool never waits forever.
77
+ config_pool_timeout = getattr(db_config, 'pool_timeout', None) or _DEFAULT_POOL_ACQUIRE_TIMEOUT
78
+ pool_timeout = min(config_pool_timeout, self.pool_acquire_timeout)
79
+
72
80
  configuration = {
73
81
  'url': str_dsn,
74
82
  'echo': db_config.echo,
75
83
  'pool_size': db_config.pool_size,
76
84
  'max_overflow': db_config.max_overflow,
77
- # pool_timeout: seconds to wait for a conn from the pool.
78
- # Falls back to default so the pool never blocks forever.
79
- 'pool_timeout': getattr(db_config, 'pool_timeout', _DEFAULT_POOL_ACQUIRE_TIMEOUT),
85
+ 'pool_timeout': pool_timeout,
80
86
  'pool_recycle': db_config.pool_recycle,
81
87
  'pool_pre_ping': db_config.pool_pre_ping,
82
88
  }
@@ -159,6 +165,14 @@ class AsyncSessionManager:
159
165
 
160
166
  try:
161
167
  async with session_maker() as session:
168
+ # SQLAlchemy establishes the connection lazily on first use.
169
+ # Force the pool checkout + connect to happen *now*, under a
170
+ # hard deadline, so an exhausted pool or an unreachable DB
171
+ # fails fast here instead of hanging inside the request
172
+ # handler for the duration of pool_timeout.
173
+ async with asyncio.timeout(self.pool_acquire_timeout):
174
+ await session.connection()
175
+
162
176
  session_acquired = True
163
177
  elapsed = time.monotonic() - t0
164
178
  logger.debug('Session acquired for %r in %.3fs', name, elapsed)
@@ -228,7 +242,7 @@ async def is_healthy(
228
242
  t0 = time.monotonic()
229
243
 
230
244
  try:
231
- async with engine.begin() as conn:
245
+ async with asyncio.timeout(timeout), engine.begin() as conn:
232
246
  result = await conn.execute(text('SELECT 1'))
233
247
  healthy = result.scalar() == 1
234
248
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python3-commons
3
- Version: 0.21.0
3
+ Version: 0.21.2
4
4
  Summary: Re-usable Python3 code
5
5
  Author-email: Oleg Korsak <kamikaze.is.waiting.you@gmail.com>
6
6
  License-Expression: GPL-3.0
@@ -12,13 +12,13 @@ Requires-Python: <3.15.0,>=3.14.0
12
12
  Description-Content-Type: text/x-rst
13
13
  License-File: LICENSE
14
14
  License-File: AUTHORS.rst
15
- Requires-Dist: msgpack~=1.1.2
15
+ Requires-Dist: msgpack~=1.2.0
16
16
  Requires-Dist: msgspec~=0.21.1
17
17
  Requires-Dist: pydantic-settings~=2.14.1
18
18
  Provides-Extra: all
19
19
  Requires-Dist: python3_commons[api-client,audit,authn,authz,cache,database,object-storage,soap-client]; extra == "all"
20
20
  Provides-Extra: api-client
21
- Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.0; extra == "api-client"
21
+ Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.1; extra == "api-client"
22
22
  Requires-Dist: certifi~=2026.5.20; extra == "api-client"
23
23
  Requires-Dist: python3_commons[audit,object-storage]; extra == "api-client"
24
24
  Provides-Extra: audit
@@ -26,7 +26,7 @@ Requires-Dist: lxml~=6.1.1; extra == "audit"
26
26
  Requires-Dist: zeep[async]~=4.3.2; extra == "audit"
27
27
  Requires-Dist: python3_commons[object-storage]; extra == "audit"
28
28
  Provides-Extra: authn
29
- Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.0; extra == "authn"
29
+ Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.1; extra == "authn"
30
30
  Requires-Dist: certifi~=2026.5.20; extra == "authn"
31
31
  Requires-Dist: python3_commons[api-client]; extra == "authn"
32
32
  Provides-Extra: authz
@@ -39,9 +39,9 @@ Requires-Dist: asyncpg~=0.31.0; extra == "database"
39
39
  Requires-Dist: SQLAlchemy[asyncio]~=2.0.50; extra == "database"
40
40
  Provides-Extra: object-storage
41
41
  Requires-Dist: aiobotocore~=3.7.0; extra == "object-storage"
42
- Requires-Dist: object-storage-client~=0.0.34; extra == "object-storage"
42
+ Requires-Dist: object-storage-client~=0.0.35; extra == "object-storage"
43
43
  Provides-Extra: soap-client
44
- Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.0; extra == "soap-client"
44
+ Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.1; extra == "soap-client"
45
45
  Requires-Dist: certifi~=2026.5.20; extra == "soap-client"
46
46
  Requires-Dist: lxml~=6.1.1; extra == "soap-client"
47
47
  Requires-Dist: requests~=2.34.2; extra == "soap-client"
@@ -1,4 +1,4 @@
1
- msgpack~=1.1.2
1
+ msgpack~=1.2.0
2
2
  msgspec~=0.21.1
3
3
  pydantic-settings~=2.14.1
4
4
 
@@ -6,7 +6,7 @@ pydantic-settings~=2.14.1
6
6
  python3_commons[api-client,audit,authn,authz,cache,database,object-storage,soap-client]
7
7
 
8
8
  [api-client]
9
- aiohttp[speedups]<3.15.0,>=3.14.0
9
+ aiohttp[speedups]<3.15.0,>=3.14.1
10
10
  certifi~=2026.5.20
11
11
  python3_commons[audit,object-storage]
12
12
 
@@ -16,7 +16,7 @@ zeep[async]~=4.3.2
16
16
  python3_commons[object-storage]
17
17
 
18
18
  [authn]
19
- aiohttp[speedups]<3.15.0,>=3.14.0
19
+ aiohttp[speedups]<3.15.0,>=3.14.1
20
20
  certifi~=2026.5.20
21
21
  python3_commons[api-client]
22
22
 
@@ -33,10 +33,10 @@ SQLAlchemy[asyncio]~=2.0.50
33
33
 
34
34
  [object-storage]
35
35
  aiobotocore~=3.7.0
36
- object-storage-client~=0.0.34
36
+ object-storage-client~=0.0.35
37
37
 
38
38
  [soap-client]
39
- aiohttp[speedups]<3.15.0,>=3.14.0
39
+ aiohttp[speedups]<3.15.0,>=3.14.1
40
40
  certifi~=2026.5.20
41
41
  lxml~=6.1.1
42
42
  requests~=2.34.2