python3-commons 0.15.21__tar.gz → 0.16.0__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 (73) hide show
  1. {python3_commons-0.15.21 → python3_commons-0.16.0}/PKG-INFO +3 -3
  2. {python3_commons-0.15.21 → python3_commons-0.16.0}/pyproject.toml +2 -2
  3. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/audit.py +1 -3
  4. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/object_storage.py +33 -15
  5. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons.egg-info/PKG-INFO +3 -3
  6. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons.egg-info/requires.txt +2 -2
  7. {python3_commons-0.15.21 → python3_commons-0.16.0}/uv.lock +16 -16
  8. {python3_commons-0.15.21 → python3_commons-0.16.0}/.coveragerc +0 -0
  9. {python3_commons-0.15.21 → python3_commons-0.16.0}/.devcontainer/Dockerfile +0 -0
  10. {python3_commons-0.15.21 → python3_commons-0.16.0}/.devcontainer/devcontainer.json +0 -0
  11. {python3_commons-0.15.21 → python3_commons-0.16.0}/.devcontainer/docker-compose.yml +0 -0
  12. {python3_commons-0.15.21 → python3_commons-0.16.0}/.env_template +0 -0
  13. {python3_commons-0.15.21 → python3_commons-0.16.0}/.github/workflows/checks.yml +0 -0
  14. {python3_commons-0.15.21 → python3_commons-0.16.0}/.github/workflows/python-publish.yaml +0 -0
  15. {python3_commons-0.15.21 → python3_commons-0.16.0}/.github/workflows/release-on-tag-push.yml +0 -0
  16. {python3_commons-0.15.21 → python3_commons-0.16.0}/.gitignore +0 -0
  17. {python3_commons-0.15.21 → python3_commons-0.16.0}/.pre-commit-config.yaml +0 -0
  18. {python3_commons-0.15.21 → python3_commons-0.16.0}/.python-version +0 -0
  19. {python3_commons-0.15.21 → python3_commons-0.16.0}/AUTHORS.rst +0 -0
  20. {python3_commons-0.15.21 → python3_commons-0.16.0}/CHANGELOG.rst +0 -0
  21. {python3_commons-0.15.21 → python3_commons-0.16.0}/LICENSE +0 -0
  22. {python3_commons-0.15.21 → python3_commons-0.16.0}/README.md +0 -0
  23. {python3_commons-0.15.21 → python3_commons-0.16.0}/README.rst +0 -0
  24. {python3_commons-0.15.21 → python3_commons-0.16.0}/docs/Makefile +0 -0
  25. {python3_commons-0.15.21 → python3_commons-0.16.0}/docs/_static/.gitignore +0 -0
  26. {python3_commons-0.15.21 → python3_commons-0.16.0}/docs/authors.rst +0 -0
  27. {python3_commons-0.15.21 → python3_commons-0.16.0}/docs/changelog.rst +0 -0
  28. {python3_commons-0.15.21 → python3_commons-0.16.0}/docs/conf.py +0 -0
  29. {python3_commons-0.15.21 → python3_commons-0.16.0}/docs/index.rst +0 -0
  30. {python3_commons-0.15.21 → python3_commons-0.16.0}/docs/license.rst +0 -0
  31. {python3_commons-0.15.21 → python3_commons-0.16.0}/setup.cfg +0 -0
  32. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/__init__.py +0 -0
  33. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/api_client.py +0 -0
  34. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/async_functools.py +0 -0
  35. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/auth.py +0 -0
  36. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/cache.py +0 -0
  37. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/conf.py +0 -0
  38. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/db/__init__.py +0 -0
  39. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/db/helpers.py +0 -0
  40. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/db/models/__init__.py +0 -0
  41. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/db/models/auth.py +0 -0
  42. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/db/models/common.py +0 -0
  43. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/db/models/rbac.py +0 -0
  44. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/db/models/users.py +0 -0
  45. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/exceptions.py +0 -0
  46. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/fs.py +0 -0
  47. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/generators.py +0 -0
  48. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/helpers.py +0 -0
  49. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/log/__init__.py +0 -0
  50. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/log/filters.py +0 -0
  51. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/log/formatters.py +0 -0
  52. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/permissions.py +0 -0
  53. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/serializers/__init__.py +0 -0
  54. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/serializers/common.py +0 -0
  55. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/serializers/json.py +0 -0
  56. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/serializers/msgpack.py +0 -0
  57. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons/serializers/msgspec.py +0 -0
  58. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons.egg-info/SOURCES.txt +0 -0
  59. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons.egg-info/dependency_links.txt +0 -0
  60. {python3_commons-0.15.21 → python3_commons-0.16.0}/src/python3_commons.egg-info/top_level.txt +0 -0
  61. {python3_commons-0.15.21 → python3_commons-0.16.0}/tests/__init__.py +0 -0
  62. {python3_commons-0.15.21 → python3_commons-0.16.0}/tests/integration/__init__.py +0 -0
  63. {python3_commons-0.15.21 → python3_commons-0.16.0}/tests/integration/test_cache.py +0 -0
  64. {python3_commons-0.15.21 → python3_commons-0.16.0}/tests/integration/test_osc.py +0 -0
  65. {python3_commons-0.15.21 → python3_commons-0.16.0}/tests/unit/__init__.py +0 -0
  66. {python3_commons-0.15.21 → python3_commons-0.16.0}/tests/unit/conftest.py +0 -0
  67. {python3_commons-0.15.21 → python3_commons-0.16.0}/tests/unit/log/__init__.py +0 -0
  68. {python3_commons-0.15.21 → python3_commons-0.16.0}/tests/unit/log/test_formatters.py +0 -0
  69. {python3_commons-0.15.21 → python3_commons-0.16.0}/tests/unit/test_async_functools.py +0 -0
  70. {python3_commons-0.15.21 → python3_commons-0.16.0}/tests/unit/test_audit.py +0 -0
  71. {python3_commons-0.15.21 → python3_commons-0.16.0}/tests/unit/test_helpers.py +0 -0
  72. {python3_commons-0.15.21 → python3_commons-0.16.0}/tests/unit/test_msgpack.py +0 -0
  73. {python3_commons-0.15.21 → python3_commons-0.16.0}/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.15.21
