python3-commons 0.20.7__tar.gz → 0.20.9__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 (78) hide show
  1. {python3_commons-0.20.7/src/python3_commons.egg-info → python3_commons-0.20.9}/PKG-INFO +2 -2
  2. {python3_commons-0.20.7 → python3_commons-0.20.9}/pyproject.toml +1 -1
  3. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/api_client.py +1 -1
  4. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/auth.py +19 -35
  5. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/db/__init__.py +15 -18
  6. {python3_commons-0.20.7 → python3_commons-0.20.9/src/python3_commons.egg-info}/PKG-INFO +2 -2
  7. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons.egg-info/requires.txt +1 -1
  8. {python3_commons-0.20.7 → python3_commons-0.20.9}/uv.lock +45 -45
  9. {python3_commons-0.20.7 → python3_commons-0.20.9}/.coveragerc +0 -0
  10. {python3_commons-0.20.7 → python3_commons-0.20.9}/.devcontainer/Dockerfile +0 -0
  11. {python3_commons-0.20.7 → python3_commons-0.20.9}/.devcontainer/devcontainer.json +0 -0
  12. {python3_commons-0.20.7 → python3_commons-0.20.9}/.devcontainer/docker-compose.yml +0 -0
  13. {python3_commons-0.20.7 → python3_commons-0.20.9}/.env_template +0 -0
  14. {python3_commons-0.20.7 → python3_commons-0.20.9}/.github/workflows/checks.yml +0 -0
  15. {python3_commons-0.20.7 → python3_commons-0.20.9}/.github/workflows/python-publish.yaml +0 -0
  16. {python3_commons-0.20.7 → python3_commons-0.20.9}/.github/workflows/release-on-tag-push.yml +0 -0
  17. {python3_commons-0.20.7 → python3_commons-0.20.9}/.gitignore +0 -0
  18. {python3_commons-0.20.7 → python3_commons-0.20.9}/.pre-commit-config.yaml +0 -0
  19. {python3_commons-0.20.7 → python3_commons-0.20.9}/.python-version +0 -0
  20. {python3_commons-0.20.7 → python3_commons-0.20.9}/AUTHORS.rst +0 -0
  21. {python3_commons-0.20.7 → python3_commons-0.20.9}/CHANGELOG.rst +0 -0
  22. {python3_commons-0.20.7 → python3_commons-0.20.9}/LICENSE +0 -0
  23. {python3_commons-0.20.7 → python3_commons-0.20.9}/README.md +0 -0
  24. {python3_commons-0.20.7 → python3_commons-0.20.9}/README.rst +0 -0
  25. {python3_commons-0.20.7 → python3_commons-0.20.9}/docs/Makefile +0 -0
  26. {python3_commons-0.20.7 → python3_commons-0.20.9}/docs/_static/.gitignore +0 -0
  27. {python3_commons-0.20.7 → python3_commons-0.20.9}/docs/authors.rst +0 -0
  28. {python3_commons-0.20.7 → python3_commons-0.20.9}/docs/changelog.rst +0 -0
  29. {python3_commons-0.20.7 → python3_commons-0.20.9}/docs/conf.py +0 -0
  30. {python3_commons-0.20.7 → python3_commons-0.20.9}/docs/index.rst +0 -0
  31. {python3_commons-0.20.7 → python3_commons-0.20.9}/docs/license.rst +0 -0
  32. {python3_commons-0.20.7 → python3_commons-0.20.9}/setup.cfg +0 -0
  33. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/__init__.py +0 -0
  34. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/async_functools.py +0 -0
  35. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/audit.py +0 -0
  36. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/cache.py +0 -0
  37. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/conf.py +0 -0
  38. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/db/helpers.py +0 -0
  39. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/db/models/__init__.py +0 -0
  40. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/db/models/auth.py +0 -0
  41. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/db/models/common.py +0 -0
  42. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/db/models/rbac.py +0 -0
  43. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/db/models/users.py +0 -0
  44. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/exceptions.py +0 -0
  45. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/fs.py +0 -0
  46. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/generators.py +0 -0
  47. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/helpers.py +0 -0
  48. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/log/__init__.py +0 -0
  49. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/log/filters.py +0 -0
  50. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/log/formatters.py +0 -0
  51. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/object_storage.py +0 -0
  52. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/permissions.py +0 -0
  53. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/serializers/__init__.py +0 -0
  54. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/serializers/common.py +0 -0
  55. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/serializers/json.py +0 -0
  56. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/serializers/msgpack.py +0 -0
  57. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/serializers/msgspec.py +0 -0
  58. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons/soap_client.py +0 -0
  59. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons.egg-info/SOURCES.txt +0 -0
  60. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons.egg-info/dependency_links.txt +0 -0
  61. {python3_commons-0.20.7 → python3_commons-0.20.9}/src/python3_commons.egg-info/top_level.txt +0 -0
  62. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/__init__.py +0 -0
  63. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/integration/__init__.py +0 -0
  64. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/integration/conftest.py +0 -0
  65. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/integration/test_auth.py +0 -0
  66. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/integration/test_cache.py +0 -0
  67. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/integration/test_osc.py +0 -0
  68. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/unit/__init__.py +0 -0
  69. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/unit/conftest.py +0 -0
  70. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/unit/db/__init__.py +0 -0
  71. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/unit/db/test_async_session_manager.py +0 -0
  72. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/unit/log/__init__.py +0 -0
  73. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/unit/log/test_formatters.py +0 -0
  74. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/unit/test_async_functools.py +0 -0
  75. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/unit/test_audit.py +0 -0
  76. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/unit/test_helpers.py +0 -0
  77. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/unit/test_msgpack.py +0 -0
  78. {python3_commons-0.20.7 → python3_commons-0.20.9}/tests/unit/test_msgspec.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python3-commons
