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.
- {python3_commons-0.22.7 → python3_commons-0.22.8}/PKG-INFO +1 -1
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/auth.py +12 -12
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/__init__.py +1 -1
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/PKG-INFO +1 -1
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/scm_version.json +2 -2
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/db/test_async_session_manager.py +3 -3
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/test_auth.py +2 -2
- {python3_commons-0.22.7 → python3_commons-0.22.8}/.coveragerc +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/.devcontainer/Dockerfile +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/.devcontainer/devcontainer.json +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/.devcontainer/docker-compose.yml +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/.env_template +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/.github/workflows/checks.yml +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/.github/workflows/python-publish.yaml +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/.github/workflows/release-on-tag-push.yml +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/.gitignore +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/.pre-commit-config.yaml +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/.python-version +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/AUTHORS.rst +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/CHANGELOG.rst +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/LICENSE +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/README.md +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/README.rst +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/Makefile +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/_static/.gitignore +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/authors.rst +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/changelog.rst +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/conf.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/index.rst +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/docs/license.rst +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/pyproject.toml +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/setup.cfg +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/__init__.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/api_client.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/async_functools.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/audit.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/cache.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/conf.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/helpers.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/models/__init__.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/models/auth.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/models/common.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/models/rbac.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/db/models/users.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/exceptions.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/fs.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/generators.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/helpers.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/log/__init__.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/log/filters.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/log/formatters.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/object_storage.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/permissions.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/__init__.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/common.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/json.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/msgpack.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/msgspec.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/soap_client.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/SOURCES.txt +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/dependency_links.txt +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/requires.txt +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/scm_file_list.json +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/top_level.txt +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/__init__.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/integration/__init__.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/integration/conftest.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/integration/test_auth.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/integration/test_cache.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/integration/test_osc.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/__init__.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/conftest.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/db/__init__.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/log/__init__.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/log/test_formatters.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/test_async_functools.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/test_audit.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/test_helpers.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/test_msgpack.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/test_msgspec.py +0 -0
- {python3_commons-0.22.7 → python3_commons-0.22.8}/uv.lock +0 -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 =
|
|
101
|
+
self._session_lock = asyncio.Lock()
|
|
102
102
|
self._config: dict[str, Any] | None = None
|
|
103
|
-
self._config_lock =
|
|
103
|
+
self._config_lock = asyncio.Lock()
|
|
104
104
|
self._jwks: dict[str, Any] | None = None
|
|
105
|
-
self._jwks_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
|
|
188
|
+
logger.exception('Error occurred while db session %r was open; rolling back', name)
|
|
189
189
|
await session.rollback()
|
|
190
190
|
|
|
191
191
|
raise
|
{python3_commons-0.22.7 → python3_commons-0.22.8}/tests/unit/db/test_async_session_manager.py
RENAMED
|
@@ -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 "
|
|
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 '
|
|
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 '
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/msgpack.py
RENAMED
|
File without changes
|
{python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons/serializers/msgspec.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
{python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/scm_file_list.json
RENAMED
|
File without changes
|
{python3_commons-0.22.7 → python3_commons-0.22.8}/src/python3_commons.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|