3
+ Version: 0.16.0
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.4
12
12
  Description-Content-Type: text/x-rst
13
13
  License-File: LICENSE
14
14
  License-File: AUTHORS.rst
15
- Requires-Dist: aiobotocore~=3.4.0
15
+ Requires-Dist: aiobotocore~=3.5.0
16
16
  Requires-Dist: aiohttp[speedups]<3.15.0,>=3.13.5
17
17
  Requires-Dist: asyncpg~=0.31.0
18
18
  Requires-Dist: lxml~=6.1.0
19
19
  Requires-Dist: msgpack~=1.1.2
20
20
  Requires-Dist: msgspec==0.21.1
21
- Requires-Dist: object-storage-client==0.0.20
21
+ Requires-Dist: object-storage-client==0.0.22
22
22
  Requires-Dist: pydantic-settings~=2.14.0
23
23
  Requires-Dist: SQLAlchemy[asyncio]~=2.0.49
24
24
  Requires-Dist: valkey[libvalkey]~=6.1.1
@@ -18,13 +18,13 @@ classifiers = [
18
18
  keywords = []
19
19
  requires-python = ">=3.14.4,<3.15.0"
20
20
  dependencies = [
21
- "aiobotocore~=3.4.0",
21
+ "aiobotocore~=3.5.0",
22
22
  "aiohttp[speedups]>=3.13.5,<3.15.0",
23
23
  "asyncpg~=0.31.0",
24
24
  "lxml~=6.1.0",
25
25
  "msgpack~=1.1.2",
26
26
  "msgspec==0.21.1",
27
- "object-storage-client==0.0.20",
27
+ "object-storage-client==0.0.22",
28
28
  "pydantic-settings~=2.14.0",
29
29
  "SQLAlchemy[asyncio]~=2.0.49",
30
30
  "valkey[libvalkey]~=6.1.1",
@@ -20,9 +20,7 @@ logger = logging.getLogger(__name__)
20
20
  async def write_audit_data(settings: S3Settings, key: str, data: bytes) -> None:
21
21
  if settings.aws_secret_access_key:
22
22
  try:
23
- absolute_path = object_storage.get_absolute_path(f'audit/{key}')
24
-
25
- await object_storage.put_object(settings.s3_bucket, absolute_path, io.BytesIO(data), len(data))
23
+ await object_storage.put_object(settings.s3_bucket, f'audit/{key}', io.BytesIO(data), len(data))
26
24
  except Exception:
27
25
  logger.exception('Failed storing object in storage.')
28
26
  else:
@@ -1,11 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
+ import threading
4
5
  from contextlib import asynccontextmanager
5
6
  from typing import TYPE_CHECKING
6
7
 
7
8
  import aiobotocore.session
8
9
  from botocore.config import Config
10
+ from object_storage_client import ObjectStorageClient
9
11
 
10
12
  if TYPE_CHECKING:
11
13
  import io
@@ -19,6 +21,22 @@ from python3_commons.conf import S3Settings, s3_settings
19
21
  from python3_commons.helpers import SingletonMeta
20
22
 
21
23
  logger = logging.getLogger(__name__)
24
+ _CLIENT: ObjectStorageClient | None = None
25
+ _CLIENT_LOCK = threading.Lock()
26
+
27
+
28
+ def get_client() -> ObjectStorageClient:
29
+ global _CLIENT # noqa: PLW0603
30
+
31
+ if not _CLIENT:
32
+ with _CLIENT_LOCK:
33
+ if not _CLIENT:
34
+ client = ObjectStorageClient()
35
+ _CLIENT = client
36
+ else:
37
+ client = _CLIENT
38
+
39
+ return client
22
40
 
23
41
 
24
42
  class ObjectStorage(metaclass=SingletonMeta):
@@ -58,21 +76,21 @@ def get_absolute_path(path: str) -> str:
58
76
 
59
77
 
60
78
  async def put_object(bucket_name: str, path: str, data: io.BytesIO, length: int, part_size: int = 0) -> str | None:
61
- storage = ObjectStorage(s3_settings)
79
+ try:
80
+ client = get_client()
81
+ data.seek(0)
82
+ absolute_path = get_absolute_path(path)
83
+ url = f's3://{bucket_name}/{absolute_path}'
62
84
 
63
- async with storage.get_client() as s3_client:
64
- try:
65
- data.seek(0)
85
+ await client.put_object(url, data.getvalue())
66
86
 
67
- await s3_client.put_object(Bucket=bucket_name, Key=path, Body=data, ContentLength=length)
87
+ logger.debug('Stored object into object storage: %s:%s', bucket_name, path)
88
+ except Exception as e:
89
+ logger.exception('Failed to put object to object storage: %s:%s', bucket_name, path, exc_info=e)
68
90
 
69
- logger.debug('Stored object into object storage: %s:%s', bucket_name, path)
70
- except Exception as e:
71
- logger.exception('Failed to put object to object storage: %s:%s', bucket_name, path, exc_info=e)
72
-
73
- raise
91
+ raise
74
92
 
75
- return f's3://{bucket_name}/{path}'
93
+ return f's3://{bucket_name}/{path}'
76
94
 
77
95
 
78
96
  @asynccontextmanager
@@ -117,7 +135,7 @@ async def list_objects(bucket_name: str, prefix: str, *, recursive: bool = True)
117
135
 
118
136
 
119
137
  async def get_object_streams(
120
- bucket_name: str, path: str, *, recursive: bool = True
138
+ bucket_name: str, path: str, *, recursive: bool = True
121
139
  ) -> AsyncGenerator[tuple[str, datetime, StreamingBody]]:
122
140
  async for obj in list_objects(bucket_name, path, recursive=recursive):
123
141
  object_name = obj['Key']
@@ -128,7 +146,7 @@ async def get_object_streams(
128
146
 
129
147
 
130
148
  async def get_objects(
131
- bucket_name: str, path: str, *, recursive: bool = True
149
+ bucket_name: str, path: str, *, recursive: bool = True
132
150
  ) -> AsyncGenerator[tuple[str, datetime, bytes]]:
133
151
  async for object_name, last_modified, stream in get_object_streams(bucket_name, path, recursive=recursive):
134
152
  data = await stream.read()
@@ -150,7 +168,7 @@ async def remove_object(bucket_name: str, object_name: str) -> None:
150
168
 
151
169
 
152
170
  async def remove_objects(
153
- bucket_name: str, prefix: str | None = None, object_names: Iterable[str] | None = None
171
+ bucket_name: str, prefix: str | None = None, object_names: Iterable[str] | None = None
154
172
  ) -> Sequence[Mapping] | None:
155
173
  storage = ObjectStorage(s3_settings)
156
174
 
@@ -173,7 +191,7 @@ async def remove_objects(
173
191
  chunk_size = 1000
174
192
 
175
193
  for i in range(0, len(objects_to_delete), chunk_size):
176
- chunk = objects_to_delete[i : i + chunk_size]
194
+ chunk = objects_to_delete[i: i + chunk_size]
177
195
 
178
196
  response = await s3_client.delete_objects(Bucket=bucket_name, Delete={'Objects': chunk})
179
197
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python3-commons
3
- Version: 0.15.21
3
+ Version: 0.16.0
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.4
12
12
  Description-Content-Type: text/x-rst
13
13
  License-File: LICENSE
14
14
  License-File: AUTHORS.rst
15
- Requires-Dist: aiobotocore~=3.4.0
15
+ Requires-Dist: aiobotocore~=3.5.0
16
16
  Requires-Dist: aiohttp[speedups]<3.15.0,>=3.13.5
17
17
  Requires-Dist: asyncpg~=0.31.0
18
18
  Requires-Dist: lxml~=6.1.0
19
19
  Requires-Dist: msgpack~=1.1.2
20
20
  Requires-Dist: msgspec==0.21.1
21
- Requires-Dist: object-storage-client==0.0.20
21
+ Requires-Dist: object-storage-client==0.0.22
22
22
  Requires-Dist: pydantic-settings~=2.14.0
23
23
  Requires-Dist: SQLAlchemy[asyncio]~=2.0.49
24
24
  Requires-Dist: valkey[libvalkey]~=6.1.1
@@ -1,10 +1,10 @@
1
- aiobotocore~=3.4.0
1
+ aiobotocore~=3.5.0
2
2
  aiohttp[speedups]<3.15.0,>=3.13.5
3
3
  asyncpg~=0.31.0
4
4
  lxml~=6.1.0
5
5
  msgpack~=1.1.2
6
6
  msgspec==0.21.1
7
- object-storage-client==0.0.20
7
+ object-storage-client==0.0.22
8
8
  pydantic-settings~=2.14.0
9
9
  SQLAlchemy[asyncio]~=2.0.49
10
10
  valkey[libvalkey]~=6.1.1
@@ -4,7 +4,7 @@ requires-python = ">=3.14.4, <3.15.0"
4
4
 
5
5
  [[package]]
6
6
  name = "aiobotocore"
7
- version = "3.4.0"
7
+ version = "3.5.0"
8
8
  source = { registry = "https://pypi.org/simple" }
9
9
  dependencies = [
10
10
  { name = "aiohttp" },
@@ -15,9 +15,9 @@ dependencies = [
15
15
  { name = "python-dateutil" },
16
16
  { name = "wrapt" },
17
17
  ]
18
- sdist = { url = "https://files.pythonhosted.org/packages/b8/50/a48ed11b15f926ce3dbb33e7fb0f25af17dbb99bcb7ae3b30c763723eca7/aiobotocore-3.4.0.tar.gz", hash = "sha256:a918b5cb903f81feba7e26835aed4b5e6bb2d0149d7f42bb2dd7d8089e3d9000", size = 122360, upload-time = "2026-04-07T06:12:24.884Z" }
18
+ sdist = { url = "https://files.pythonhosted.org/packages/e6/89/9533b377e9412013cc43a539d81bc5f8feeb4b6830643821ad612f78b09b/aiobotocore-3.5.0.tar.gz", hash = "sha256:d45d1c4659ad0e48b694a5aa4ff18829100386f7de96c8d146ec7757a6f12918", size = 123061, upload-time = "2026-04-21T07:25:26.993Z" }
19
19
  wheels = [
20
- { url = "https://files.pythonhosted.org/packages/df/d8/ce9386e6d76ea79e61dee15e62aa48cff6be69e89246b0ac4a11857cb02c/aiobotocore-3.4.0-py3-none-any.whl", hash = "sha256:26290eb6830ea92d8a6f5f90b56e9f5cedd6d126074d5db63b195e281d982465", size = 88018, upload-time = "2026-04-07T06:12:22.684Z" },
20
+ { url = "https://files.pythonhosted.org/packages/2d/05/6eeeadef45c24630af0ceae4d038b883e9a394786300529286ba8cc1e62d/aiobotocore-3.5.0-py3-none-any.whl", hash = "sha256:49ce35bb8b96b85d3251c2cbbb2ed7a028dc0cb0d0d0801f9ccca1ccd0d41ded", size = 88281, upload-time = "2026-04-21T07:25:25.258Z" },
21
21
  ]
22
22
 
23
23
  [[package]]
@@ -164,16 +164,16 @@ wheels = [
164
164
 
165
165
  [[package]]
166
166
  name = "botocore"
167
- version = "1.42.84"
167
+ version = "1.42.91"
168
168
  source = { registry = "https://pypi.org/simple" }
169
169
  dependencies = [
170
170
  { name = "jmespath" },
171
171
  { name = "python-dateutil" },
172
172
  { name = "urllib3" },
173
173
  ]
174
- sdist = { url = "https://files.pythonhosted.org/packages/b4/b7/1c03423843fb0d1795b686511c00ee63fed1234c2400f469aeedfd42212f/botocore-1.42.84.tar.gz", hash = "sha256:234064604c80d9272a5e9f6b3566d260bcaa053a5e05246db90d7eca1c2cf44b", size = 15148615, upload-time = "2026-04-06T19:38:56.673Z" }
174
+ sdist = { url = "https://files.pythonhosted.org/packages/21/bc/a4b7c46471c2e789ad8c4c7acfd7f302fdb481d93ff870f441249b924ae6/botocore-1.42.91.tar.gz", hash = "sha256:d252e27bc454afdbf5ed3dc617aa423f2c855c081e98b7963093399483ecc698", size = 15213010, upload-time = "2026-04-17T19:30:50.793Z" }
175
175
  wheels = [
176
- { url = "https://files.pythonhosted.org/packages/e3/37/0c0c90361c8a1b9e6c75222ca24ae12996a298c0e18822a72ab229c37207/botocore-1.42.84-py3-none-any.whl", hash = "sha256:15f3fe07dfa6545e46a60c4b049fe2bdf63803c595ae4a4eec90e8f8172764f3", size = 14827061, upload-time = "2026-04-06T19:38:53.613Z" },
176
+ { url = "https://files.pythonhosted.org/packages/b1/fc/24cc0a47c824f13933e210e9ad034b4fba22f7185b8d904c0fbf5a3b2be8/botocore-1.42.91-py3-none-any.whl", hash = "sha256:7a28c3cc6bfab5724ad18899d52402b776a0de7d87fa20c3c5270bcaaf199ce8", size = 14897344, upload-time = "2026-04-17T19:30:44.245Z" },
177
177
  ]
178
178
 
179
179
  [[package]]
@@ -478,11 +478,11 @@ wheels = [
478
478
 
479
479
  [[package]]
480
480
  name = "idna"
481
- version = "3.11"
481
+ version = "3.12"
482
482
  source = { registry = "https://pypi.org/simple" }
483
- sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
483
+ sdist = { url = "https://files.pythonhosted.org/packages/22/12/2948fbe5513d062169bd91f7d7b1cd97bc8894f32946b71fa39f6e63ca0c/idna-3.12.tar.gz", hash = "sha256:724e9952cc9e2bd7550ea784adb098d837ab5267ef67a1ab9cf7846bdbdd8254", size = 194350, upload-time = "2026-04-21T13:32:48.916Z" }
484
484
  wheels = [
485
- { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
485
+ { url = "https://files.pythonhosted.org/packages/53/b2/acc33950394b3becb2b664741a0c0889c7ef9f9ffbfa8d47eddb53a50abd/idna-3.12-py3-none-any.whl", hash = "sha256:60ffaa1858fac94c9c124728c24fcde8160f3fb4a7f79aa8cdd33a9d1af60a67", size = 68634, upload-time = "2026-04-21T13:32:47.403Z" },
486
486
  ]
487
487
 
488
488
  [[package]]
@@ -668,13 +668,13 @@ wheels = [
668
668
 
669
669
  [[package]]
670
670
  name = "object-storage-client"
671
- version = "0.0.20"
671
+ version = "0.0.22"
672
672
  source = { registry = "https://pypi.org/simple" }
673
- sdist = { url = "https://files.pythonhosted.org/packages/af/b3/c2a0c4067d829f49d6e777a9c11f28b899226e117492c6f6ed230890b327/object_storage_client-0.0.20.tar.gz", hash = "sha256:ca4bf4ce6c7061081caeb8d11e05f34ec597829a8178e94f62b17dc7e9b12498", size = 39116, upload-time = "2026-03-20T17:27:56.377Z" }
673
+ sdist = { url = "https://files.pythonhosted.org/packages/1a/49/9af56487b380cef1132c1aa718702095a0ab3ddb3e82bb4eab9593dde316/object_storage_client-0.0.22.tar.gz", hash = "sha256:00535617e1f50c0dab066e7dc6bdc9d1690e989febcfaacc27737988dd5a4101", size = 40622, upload-time = "2026-04-21T12:36:41.782Z" }
674
674
  wheels = [
675
- { url = "https://files.pythonhosted.org/packages/30/56/5c32ba20a482dd861f6faa18372410fb4abaaca74f419d60ef925ba64d9e/object_storage_client-0.0.20-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7fe6781539b4f29aef6836411e100a946f22ac409926ab0b0ec9362a198451fd", size = 1914810, upload-time = "2026-03-20T17:27:51.906Z" },
676
- { url = "https://files.pythonhosted.org/packages/41/2d/2e5b7b195a0e4478e4ae08efb249746c7b0df8aa25f58aa913540882617e/object_storage_client-0.0.20-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0037016589a153f7c7d6e9c2b84cdd046d280420c8a4120cebe6cb1e7665a6", size = 2102642, upload-time = "2026-03-20T17:27:55.24Z" },
677
- { url = "https://files.pythonhosted.org/packages/68/84/256c571a540017429009c289b2cccf174fc0cf731bae5697a214f57e26c8/object_storage_client-0.0.20-cp314-cp314-win_amd64.whl", hash = "sha256:49003b38f22af4cdb60f62fed7b55890c93fba0e837f1c6a216f9566b4167629", size = 2095189, upload-time = "2026-03-20T17:28:00.145Z" },
675
+ { url = "https://files.pythonhosted.org/packages/e3/0b/c9a4dc7ae9bc8f67877190d97c0efb94a0a9e7aef6423feaa45d93232215/object_storage_client-0.0.22-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:db7d843f11e1d281ba16533bc573343ec9e0a8d2cf779cd43464df6adca0a5a8", size = 1922610, upload-time = "2026-04-21T12:36:40.278Z" },
676
+ { url = "https://files.pythonhosted.org/packages/7e/f3/3e34cc1e70e9f48ad0be5d7af1771d864a3ee618c07aad43978e2d3a131c/object_storage_client-0.0.22-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d7c92c2ca19f9d734be99162df7dc573535e7022e5a9b5c1dce121a102a85ae", size = 2114290, upload-time = "2026-04-21T12:36:37.82Z" },
677
+ { url = "https://files.pythonhosted.org/packages/ee/73/4af6bf9dc086e9c0a69988d2258d2f6f5d02d00ef891d9df3d6d08c3355a/object_storage_client-0.0.22-cp314-cp314-win_amd64.whl", hash = "sha256:df863a2a3f8f1c77d06bdc547d674b321878dca7cb7db94606b763cb9cc7e508", size = 2095414, upload-time = "2026-04-21T12:36:38.966Z" },
678
678
  ]
679
679
 
680
680
  [[package]]
@@ -1024,13 +1024,13 @@ testing = [
1024
1024
 
1025
1025
  [package.metadata]
1026
1026
  requires-dist = [
1027
- { name = "aiobotocore", specifier = "~=3.4.0" },
1027
+ { name = "aiobotocore", specifier = "~=3.5.0" },
1028
1028
  { name = "aiohttp", extras = ["speedups"], specifier = ">=3.13.5,<3.15.0" },
1029
1029
  { name = "asyncpg", specifier = "~=0.31.0" },
1030
1030
  { name = "lxml", specifier = "~=6.1.0" },
1031
1031
  { name = "msgpack", specifier = "~=1.1.2" },
1032
1032
  { name = "msgspec", specifier = "==0.21.1" },
1033
- { name = "object-storage-client", specifier = "==0.0.20" },
1033
+ { name = "object-storage-client", specifier = "==0.0.22" },
1034
1034
  { name = "pydantic-settings", specifier = "~=2.14.0" },
1035
1035
  { name = "sqlalchemy", extras = ["asyncio"], specifier = "~=2.0.49" },
1036
1036
  { name = "valkey", extras = ["libvalkey"], specifier = "~=6.1.1" },