3
- Version: 0.20.7
3
+ Version: 0.20.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
@@ -36,7 +36,7 @@ Provides-Extra: cache
36
36
  Requires-Dist: valkey[libvalkey]~=6.1.1; extra == "cache"
37
37
  Provides-Extra: database
38
38
  Requires-Dist: asyncpg~=0.31.0; extra == "database"
39
- Requires-Dist: SQLAlchemy[asyncio]~=2.0.49; extra == "database"
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
42
  Requires-Dist: object-storage-client==0.0.30; extra == "object-storage"
@@ -51,7 +51,7 @@ cache = [
51
51
  ]
52
52
  database = [
53
53
  "asyncpg~=0.31.0",
54
- "SQLAlchemy[asyncio]~=2.0.49"
54
+ "SQLAlchemy[asyncio]~=2.0.50"
55
55
  ]
56
56
  object-storage = [
57
57
  "aiobotocore~=3.7.0",
@@ -60,7 +60,7 @@ async def request(
60
60
  request_id = str(uuid4())[-12:]
61
61
  uri_path = uri.removesuffix('/')
62
62
  uri_path = uri_path.removeprefix('/')
63
- url = f'{u[:-1] if (u := str(base_url)).endswith("/") else u}{uri}'
63
+ url = f'{u[:-1] if (u := str(base_url)).endswith("/") else u}{uri}' if uri else base_url
64
64
 
65
65
  if audit_name:
66
66
  curl_request = None
@@ -1,7 +1,6 @@
1
1
  import logging
2
2
  import threading
3
3
  from collections.abc import Mapping, Sequence
4
- from http import HTTPStatus
5
4
  from typing import Any, Self, TypeVar
6
5
 
7
6
  from pydantic import HttpUrl
@@ -10,8 +9,10 @@ from python3_commons.helpers import replace_origin
10
9
 
11
10
  try:
12
11
  import aiohttp
12
+
13
+ from python3_commons import api_client
13
14
  except ImportError as e:
14
- msg = 'Install python3-commons[authn] to use this feature'
15
+ msg = 'Install python3-commons[api-client] to use this feature'
15
16
  raise RuntimeError(msg) from e
16
17
 
17
18
  import msgspec
@@ -70,7 +71,6 @@ class OIDCAuthError(OIDCError):
70
71
  pass
71
72
 
72
73
 
73
- # TODO: use api_client
74
74
  class OIDCClient:
75
75
  def __init__(
76
76
  self,
@@ -82,6 +82,7 @@ class OIDCClient:
82
82
  verify_cert: bool = True,
83
83
  connection_limit: int = 100,
84
84
  authority_internal_host: HttpUrl | None = None,
85
+ audit_name: str | None = None,
85
86
  ) -> None:
86
87
  if authority_internal_host:
87
88
  authority_url = replace_origin(authority_url, authority_internal_host)
@@ -98,8 +99,9 @@ class OIDCClient:
98
99
 
99
100
  self._config: Mapping[str, Any] | None = None
100
101
  self._jwks: Mapping[str, Any] | None = None
102
+ self._audit_name: str | None = audit_name
101
103
 
102
- def get_session(self) -> aiohttp.ClientSession:
104
+ def _get_session(self) -> aiohttp.ClientSession:
103
105
  if self._session:
104
106
  return self._session
105
107
 
@@ -115,7 +117,7 @@ class OIDCClient:
115
117
  return session
116
118
 
117
119
  async def __aenter__(self) -> Self:
118
- self.get_session()
120
+ self._get_session()
119
121
 
120
122
  return self
121
123
 
@@ -127,20 +129,12 @@ class OIDCClient:
127
129
  """
128
130
  Fetch the OpenID configuration (including JWKS URI) from OIDC authority.
129
131
  """
130
- if self._session is None:
131
- msg = 'ClientSession not initialized'
132
- raise RuntimeError(msg)
133
-
134
- oidc_config_url = f'{self._authority_url}/.well-known/openid-configuration'
135
-
136
- logger.debug('Fetching OpenID configuration from: %s', oidc_config_url)
137
-
138
- async with self._session.get(oidc_config_url) as response:
139
- if response.status != HTTPStatus.OK:
140
- _msg = 'Failed to fetch OpenID configuration'
141
-
142
- raise RuntimeError(_msg)
143
-
132
+ async with api_client.request(
133
+ self._get_session(),
134
+ str(self._authority_url),
135
+ '/.well-known/openid-configuration',
136
+ audit_name=self._audit_name,
137
+ ) as response:
144
138
  return await response.json()
145
139
 
146
140
  async def get_config(self) -> Mapping[str, Any]:
@@ -160,22 +154,13 @@ class OIDCClient:
160
154
  """
161
155
  Fetch the JSON Web Key Set (JWKS) for validating the token's signature.
162
156
  """
163
- if self._session is None:
164
- msg = 'ClientSession not initialized'
165
- raise RuntimeError(msg)
166
-
167
157
  if authority_internal_host := self._authority_internal_host:
168
158
  logger.debug('Received jwks_uri: %s', jwks_uri)
169
159
  logger.debug('Replacing OIDC authority host with: %s', authority_internal_host)
170
160
  jwks_uri = str(replace_origin(HttpUrl(jwks_uri), authority_internal_host))
171
161
  logger.debug('Modified jwks_uri: %s', jwks_uri)
172
162
 
173
- async with self._session.get(jwks_uri) as response:
174
- if response.status != HTTPStatus.OK:
175
- _msg = 'Failed to fetch JWKS'
176
-
177
- raise RuntimeError(_msg)
178
-
163
+ async with api_client.request(self._get_session(), jwks_uri, '', audit_name=self._audit_name) as response:
179
164
  return await response.json()
180
165
 
181
166
  async def get_jwks(self) -> Mapping[str, Any]:
@@ -200,10 +185,6 @@ class OIDCClient:
200
185
  password: str,
201
186
  scope: str = 'openid profile email',
202
187
  ) -> OIDCTokenResponse:
203
- if self._session is None:
204
- msg = 'ClientSession not initialized'
205
- raise RuntimeError(msg)
206
-
207
188
  data = {
208
189
  'grant_type': 'password',
209
190
  'username': username,
@@ -218,9 +199,12 @@ class OIDCClient:
218
199
  openid_config = await self.get_config()
219
200
 
220
201
  try:
221
- async with self._session.post(
202
+ async with api_client.request(
203
+ self._get_session(),
222
204
  openid_config['token_endpoint'],
223
- data=data,
205
+ '',
206
+ method='post',
207
+ json=data,
224
208
  headers={'Content-Type': 'application/x-www-form-urlencoded'},
225
209
  ) as response:
226
210
  payload = await response.read()
@@ -1,4 +1,3 @@
1
- import asyncio
2
1
  import contextlib
3
2
  import logging
4
3
  import time
@@ -159,19 +158,18 @@ class AsyncSessionManager:
159
158
  logger.debug('Acquiring session for %r', name)
160
159
 
161
160
  try:
162
- async with asyncio.timeout(self.pool_acquire_timeout):
163
- async with session_maker() as session:
164
- session_acquired = True
165
- elapsed = time.monotonic() - t0
166
- logger.debug('Session acquired for %r in %.3fs', name, elapsed)
167
-
168
- try:
169
- yield session
170
- except Exception:
171
- logger.exception('Database communication error for %r; rolling back', name)
172
- await session.rollback()
173
-
174
- raise
161
+ async with session_maker() as session:
162
+ session_acquired = True
163
+ elapsed = time.monotonic() - t0
164
+ logger.debug('Session acquired for %r in %.3fs', name, elapsed)
165
+
166
+ try:
167
+ yield session
168
+ except Exception:
169
+ logger.exception('Database communication error for %r; rolling back', name)
170
+ await session.rollback()
171
+
172
+ raise
175
173
  except TimeoutError as e:
176
174
  if session_acquired:
177
175
  raise
@@ -230,10 +228,9 @@ async def is_healthy(
230
228
  t0 = time.monotonic()
231
229
 
232
230
  try:
233
- async with asyncio.timeout(timeout):
234
- async with engine.begin() as conn:
235
- result = await conn.execute(text('SELECT 1'))
236
- healthy = result.scalar() == 1
231
+ async with engine.begin() as conn:
232
+ result = await conn.execute(text('SELECT 1'))
233
+ healthy = result.scalar() == 1
237
234
 
238
235
  elapsed = time.monotonic() - t0
239
236
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python3-commons
3
- Version: 0.20.7
3
+ Version: 0.20.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
@@ -36,7 +36,7 @@ Provides-Extra: cache
36
36
  Requires-Dist: valkey[libvalkey]~=6.1.1; extra == "cache"
37
37
  Provides-Extra: database
38
38
  Requires-Dist: asyncpg~=0.31.0; extra == "database"
39
- Requires-Dist: SQLAlchemy[asyncio]~=2.0.49; extra == "database"
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
42
  Requires-Dist: object-storage-client==0.0.30; extra == "object-storage"
@@ -29,7 +29,7 @@ valkey[libvalkey]~=6.1.1
29
29
 
30
30
  [database]
31
31
  asyncpg~=0.31.0
32
- SQLAlchemy[asyncio]~=2.0.49
32
+ SQLAlchemy[asyncio]~=2.0.50
33
33
 
34
34
  [object-storage]
35
35
  aiobotocore~=3.7.0
@@ -190,14 +190,14 @@ wheels = [
190
190
 
191
191
  [[package]]
192
192
  name = "botocore-stubs"
193
- version = "1.42.41"
193
+ version = "1.43.14"
194
194
  source = { registry = "https://pypi.org/simple" }
195
195
  dependencies = [
196
196
  { name = "types-awscrt" },
197
197
  ]
198
- sdist = { url = "https://files.pythonhosted.org/packages/0c/a8/a26608ff39e3a5866c6c79eda10133490205cbddd45074190becece3ff2a/botocore_stubs-1.42.41.tar.gz", hash = "sha256:dbeac2f744df6b814ce83ec3f3777b299a015cbea57a2efc41c33b8c38265825", size = 42411, upload-time = "2026-02-03T20:46:14.479Z" }
198
+ sdist = { url = "https://files.pythonhosted.org/packages/7f/81/79693e833291c00dc89ee610e5e915381b6f08233912e28df50106840780/botocore_stubs-1.43.14.tar.gz", hash = "sha256:9e3bc1fdd51da7473f0df726c82747a1b0ae913449d629659765c247fecc2039", size = 42738, upload-time = "2026-05-25T06:06:37.484Z" }
199
199
  wheels = [
200
- { url = "https://files.pythonhosted.org/packages/32/76/cab7af7f16c0b09347f2ebe7ffda7101132f786acb767666dce43055faab/botocore_stubs-1.42.41-py3-none-any.whl", hash = "sha256:9423110fb0e391834bd2ed44ae5f879d8cb370a444703d966d30842ce2bcb5f0", size = 66759, upload-time = "2026-02-03T20:46:13.02Z" },
200
+ { url = "https://files.pythonhosted.org/packages/89/ca/f017727b11895908c5dedc829cf2ec35e0c4b2a26ba875db325fef2cefdf/botocore_stubs-1.43.14-py3-none-any.whl", hash = "sha256:fb98f1475c92fd718644e786b5c543a20f1b1f610e89e0a7191c3f1f429c75aa", size = 67093, upload-time = "2026-05-25T06:06:34.532Z" },
201
201
  ]
202
202
 
203
203
  [[package]]
@@ -356,41 +356,41 @@ wheels = [
356
356
 
357
357
  [[package]]
358
358
  name = "coverage"
359
- version = "7.14.0"
360
- source = { registry = "https://pypi.org/simple" }
361
- sdist = { url = "https://files.pythonhosted.org/packages/23/7f/d0720730a397a999ffc0fd3f5bebef347338e3a47b727da66fbb228e2ff2/coverage-7.14.0.tar.gz", hash = "sha256:057a6af2f160a85384cde4ab36f0d2777bae1057bae255f95413cdd382aa5c74", size = 919489, upload-time = "2026-05-10T18:02:31.397Z" }
362
- wheels = [
363
- { url = "https://files.pythonhosted.org/packages/1c/18/b9a6586d73992807c26f9a5f274131be3d76b56b18a82b9392e2a25d2e45/coverage-7.14.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9aed9fa983514ca032790f3fe0d1c0e42ca7e16b42432af1706b50a9a46bef5d", size = 220036, upload-time = "2026-05-10T18:01:33.057Z" },
364
- { url = "https://files.pythonhosted.org/packages/f3/9b/4165a1d56ddc302a0e2d518fd9d412a4fd0b57562618c78c5f21c57194f5/coverage-7.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ba3b8390db29296dbbf49e91b6fe08f990743a90c8f447ba4c2ffc29670dfa63", size = 220368, upload-time = "2026-05-10T18:01:34.705Z" },
365
- { url = "https://files.pythonhosted.org/packages/69/aa/c12e52a5ba148d9995229d557e3be6e554fe469addc0e9241b2f0956d8ea/coverage-7.14.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3a5d8e876dfa2f102e970b183863d6dedd023d3c0eeca1fe7a9787bc5f28b212", size = 251417, upload-time = "2026-05-10T18:01:36.949Z" },
366
- { url = "https://files.pythonhosted.org/packages/d7/51/ec641c26e6dca1b25a7d2035ba6ecb7c884ef1a100a9e42fbe4ce4405139/coverage-7.14.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5ebb8f4614a3787d567e610bbfdf96a4798dd69a1afb1bd8ad228d4111fe6ff3", size = 253924, upload-time = "2026-05-10T18:01:38.985Z" },
367
- { url = "https://files.pythonhosted.org/packages/33/c4/59c3de0bd1b538824173fd518fed51c1ce740ca5ed68e74545983f4053a9/coverage-7.14.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b9bf47223dd8db3d4c4b2e443b02bace480d428f0822c3f991600448a176c97", size = 255269, upload-time = "2026-05-10T18:01:40.957Z" },
368
- { url = "https://files.pythonhosted.org/packages/7b/a9/36dfa153a62040296f6e7febfdb20a5720622f6ef5a81a41e8237b9a5344/coverage-7.14.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3485a836550b303d006d57cc06e3d5afaabc642c77050b7c985a97b13e3776b8", size = 257583, upload-time = "2026-05-10T18:01:42.607Z" },
369
- { url = "https://files.pythonhosted.org/packages/26/7b/cc2c048d4114d9ab1c2409e9ee365e5ae10736df6dffcfc9444effa6c708/coverage-7.14.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e7e88110bae996d199d1693ca8ec3fd52441d426401ae963437598667b4c5eb", size = 251434, upload-time = "2026-05-10T18:01:44.537Z" },
370
- { url = "https://files.pythonhosted.org/packages/ee/df/6770eaa576e604575e9a78055313250faef5faa84bd6f71a39fece519c43/coverage-7.14.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15228a6800ce7bdf1b74800595e56db7138cecb338fdbf044806e10dcf182dfe", size = 253280, upload-time = "2026-05-10T18:01:46.175Z" },
371
- { url = "https://files.pythonhosted.org/packages/ad/9e/1c0264514a3f98259a6d64765a397b2c8373e3ba59ee722a4802d3ec0c61/coverage-7.14.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9d26ac7f5398bafc5b57421ad994e8a4749e8a7a0e62d05ec7d53014d5963bfa", size = 251241, upload-time = "2026-05-10T18:01:48.732Z" },
372
- { url = "https://files.pythonhosted.org/packages/64/16/4efdf3e3c4079cdbf0ece56a2fea872df9e8a3e15a13a0af4400e1075944/coverage-7.14.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb73254ff43c911c967a899e1359bc5049b4b115d6e8fbdde4937d0a2246cd5", size = 255516, upload-time = "2026-05-10T18:01:50.819Z" },
373
- { url = "https://files.pythonhosted.org/packages/93/69/b1de96346603881b3d1bc8d6447c83200e1c9700ffbaff926ba01ff5724c/coverage-7.14.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:454a380af72c6adada298ed270d38c7a391288198dbfb8467f786f588751a90c", size = 251059, upload-time = "2026-05-10T18:01:52.773Z" },
374
- { url = "https://files.pythonhosted.org/packages/a4/66/2881853e0363a5e0a724d1103e53650795367471b6afb234f8b49e713bc6/coverage-7.14.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:65c86fb646d2bd2972e96bd1a8b45817ed907cee68655d6295fe7ec031d04cca", size = 252716, upload-time = "2026-05-10T18:01:54.506Z" },
375
- { url = "https://files.pythonhosted.org/packages/55/5c/0d3305d002c41dcde873dbe456491e663dc55152ca526b630b5c47efd62f/coverage-7.14.0-cp314-cp314-win32.whl", hash = "sha256:6a6516b02a6101398e19a3f44820f69bab2590697f7def4331f668b14adaf828", size = 222788, upload-time = "2026-05-10T18:01:56.487Z" },
376
- { url = "https://files.pythonhosted.org/packages/f9/58/6e1b8f52fdc3184b47dc5037f5070d83a3d11042db1594b02d2a44d786c8/coverage-7.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:45e0f79d8351fa76e256716df91eab12890d32678b9590df7ae1042e4bd4cf5d", size = 223600, upload-time = "2026-05-10T18:01:58.497Z" },
377
- { url = "https://files.pythonhosted.org/packages/00/70/a18c408e674bc26281cadaedc7351f929bd2094e191e4b15271c30b084cc/coverage-7.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:4b899594a8b2d81e5cc064a0d7f9cac2081fed91049456cae7676787e41549c9", size = 222168, upload-time = "2026-05-10T18:02:00.411Z" },
378
- { url = "https://files.pythonhosted.org/packages/3d/89/2681f071d238b62aff8dfc2ab44fc24cfdb38d1c01f391a80522ff5d3a16/coverage-7.14.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f580f8c80acd94ac72e863efe2cab791d8c38d153e0b463b92dfa000d5c84cd1", size = 220766, upload-time = "2026-05-10T18:02:02.313Z" },
379
- { url = "https://files.pythonhosted.org/packages/bd/c7/c987babafd9207ffa1995e1ef1f9b26762cf4963aa768a66b6f0501e4616/coverage-7.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a2bd259c442cd43c49b30fbafc51776eb19ea396faf159d26a83e6a0a5f13b0c", size = 221035, upload-time = "2026-05-10T18:02:04.017Z" },
380
- { url = "https://files.pythonhosted.org/packages/5a/e9/d6a5ac3b333088143d6fc877d398a9a674dc03124a2f776e131f03864823/coverage-7.14.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a706b908dfa85538863504c624b237a3cc34232bf403c057414ebfdb3b4d9f84", size = 262405, upload-time = "2026-05-10T18:02:05.915Z" },
381
- { url = "https://files.pythonhosted.org/packages/38/b1/e70838d29a7c08e22d44398a46db90815bbcbf28de06992bd9210d1a8d8e/coverage-7.14.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7333cd944ee4393b9b3d3c1b598c936d4fc8d70573a4c7dacfec5590dd50e436", size = 264530, upload-time = "2026-05-10T18:02:07.582Z" },
382
- { url = "https://files.pythonhosted.org/packages/6b/73/5c31ef97763288d03d9995152b96d5475b527c63d91c84b01caea894b83a/coverage-7.14.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f162bc9a15b82d947b02651b0c7e1609d6f7a8735ca330cfadec8481dd97d5a", size = 266932, upload-time = "2026-05-10T18:02:09.401Z" },
383
- { url = "https://files.pythonhosted.org/packages/e1/76/dd56d80f29c5f05b4d76f7e7c6d47cafacae017189c75c5759d24f9ff0cc/coverage-7.14.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:362cb78e01a5dc82009d88004cf60f2e6b6d6fcbfdec05b05af73b0abf40118f", size = 268062, upload-time = "2026-05-10T18:02:11.399Z" },
384
- { url = "https://files.pythonhosted.org/packages/6e/c7/27ba85cd5b95614f159ff93ebff1901584a8d192e2e5e24c4943a7453f59/coverage-7.14.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:acebd068fca5512c3a6fde9c045f901613478781a73f0e82b307b214daef23fb", size = 261504, upload-time = "2026-05-10T18:02:13.257Z" },
385
- { url = "https://files.pythonhosted.org/packages/13/2e/e8149f60ab5d5684c6eee881bdf34b127115cddbb958b196768dd9d63473/coverage-7.14.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:29fe3da551dface75deb2ccbf87b6b66e2e7ef38f6d89050b428be94afff3490", size = 264398, upload-time = "2026-05-10T18:02:15.063Z" },
386
- { url = "https://files.pythonhosted.org/packages/d9/7f/1261b025285323225f4b4abffa5a643649dfd67e25ddca7ebcbdea3b7cb3/coverage-7.14.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b4cc4fce8672fffcb09b0eafc167b396b3ba53c4a7230f54b7aaffbf6c835fa9", size = 262000, upload-time = "2026-05-10T18:02:16.756Z" },
387
- { url = "https://files.pythonhosted.org/packages/d3/dc/829c54f60b9d08389439c00f813c752781c496fc5788c78d8006db4b4f2b/coverage-7.14.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5d4a51aad8ba8bdcd2b8bd8f03d4aca19693fa2327a3470e4718a25b03481020", size = 265732, upload-time = "2026-05-10T18:02:18.817Z" },
388
- { url = "https://files.pythonhosted.org/packages/ed/b0/70bd1419941652fa062689cba9c3eeafb8f5e6fbb890bce41c3bdda5dbd6/coverage-7.14.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9f323af3e1e4f68b60b7b247e37b8515563a61375518fa59de1af48ba28a3db6", size = 260847, upload-time = "2026-05-10T18:02:20.528Z" },
389
- { url = "https://files.pythonhosted.org/packages/f2/73/be40b2390656c654d35ea0015ea7ba3d945769cf80790ad5e0bb2d56d2ba/coverage-7.14.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1a0abc7342ea9711c469dd8b821c6c311e6bc6aac1442e5fbd6b27fae0a8f3db", size = 263166, upload-time = "2026-05-10T18:02:22.337Z" },
390
- { url = "https://files.pythonhosted.org/packages/29/55/4a643f712fcf7cf2881f8ec1e0ccb7b164aff3108f69b51801246c8799f2/coverage-7.14.0-cp314-cp314t-win32.whl", hash = "sha256:a9f864ef57b7172e2db87a096642dd51e179e085ab6b2c371c29e885f65c8fb2", size = 223573, upload-time = "2026-05-10T18:02:24.11Z" },
391
- { url = "https://files.pythonhosted.org/packages/27/96/3acae5da0953be042c0b4dea6d6789d2f080701c77b88e44d5bd41b9219b/coverage-7.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:29943e552fdc08e082eb51400fb2f58e118a83b5542bd06531214e084399b644", size = 224680, upload-time = "2026-05-10T18:02:25.896Z" },
392
- { url = "https://files.pythonhosted.org/packages/93/3d/6ab5d2dd8325d838737c6f8d83d62eb6230e0d70b87b51b57bbfd08fa767/coverage-7.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:742a73ea621953b012f2c4c2219b512180dd84489acf5b1596b0aafc55b9100b", size = 222703, upload-time = "2026-05-10T18:02:27.822Z" },
393
- { url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" },
359
+ version = "7.14.1"
360
+ source = { registry = "https://pypi.org/simple" }
361
+ sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", hash = "sha256:30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be", size = 920132, upload-time = "2026-05-26T20:41:36.783Z" }
362
+ wheels = [
363
+ { url = "https://files.pythonhosted.org/packages/d6/34/fc2f101b151af3799a101f0550b0454aa008afdc0add677394ec4aa8ea10/coverage-7.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d5ed429d0b8edaac649e889b4ffcedb6c80b06629a3f93050e3dddfb99235bee", size = 220091, upload-time = "2026-05-26T20:40:27.249Z" },
364
+ { url = "https://files.pythonhosted.org/packages/3d/a7/1ebae2ab5b961b5c79bb09fe7b3ac99edb190d8be4a8c510b2cf66f46468/coverage-7.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8011224a62280e50dab346960c03cf47aca1a1e09e608c0fb33fd6e0cc8e9500", size = 220421, upload-time = "2026-05-26T20:40:30.084Z" },
365
+ { url = "https://files.pythonhosted.org/packages/5e/90/92aca9cf0acc95123c96cd1eb1f08917897a7f5dee01e15738922971ec31/coverage-7.14.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:12c42ec1e14f553c4f817e989365982e646e27211f10a0f717855b94a79c8906", size = 251466, upload-time = "2026-05-26T20:40:32.542Z" },
366
+ { url = "https://files.pythonhosted.org/packages/26/2b/78048cbe3b999f6cbf9cc0d90abba6a88a3e0863a8c1c6cbc762f3f8802f/coverage-7.14.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:06144cd511cf2624873a035c5069cf297144f6e77a73ee3d7a55b605ec5efb42", size = 253973, upload-time = "2026-05-26T20:40:34.473Z" },
367
+ { url = "https://files.pythonhosted.org/packages/8e/21/c2e33b29d1cfde484a19d437afc343c6cd30b08d78cbbf9f5aff14e57b2b/coverage-7.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a311d8e1da24be5c1ccf85cbfb06315dbaa1703d5a1eab3f6432c72b837917c8", size = 255318, upload-time = "2026-05-26T20:40:38.154Z" },
368
+ { url = "https://files.pythonhosted.org/packages/8e/ee/aad2f108d63b769121005302f16bf66db8625c88ceaba466942e09a2607e/coverage-7.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c79cead5b5bc584d9c71451cb984d0e3a84e0c0937379c8efcbf27c8d661b851", size = 257633, upload-time = "2026-05-26T20:40:40.164Z" },
369
+ { url = "https://files.pythonhosted.org/packages/c2/f8/11a2c29b4fd76d9849f81d0bb812ec0017a9396df3217214e38934a8c837/coverage-7.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dcbf65f1f66a26cdd88c35cf68fb4729c5d1cd2e88added72420541dfb212034", size = 251488, upload-time = "2026-05-26T20:40:42.631Z" },
370
+ { url = "https://files.pythonhosted.org/packages/c9/b8/9a5820de4b8ac2b71d85e3b5fb49108d7469c665f0e2ad0dd7569023e305/coverage-7.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fd86572566fb40189a8260446158235159bc7a82dfbc87a3b39cf4fb57fcec1c", size = 253329, upload-time = "2026-05-26T20:40:45.208Z" },
371
+ { url = "https://files.pythonhosted.org/packages/6b/ff/f33e4823667e27548e8fd8df44217515303f9808d0ff29817db56f87d990/coverage-7.14.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:7771b601718fdde84832c3a434ca9bbf4ae9adbc49d84198b4110700c3c77c36", size = 251291, upload-time = "2026-05-26T20:40:47.502Z" },
372
+ { url = "https://files.pythonhosted.org/packages/68/9b/489db0ebb209054766b90a9014a45f6d26eb724c02ec21311c3733b5a644/coverage-7.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:39b21e212c55af06fa375e3dbf90a8a8e38792f3a910c580066d23563830ddd5", size = 255564, upload-time = "2026-05-26T20:40:49.372Z" },
373
+ { url = "https://files.pythonhosted.org/packages/27/b5/16bc2d4c2409b23c7737edb68c83bc89e345f378050549fe1d75ac7d34d5/coverage-7.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f2302660e32562a532b442480121aef8aa61a5bdb20b30bf0adab29f10a5a4b4", size = 251107, upload-time = "2026-05-26T20:40:51.677Z" },
374
+ { url = "https://files.pythonhosted.org/packages/7d/0c/2629997469a00cd069d588a41c9dc887610f2775ae89d250c4791e65272a/coverage-7.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:03a6f93c1ec3b7f2e77b5dbcc5573a2c21f12529a5c6bbe0f16f72303cc2fa4d", size = 252764, upload-time = "2026-05-26T20:40:54.267Z" },
375
+ { url = "https://files.pythonhosted.org/packages/d2/ee/f78d63c8f079e0d7211c7e2401fa17e311514534ba61bae03e4b287ce4ab/coverage-7.14.1-cp314-cp314-win32.whl", hash = "sha256:8a3ce026d73290f42f08dafecbd82c193a74df280461fbf97300fec51fd133ee", size = 222837, upload-time = "2026-05-26T20:40:56.496Z" },
376
+ { url = "https://files.pythonhosted.org/packages/dc/b9/be539854f93a70dfbeec69117f33ec70dc42ff0b65b5b07ab8d40d04228e/coverage-7.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:114c95ef29302423b87d159075805f4ab973254a2638a5d7d046c94887cc87d7", size = 223650, upload-time = "2026-05-26T20:40:58.351Z" },
377
+ { url = "https://files.pythonhosted.org/packages/fe/9e/24e2842fef40f35ac82ba3a7719c8023d011bf3bf652d0675316a9d088a1/coverage-7.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:a07891c3f4805442b31b71e84ba3cf29ed1aa9a428284e06deeb4b23e5b46343", size = 222218, upload-time = "2026-05-26T20:41:00.321Z" },
378
+ { url = "https://files.pythonhosted.org/packages/0a/1d/ac0a9df5fe31c1e8bdd658074905fc12844a05c1a7e3fdb8417e97c31e23/coverage-7.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1101a5ebb083aecb625ebb6209d4105b58f647b093cb2dc8122d7b33f743cfe1", size = 220822, upload-time = "2026-05-26T20:41:02.281Z" },
379
+ { url = "https://files.pythonhosted.org/packages/32/cf/f964fd9aff20323f9f1a726c97135f8a76bcd87b92dad141a456a43f3c64/coverage-7.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:851b9e1e4e8a4608e77c79714b2e77c0970d2ed7202a05e92ae407817481887b", size = 221084, upload-time = "2026-05-26T20:41:04.593Z" },
380
+ { url = "https://files.pythonhosted.org/packages/d8/5e/7e5ef2aba844de2b80d678619fcf0841b42e3f37f16411226f3fe4c1016f/coverage-7.14.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d5b89cdfb2ee051b71e8c3c70bd81a9eff81100f736a269136fe1a68efe00474", size = 262454, upload-time = "2026-05-26T20:41:06.641Z" },
381
+ { url = "https://files.pythonhosted.org/packages/64/62/75809bded87015cc4935524218a2a8ed8dd1a8498bfed30a2f4f7a4b4d34/coverage-7.14.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0177614a0370f227888b4e436a7c55686d6a9f90eb1ade2b624ba685a1686e86", size = 264578, upload-time = "2026-05-26T20:41:08.556Z" },
382
+ { url = "https://files.pythonhosted.org/packages/f3/42/d33392dc14633525012d2d504fa1a33b05538bf535f5c1d64675e5754b78/coverage-7.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d69af5dea2de76fc485a83032a630523f985198b7e25be901ec60181587b01e", size = 266981, upload-time = "2026-05-26T20:41:10.824Z" },
383
+ { url = "https://files.pythonhosted.org/packages/2a/49/0157c4428c2aca7f1e09d5565930586fd5ae36f1655f08b0daa7cf1fcae1/coverage-7.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:35ab22d91de736e8966b980dc355cbcdd2c6dbbcfe275f9a2991bc8a91b3df65", size = 268112, upload-time = "2026-05-26T20:41:12.966Z" },
384
+ { url = "https://files.pythonhosted.org/packages/96/26/86b9ce71f4092b1ed325ce1421698081df1286b833400b6836912834d6e0/coverage-7.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:357d4e32935c36588aaba057d734fa32428c360c9fc2e4442afbf1b646beee6e", size = 261558, upload-time = "2026-05-26T20:41:15Z" },
385
+ { url = "https://files.pythonhosted.org/packages/20/4c/c311210c5472cf5401d8422b0d7812cdd520f24417673afabda6c323faca/coverage-7.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:51bd64741cc6fa065abd300ede1afe5a5291ece9c31da8b24884deda48bcc3f8", size = 264447, upload-time = "2026-05-26T20:41:17.369Z" },
386
+ { url = "https://files.pythonhosted.org/packages/fb/71/59513f8710ed3e6b0ac0a050a5b7e977bb9c9e880354863b5d00d8809256/coverage-7.14.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9132cd363a68a4c3daa7c8704a654b1e39d3360f6f5b8ddd470608a945236c07", size = 262048, upload-time = "2026-05-26T20:41:19.309Z" },
387
+ { url = "https://files.pythonhosted.org/packages/84/8d/bceed32dc494f5bbf50f775cd2e78ca814953942b5ea28d3c1c3ac316f14/coverage-7.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:07c6290b1697b862c0478eab545eec949a0d0e4d6d03497f446d706da3b4f2de", size = 265781, upload-time = "2026-05-26T20:41:21.559Z" },
388
+ { url = "https://files.pythonhosted.org/packages/e7/c5/9348fe40dbfd4991aaf78df2c6c3098bfb2cc834d1fd362a64b4efef855a/coverage-7.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5ea0c297e27133853b4d8a3eb799bff5a2dbd9f2f41537a240d337ac9b4df890", size = 260896, upload-time = "2026-05-26T20:41:23.428Z" },
389
+ { url = "https://files.pythonhosted.org/packages/ca/92/1ea0f03929da7cf87206b1fa24f4c8e9c158be0455481af29ec0a1f3503f/coverage-7.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:01b7733daad0237daa01ef80fe2dfceffc911e6a17fa7b55d14aa8214eaaaecd", size = 263214, upload-time = "2026-05-26T20:41:25.419Z" },
390
+ { url = "https://files.pythonhosted.org/packages/f6/a9/b2493c054c0e01a643266742ab45e15744e60743f9260cd930c7142b1124/coverage-7.14.1-cp314-cp314t-win32.whl", hash = "sha256:6adc5a36984624a70bf11d7184e20fa0a49aa7c47ffab43804106a1a695ea22e", size = 223624, upload-time = "2026-05-26T20:41:27.795Z" },
391
+ { url = "https://files.pythonhosted.org/packages/fc/bd/3e1e6a57fccd2d7c83fcdf338e93ba98eb85c6e877dd34731ac585375490/coverage-7.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:ddf799247318f34dbcd2efa8c95a8d0642674e926bb1774cf9b63dfd2a389d1c", size = 224728, upload-time = "2026-05-26T20:41:30.098Z" },
392
+ { url = "https://files.pythonhosted.org/packages/bb/d7/31066cf1d2f0c6c797fce911bcfa01dd35642dc6da992a950256097c5860/coverage-7.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:145986fe66647eb489f18d9a997567a3fd358584c4b5a808769113abc07466af", size = 222752, upload-time = "2026-05-26T20:41:32.123Z" },
393
+ { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", hash = "sha256:a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2", size = 211815, upload-time = "2026-05-26T20:41:34.078Z" },
394
394
  ]
395
395
 
396
396
  [[package]]
@@ -985,14 +985,14 @@ wheels = [
985
985
 
986
986
  [[package]]
987
987
  name = "pytest-asyncio"
988
- version = "1.3.0"
988
+ version = "1.4.0"
989
989
  source = { registry = "https://pypi.org/simple" }
990
990
  dependencies = [
991
991
  { name = "pytest" },
992
992
  ]
993
- sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" }
993
+ sdist = { url = "https://files.pythonhosted.org/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", size = 58514, upload-time = "2026-05-26T09:56:04.083Z" }
994
994
  wheels = [
995
- { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" },
995
+ { url = "https://files.pythonhosted.org/packages/03/e2/08a497ef684b88559c9cc5f4ad53a37e7b99e727094a86d6ea32536d5d3c/pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1", size = 16930, upload-time = "2026-05-26T09:56:02.576Z" },
996
996
  ]
997
997
 
998
998
  [[package]]
@@ -1171,7 +1171,7 @@ requires-dist = [
1171
1171
  { name = "python3-commons", extras = ["database"], marker = "extra == 'authz'" },
1172
1172
  { name = "python3-commons", extras = ["object-storage"], marker = "extra == 'audit'" },
1173
1173
  { name = "requests", marker = "extra == 'soap-client'", specifier = "~=2.34.2" },
1174
- { name = "sqlalchemy", extras = ["asyncio"], marker = "extra == 'database'", specifier = "~=2.0.49" },
1174
+ { name = "sqlalchemy", extras = ["asyncio"], marker = "extra == 'database'", specifier = "~=2.0.50" },
1175
1175
  { name = "valkey", extras = ["libvalkey"], marker = "extra == 'cache'", specifier = "~=6.1.1" },
1176
1176
  { name = "zeep", extras = ["async"], marker = "extra == 'audit'", specifier = "~=4.3.2" },
1177
1177
  { name = "zeep", extras = ["async"], marker = "extra == 'soap-client'", specifier = "~=4.3.2" },
@@ -1414,11 +1414,11 @@ wheels = [
1414
1414
 
1415
1415
  [[package]]
1416
1416
  name = "types-awscrt"
1417
- version = "0.31.3"
1417
+ version = "0.33.0"
1418
1418
  source = { registry = "https://pypi.org/simple" }
1419
- sdist = { url = "https://files.pythonhosted.org/packages/76/26/0aa563e229c269c528a3b8c709fc671ac2a5c564732fab0852ac6ee006cf/types_awscrt-0.31.3.tar.gz", hash = "sha256:09d3eaf00231e0f47e101bd9867e430873bc57040050e2a3bd8305cb4fc30865", size = 18178, upload-time = "2026-03-08T02:31:14.569Z" }
1419
+ sdist = { url = "https://files.pythonhosted.org/packages/e2/e3/40e8148a07a3c1c6fb151eddcfdd94083560e759e954b1f5a67ca0b36bcf/types_awscrt-0.33.0.tar.gz", hash = "sha256:803bc7e7e2f6172a0abd71df6593368f82fc23127ca15d287f360e9fcbd3a977", size = 19038, upload-time = "2026-05-25T06:56:04.027Z" }
1420
1420
  wheels = [
1421
- { url = "https://files.pythonhosted.org/packages/3e/e5/47a573bbbd0a790f8f9fe452f7188ea72b212d21c9be57d5fc0cbc442075/types_awscrt-0.31.3-py3-none-any.whl", hash = "sha256:e5ce65a00a2ab4f35eacc1e3d700d792338d56e4823ee7b4dbe017f94cfc4458", size = 43340, upload-time = "2026-03-08T02:31:13.38Z" },
1421
+ { url = "https://files.pythonhosted.org/packages/a0/a6/704fbf052edf2497d09292e5f9555b400594924f1154d6c86f2173c2fc11/types_awscrt-0.33.0-py3-none-any.whl", hash = "sha256:95adb57388e1cacc6e7e96fb7ddc735e60096a6151930640bdbe496d9400493a", size = 45687, upload-time = "2026-05-25T06:56:02.549Z" },
1422
1422
  ]
1423
1423
 
1424
1424
  [[package]]