python3-commons 0.22.7__py3-none-any.whl → 0.22.9__py3-none-any.whl

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/auth.py CHANGED
@@ -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.9
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
@@ -39,7 +39,7 @@ Requires-Dist: asyncpg~=0.31.0; extra == "database"
39
39
  Requires-Dist: SQLAlchemy[asyncio]~=2.0.51; 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.38; extra == "object-storage"
42
+ Requires-Dist: object-storage-client~=0.0.40; extra == "object-storage"
43
43
  Provides-Extra: soap-client
44
44
  Requires-Dist: aiohttp[speedups]<3.15.0,>=3.14.1; extra == "soap-client"
45
45
  Requires-Dist: certifi~=2026.6.17; extra == "soap-client"
@@ -2,7 +2,7 @@ python3_commons/__init__.py,sha256=0KgaYU46H_IMKn-BuasoRN3C4Hi45KlkHHoPbU9cwiA,1
2
2
  python3_commons/api_client.py,sha256=SThSzLhZJxVsKP8n1xDMCczA7SBFbxGFgrhKy9k-9_g,5532
3
3
  python3_commons/async_functools.py,sha256=A2HvwFzZHxOWTp4IQM5UiBY2yg1S_0U1CWra5BWK0gk,9101
4
4
  python3_commons/audit.py,sha256=uGoCwenDJ0Gdwbr_VNOZm5scT8luxW1weprJbbMoHo0,2608
5
- python3_commons/auth.py,sha256=9gRdXe54O9e86DS8XgXlX9QDCqrhPIZLJaa4AC9RR_0,8239
5
+ python3_commons/auth.py,sha256=s928lYwpyX03BDTo1R6LpOgHiUSrjVrd1OVgTjvIiQU,8279
6
6
  python3_commons/cache.py,sha256=lowiXJqFgFy1Yg86wi9IhuoNqIUGP6nc5eNibmf0dfY,8018
7
7
  python3_commons/conf.py,sha256=1HYtNkNBQc5IIABzhH3kz7GnLeF7rj5aNcOoW8xbEa4,3101
8
8
  python3_commons/exceptions.py,sha256=EGjHZVBnsM6CeBfPMqhL0IPMKjDJ_2-Z-aSPXwq91LE,36
@@ -12,7 +12,7 @@ python3_commons/helpers.py,sha256=WTPu_jIOGYtxt1GYnH6sBMNDHry99AKv6ZaggGW2l1A,49
12
12
  python3_commons/object_storage.py,sha256=2l8v1mDB5WWN6jhxH2t5xmHBXaVPRJl0z44wExmlO80,7175
13
13
  python3_commons/permissions.py,sha256=gaMKSWg0MgPQTdP1voll4ItXcblXku9BlD0Lq3Xv64U,1724
14
14
  python3_commons/soap_client.py,sha256=w2lOyhhtkhwiNnHjvir8DfjGBO51XVg5rlDHyuudU2A,7169
15
- python3_commons/db/__init__.py,sha256=OvRLAKPvOzEId_M6ZAd1-KqGJJXxsDKjD6xUiRG6ilU,10187
15
+ python3_commons/db/__init__.py,sha256=GP_9GXZUUgNvehFUCsXTIWThIMFW60Hwve7sve2oPgM,10188
16
16
  python3_commons/db/helpers.py,sha256=xRpWs4aVkBge6HCLjb6OLSnWc1nlV6rKGyaVhZ_x12w,2001
17
17
  python3_commons/db/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  python3_commons/db/models/auth.py,sha256=t6z_0c7l_1eB-CCdnPSV9OzJ_ymgkwD1cLpecNhQgoA,773
@@ -27,11 +27,11 @@ python3_commons/serializers/common.py,sha256=VkA7C6wODvHk0QBXVX_x2JieDstihx3U__U
27
27
  python3_commons/serializers/json.py,sha256=UPkC3ps13x2C_NxwVV-K7Ewp4VjkVHSSUkJVw5k7Wiw,712
28
28
  python3_commons/serializers/msgpack.py,sha256=zESFBX34GsZ8rDu6Zk5V6CLT6P0mPilU0r04Ka6TblI,1474
29
29
  python3_commons/serializers/msgspec.py,sha256=upy5CBmK66-8hYnK5bAM_sZvZY5CAqZmzCw9GIF346I,2988
