python3-commons 0.22.7__tar.gz → 0.22.8__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 (81) hide show
  1. {python3_commons-0.22.7 → python3_commons-0.22.8}/PKG-INFO +1 -1
  2. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/auth.py +12 -12
  3. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/__init__.py +1 -1
  4. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/PKG-INFO +1 -1
  5. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/scm_version.json +2 -2
  6. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/db/test_async_session_manager.py +3 -3
  7. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/test_auth.py +2 -2
  8. {python3_commons-0.22.7 → python3_commons-0.22.8}/.coveragerc +0 -0
  9. {python3_commons-0.22.7 → python3_commons-0.22.8}/.devcontainer/Dockerfile +0 -0
  10. {python3_commons-0.22.7 → python3_commons-0.22.8}/.devcontainer/devcontainer.json +0 -0
  11. {python3_commons-0.22.7 → python3_commons-0.22.8}/.devcontainer/docker-compose.yml +0 -0
  12. {python3_commons-0.22.7 → python3_commons-0.22.8}/.env_template +0 -0
  13. {python3_commons-0.22.7 → python3_commons-0.22.8}/.github/workflows/checks.yml +0 -0
  14. {python3_commons-0.22.7 → python3_commons-0.22.8}/.github/workflows/python-publish.yaml +0 -0
  15. {python3_commons-0.22.7 → python3_commons-0.22.8}/.github/workflows/release-on-tag-push.yml +0 -0
  16. {python3_commons-0.22.7 → python3_commons-0.22.8}/.gitignore +0 -0
  17. {python3_commons-0.22.7 → python3_commons-0.22.8}/.pre-commit-config.yaml +0 -0
  18. {python3_commons-0.22.7 → python3_commons-0.22.8}/.python-version +0 -0
  19. {python3_commons-0.22.7 → python3_commons-0.22.8}/AUTHORS.rst +0 -0
  20. {python3_commons-0.22.7 → python3_commons-0.22.8}/CHANGELOG.rst +0 -0
  21. {python3_commons-0.22.7 → python3_commons-0.22.8}/LICENSE +0 -0
  22. {python3_commons-0.22.7 → python3_commons-0.22.8}/README.md +0 -0
  23. {python3_commons-0.22.7 → python3_commons-0.22.8}/README.rst +0 -0
  24. {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/Makefile +0 -0
  25. {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/_static/.gitignore +0 -0
  26. {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/authors.rst +0 -0
  27. {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/changelog.rst +0 -0
  28. {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/conf.py +0 -0
  29. {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/index.rst +0 -0
  30. {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/license.rst +0 -0
  31. {python3_commons-0.22.7 → python3_commons-0.22.8}/pyproject.toml +0 -0
  32. {python3_commons-0.22.7 → python3_commons-0.22.8}/setup.cfg +0 -0
  33. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/__init__.py +0 -0
  34. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/api_client.py +0 -0
  35. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/async_functools.py +0 -0
  36. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/audit.py +0 -0
  37. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/cache.py +0 -0
  38. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/conf.py +0 -0
  39. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/helpers.py +0 -0
  40. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/models/__init__.py +0 -0
  41. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/models/auth.py +0 -0
  42. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/models/common.py +0 -0
  43. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/models/rbac.py +0 -0
  44. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/models/users.py +0 -0
  45. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/exceptions.py +0 -0
  46. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/fs.py +0 -0
  47. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/generators.py +0 -0
  48. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/helpers.py +0 -0
  49. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/log/__init__.py +0 -0
  50. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/log/filters.py +0 -0
  51. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/log/formatters.py +0 -0
  52. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/object_storage.py +0 -0
  53. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/permissions.py +0 -0
  54. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/__init__.py +0 -0
  55. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/common.py +0 -0
  56. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/json.py +0 -0
  57. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/msgpack.py +0 -0
  58. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/msgspec.py +0 -0
  59. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/soap_client.py +0 -0
  60. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/SOURCES.txt +0 -0
  61. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/dependency_links.txt +0 -0
  62. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/requires.txt +0 -0
  63. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/scm_file_list.json +0 -0
  64. {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/top_level.txt +0 -0
  65. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/__init__.py +0 -0
  66. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/integration/__init__.py +0 -0
  67. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/integration/conftest.py +0 -0
  68. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/integration/test_auth.py +0 -0
  69. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/integration/test_cache.py +0 -0
  70. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/integration/test_osc.py +0 -0
  71. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/__init__.py +0 -0
  72. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/conftest.py +0 -0
  73. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/db/__init__.py +0 -0
  74. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/log/__init__.py +0 -0
  75. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/log/test_formatters.py +0 -0
  76. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/test_async_functools.py +0 -0
  77. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/test_audit.py +0 -0
  78. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/test_helpers.py +0 -0
  79. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/test_msgpack.py +0 -0
  80. {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/test_msgspec.py +0 -0
  81. {python3_commons-0.22.7 → python3_commons-0.22.8}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python3-commons
3
- Version: 0.22.7
3
+ Version: 0.22.8
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
@@ -1,5 +1,5 @@
1
+ import asyncio
1
2
  import logging
2
- import threading
3
3
  from collections.abc import Sequence
4
4
  from time import monotonic
5
5
  from typing import Any, Self, TypeVar
@@ -98,20 +98,20 @@ class OIDCClient:
98
98
  self._timeout = timeout
99
99
  self._verify_cert = verify_cert
100
100
 
101
- self._session_lock = threading.Lock()
101
+ self._session_lock = asyncio.Lock()
102
102
  self._config: dict[str, Any] | None = None
103
- self._config_lock = threading.Lock()
103
+ self._config_lock = asyncio.Lock()
104
104
  self._jwks: dict[str, Any] | None = None
105
- self._jwks_lock = threading.Lock()
105
+ self._jwks_lock = asyncio.Lock()
106
106
  self._jwks_cache_ttl = jwks_cache_ttl
107
107
  self._jwks_fetched_at: float | None = None
108
108
  self._audit_name: str | None = audit_name
109
109
 
110
- def _get_session(self) -> aiohttp.ClientSession:
110
+ async def _get_session(self) -> aiohttp.ClientSession:
111
111
  if (session := self._session) and not session.closed:
112
112
  return session
113
113
 
114
- with self._session_lock:
114
+ async with self._session_lock:
115
115
  if (session := self._session) and not session.closed:
116
116
  return session
117
117
 
@@ -123,7 +123,7 @@ class OIDCClient:
123
123
  return session
124
124
 
125
125
  async def __aenter__(self) -> Self:
126
- self._get_session()
126
+ await self._get_session()
127
127
 
128
128
  return self
129
129
 
@@ -136,7 +136,7 @@ class OIDCClient:
136
136
  Fetch the OpenID configuration (including JWKS URI) from OIDC authority.
137
137
  """
138
138
  async with api_client.request(
139
- self._get_session(),
139
+ await self._get_session(),
140
140
  str(self._authority_url),
141
141
  '/.well-known/openid-configuration',
142
142
  audit_name=self._audit_name,
@@ -147,7 +147,7 @@ class OIDCClient:
147
147
  if config := self._config:
148
148
  return config
149
149
 
150
- with self._config_lock:
150
+ async with self._config_lock:
151
151
  if config := self._config:
152
152
  return config
153
153
 
@@ -166,7 +166,7 @@ class OIDCClient:
166
166
  jwks_uri = str(replace_origin(HttpUrl(jwks_uri), authority_internal_host))
167
167
  logger.debug('Modified jwks_uri: %s', jwks_uri)
168
168
 
169
- async with api_client.request(self._get_session(), jwks_uri, '', audit_name=self._audit_name) as response:
169
+ async with api_client.request(await self._get_session(), jwks_uri, '', audit_name=self._audit_name) as response:
170
170
  return await response.json()
171
171
 
172
172
  def _is_fresh_jwks(self) -> bool:
@@ -183,7 +183,7 @@ class OIDCClient:
183
183
 
184
184
  fetched_at = self._jwks_fetched_at
185
185
 
186
- with self._jwks_lock:
186
+ async with self._jwks_lock:
187
187
  if (jwks := self._jwks) and self._jwks_fetched_at != fetched_at:
188
188
  return jwks
189
189
 
@@ -220,7 +220,7 @@ class OIDCClient:
220
220
 
221
221
  try:
222
222
  async with api_client.request(
223
- self._get_session(),
223
+ await self._get_session(),
224
224
  openid_config['token_endpoint'],
225
225
  '',
226
226
  method='post',
@@ -185,7 +185,7 @@ class AsyncSessionManager:
185
185
  try:
186
186
  yield session
187
187
  except Exception:
188
- logger.exception('Error occured while db session %r was open; rolling back', name)
188
+ logger.exception('Error occurred while db session %r was open; rolling back', name)
189
189
  await session.rollback()
190
190
 
191
191
  raise
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python3-commons
3
- Version: 0.22.7
3
+ Version: 0.22.8
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
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.22.7",
2
+ "tag": "0.22.8",
3
3
  "distance": 0,
4
- "node": "g5f178ff649355a3292548e00f3c32fdbfcb16d27",
4
+ "node": "g4f7323e76dc3e62de5b746137a7bd21019225e5b",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-07-15"
@@ -27,12 +27,12 @@ async def test_async_session_manager_timeout(mocker, caplog):
27
27
  get_session_ctx_func = manager.get_session_context('default')
28
28
 
29
29
  # We want to verify that TimeoutError from the driver is caught,
30
- # logged as "Database communication error", rolled back, and re-raised.
30
+ # logged as "Error occurred while db session ... was open", rolled back, and re-raised.
31
31
  with pytest.raises(TimeoutError):
32
32
  async with get_session_ctx_func() as session:
33
33
  await session.execute('SELECT 1')
34
34
 
35
- assert 'Database communication error' in caplog.text
35
+ assert 'Error occurred while db session' in caplog.text
36
36
 
37
37
 
38
38
  @pytest.mark.asyncio
@@ -72,4 +72,4 @@ async def test_async_session_manager_logging(mocker, caplog):
72
72
  async with get_session_ctx_func() as session:
73
73
  await session.execute('SELECT 1')
74
74
 
75
- assert 'Database communication error' in caplog.text
75
+ assert 'Error occurred while db session' in caplog.text
@@ -100,12 +100,12 @@ async def test_get_jwks_coalesces_concurrent_refreshes(client: OIDCClient, mocke
100
100
  async def test_get_session_recreates_a_closed_session(client: OIDCClient) -> None:
101
101
  """A cache refresh after the context manager closed the session must get a live one."""
102
102
  async with client:
103
- first = client._get_session() # noqa: SLF001
103
+ first = await client._get_session() # noqa: SLF001
104
104
 
105
105
  assert first.closed
106
106
 
107
107
  async with client:
108
- second = client._get_session() # noqa: SLF001
108
+ second = await client._get_session() # noqa: SLF001
109
109
 
110
110
  assert not second.closed
111
111
  assert second is not first