30
- python3_commons-0.22.7.dist-info/licenses/AUTHORS.rst,sha256=3R9JnfjfjH5RoPWOeqKFJgxVShSSfzQPIrEr1nxIo9Q,90
31
- python3_commons-0.22.7.dist-info/licenses/LICENSE,sha256=xxILuojHm4fKQOrMHPSslbyy6WuKAN2RiG74HbrYfzM,34575
32
- python3_commons-0.22.7.dist-info/METADATA,sha256=QHKCW7uvvkYZHybS_GrgR3t1kSKr3Zdp4oIqN1UuLgs,9472
33
- python3_commons-0.22.7.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
34
- python3_commons-0.22.7.dist-info/scm_file_list.json,sha256=_VHernCbTfExHtROxsobMxaHoIS1TJJ6S-8WTB3Aqvs,2549
35
- python3_commons-0.22.7.dist-info/scm_version.json,sha256=Flp3XnyTjvM7r12ci_e2s_UtGH9o8RT-MNUA8D2WUWA,161
36
- python3_commons-0.22.7.dist-info/top_level.txt,sha256=lJI6sCBf68eUHzupCnn2dzG10lH3jJKTWM_hrN1cQ7M,16
37
- python3_commons-0.22.7.dist-info/RECORD,,
30
+ python3_commons-0.22.9.dist-info/licenses/AUTHORS.rst,sha256=3R9JnfjfjH5RoPWOeqKFJgxVShSSfzQPIrEr1nxIo9Q,90
31
+ python3_commons-0.22.9.dist-info/licenses/LICENSE,sha256=xxILuojHm4fKQOrMHPSslbyy6WuKAN2RiG74HbrYfzM,34575
32
+ python3_commons-0.22.9.dist-info/METADATA,sha256=g7xWlSXgmSs5IhxMXBgrOf6p8BpJkCdOU-HFBLnabZM,9472
33
+ python3_commons-0.22.9.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
34
+ python3_commons-0.22.9.dist-info/scm_file_list.json,sha256=Uq3-KbeUsbtl48_mLNoVDW6V60qhAK9CckqYR0dkXW8,2549
35
+ python3_commons-0.22.9.dist-info/scm_version.json,sha256=cKWwn9r-WYnEN18qN6tJODDvAbWdT2GmfWaQvNV6ZAk,161
36
+ python3_commons-0.22.9.dist-info/top_level.txt,sha256=lJI6sCBf68eUHzupCnn2dzG10lH3jJKTWM_hrN1cQ7M,16
37
+ python3_commons-0.22.9.dist-info/RECORD,,
@@ -1,76 +1,76 @@
1
1
  {
2
2
  "files": [
3
- ".gitignore",
4
- ".python-version",
5
- "README.md",
6
- "AUTHORS.rst",
7
- "CHANGELOG.rst",
8
- "pyproject.toml",
9
- ".env_template",
10
3
  ".coveragerc",
11
4
  ".pre-commit-config.yaml",
5
+ "README.md",
12
6
  "uv.lock",
7
+ ".python-version",
13
8
  "LICENSE",
9
+ "pyproject.toml",
10
+ "CHANGELOG.rst",
11
+ ".env_template",
14
12
  "README.rst",
15
- "src/python3_commons/conf.py",
13
+ ".gitignore",
14
+ "AUTHORS.rst",
15
+ ".devcontainer/Dockerfile",
16
+ ".devcontainer/docker-compose.yml",
17
+ ".devcontainer/devcontainer.json",
18
+ "docs/Makefile",
19
+ "docs/license.rst",
20
+ "docs/authors.rst",
21
+ "docs/index.rst",
22
+ "docs/changelog.rst",
23
+ "docs/conf.py",
24
+ "docs/_static/.gitignore",
25
+ "src/python3_commons/helpers.py",
16
26
  "src/python3_commons/soap_client.py",
17
- "src/python3_commons/async_functools.py",
18
- "src/python3_commons/permissions.py",
19
- "src/python3_commons/fs.py",
20
27
  "src/python3_commons/api_client.py",
21
- "src/python3_commons/audit.py",
22
- "src/python3_commons/object_storage.py",
28
+ "src/python3_commons/__init__.py",
23
29
  "src/python3_commons/exceptions.py",
24
- "src/python3_commons/helpers.py",
25
- "src/python3_commons/generators.py",
26
- "src/python3_commons/cache.py",
30
+ "src/python3_commons/object_storage.py",
31
+ "src/python3_commons/permissions.py",
27
32
  "src/python3_commons/auth.py",
28
- "src/python3_commons/__init__.py",
33
+ "src/python3_commons/audit.py",
34
+ "src/python3_commons/cache.py",
35
+ "src/python3_commons/fs.py",
36
+ "src/python3_commons/conf.py",
37
+ "src/python3_commons/async_functools.py",
38
+ "src/python3_commons/generators.py",
29
39
  "src/python3_commons/db/helpers.py",
30
40
  "src/python3_commons/db/__init__.py",
31
- "src/python3_commons/db/models/common.py",
32
41
  "src/python3_commons/db/models/rbac.py",
33
- "src/python3_commons/db/models/auth.py",
34
- "src/python3_commons/db/models/users.py",
35
42
  "src/python3_commons/db/models/__init__.py",
43
+ "src/python3_commons/db/models/users.py",
44
+ "src/python3_commons/db/models/auth.py",
45
+ "src/python3_commons/db/models/common.py",
46
+ "src/python3_commons/log/__init__.py",
36
47
  "src/python3_commons/log/filters.py",
37
48
  "src/python3_commons/log/formatters.py",
38
- "src/python3_commons/log/__init__.py",
39
- "src/python3_commons/serializers/msgspec.py",
49
+ "src/python3_commons/serializers/__init__.py",
50
+ "src/python3_commons/serializers/msgpack.py",
40
51
  "src/python3_commons/serializers/json.py",
52
+ "src/python3_commons/serializers/msgspec.py",
41
53
  "src/python3_commons/serializers/common.py",
42
- "src/python3_commons/serializers/msgpack.py",
43
- "src/python3_commons/serializers/__init__.py",
44
- ".devcontainer/docker-compose.yml",
45
- ".devcontainer/Dockerfile",
46
- ".devcontainer/devcontainer.json",
47
- ".github/workflows/checks.yml",
48
- ".github/workflows/release-on-tag-push.yml",
49
- ".github/workflows/python-publish.yaml",
50
54
  "tests/__init__.py",
55
+ "tests/integration/__init__.py",
56
+ "tests/integration/test_auth.py",
51
57
  "tests/integration/conftest.py",
52
58
  "tests/integration/test_osc.py",
53
59
  "tests/integration/test_cache.py",
54
- "tests/integration/test_auth.py",
55
- "tests/integration/__init__.py",
60
+ "tests/unit/__init__.py",
61
+ "tests/unit/test_helpers.py",
62
+ "tests/unit/test_auth.py",
56
63
  "tests/unit/test_async_functools.py",
57
- "tests/unit/conftest.py",
58
64
  "tests/unit/test_msgspec.py",
65
+ "tests/unit/conftest.py",
59
66
  "tests/unit/test_audit.py",
60
- "tests/unit/test_auth.py",
61
67
  "tests/unit/test_msgpack.py",
62
- "tests/unit/test_helpers.py",
63
- "tests/unit/__init__.py",
64
- "tests/unit/db/test_async_session_manager.py",
65
68
  "tests/unit/db/__init__.py",
66
- "tests/unit/log/test_formatters.py",
69
+ "tests/unit/db/test_async_session_manager.py",
67
70
  "tests/unit/log/__init__.py",
68
- "docs/conf.py",
69
- "docs/Makefile",
70
- "docs/index.rst",
71
- "docs/authors.rst",
72
- "docs/changelog.rst",
73
- "docs/license.rst",
74
- "docs/_static/.gitignore"
71
+ "tests/unit/log/test_formatters.py",
72
+ ".github/workflows/release-on-tag-push.yml",
73
+ ".github/workflows/python-publish.yaml",
74
+ ".github/workflows/checks.yml"
75
75
  ]
76
76
  }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.22.9",
3
+ "distance": 0,
4
+ "node": "g5d3274d6a478ab8fa7be09b813e214aed723146b",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-07-16"
8
+ }
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "0.22.7",
3
- "distance": 0,
4
- "node": "g5f178ff649355a3292548e00f3c32fdbfcb16d27",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-07-15"
8
- }