Skip to content

Commit d707848

Browse files
authored
Merge branch 'main' into claude/issue-114-20251026-0414
2 parents c9f5399 + 0d790a6 commit d707848

File tree

58 files changed

+617
-649
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+617
-649
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ get(key: str, collection: str | None = None) -> dict[str, Any] | None:
164164
get_many(keys: list[str], collection: str | None = None) -> list[dict[str, Any] | None]:
165165

166166
put(key: str, value: dict[str, Any], collection: str | None = None, ttl: SupportsFloat | None = None) -> None:
167-
put_many(keys: list[str], values: Sequence[dict[str, Any]], collection: str | None = None, ttl: Sequence[SupportsFloat | None] | None = None) -> None:
167+
put_many(keys: list[str], values: Sequence[dict[str, Any]], collection: str | None = None, ttl: SupportsFloat | None = None) -> None:
168168

169169
delete(key: str, collection: str | None = None) -> bool:
170170
delete_many(keys: list[str], collection: str | None = None) -> int:

key-value/key-value-aio/src/key_value/aio/adapters/pydantic/adapter.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ async def get(self, key: str, *, collection: str | None = None) -> T | None:
8282

8383
return None
8484

85-
async def get_many(self, keys: list[str], *, collection: str | None = None) -> list[T | None]:
85+
async def get_many(self, keys: Sequence[str], *, collection: str | None = None) -> list[T | None]:
8686
"""Batch get and validate models by keys, preserving order.
8787
8888
Returns:
@@ -110,7 +110,7 @@ async def put(self, key: str, value: T, *, collection: str | None = None, ttl: S
110110
await self._key_value.put(key=key, value=value_dict, collection=collection, ttl=ttl)
111111

112112
async def put_many(
113-
self, keys: list[str], values: Sequence[T], *, collection: str | None = None, ttl: Sequence[SupportsFloat | None] | None = None
113+
self, keys: Sequence[str], values: Sequence[T], *, collection: str | None = None, ttl: SupportsFloat | None = None
114114
) -> None:
115115
"""Serialize and store multiple models, preserving order alignment with keys."""
116116
collection = collection or self._default_collection
@@ -125,7 +125,7 @@ async def delete(self, key: str, *, collection: str | None = None) -> bool:
125125

126126
return await self._key_value.delete(key=key, collection=collection)
127127

128-
async def delete_many(self, keys: list[str], *, collection: str | None = None) -> int:
128+
async def delete_many(self, keys: Sequence[str], *, collection: str | None = None) -> int:
129129
"""Delete multiple models by key. Returns the count of deleted entries."""
130130
collection = collection or self._default_collection
131131

@@ -151,7 +151,7 @@ async def ttl(self, key: str, *, collection: str | None = None) -> tuple[T | Non
151151

152152
return (None, None)
153153

154-
async def ttl_many(self, keys: list[str], *, collection: str | None = None) -> list[tuple[T | None, float | None]]:
154+
async def ttl_many(self, keys: Sequence[str], *, collection: str | None = None) -> list[tuple[T | None, float | None]]:
155155
"""Batch get models with TTLs. Each element is (model|None, ttl_seconds|None)."""
156156
collection = collection or self._default_collection
157157

key-value/key-value-aio/src/key_value/aio/adapters/raise_on_missing/adapter.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,16 @@ async def get(
5050

5151
@overload
5252
async def get_many(
53-
self, keys: list[str], *, collection: str | None = None, raise_on_missing: Literal[False] = False
53+
self, keys: Sequence[str], *, collection: str | None = None, raise_on_missing: Literal[False] = False
5454
) -> list[dict[str, Any] | None]: ...
5555

5656
@overload
5757
async def get_many(
58-
self, keys: list[str], *, collection: str | None = None, raise_on_missing: Literal[True]
58+
self, keys: Sequence[str], *, collection: str | None = None, raise_on_missing: Literal[True]
5959
) -> list[dict[str, Any]]: ...
6060

6161
async def get_many(
62-
self, keys: list[str], *, collection: str | None = None, raise_on_missing: bool = False
62+
self, keys: Sequence[str], *, collection: str | None = None, raise_on_missing: bool = False
6363
) -> list[dict[str, Any]] | list[dict[str, Any] | None]:
6464
"""Retrieve multiple values by key from the specified collection.
6565
@@ -113,16 +113,16 @@ async def ttl(
113113

114114
@overload
115115
async def ttl_many(
116-
self, keys: list[str], *, collection: str | None = None, raise_on_missing: Literal[False] = False
116+
self, keys: Sequence[str], *, collection: str | None = None, raise_on_missing: Literal[False] = False
117117
) -> list[tuple[dict[str, Any] | None, float | None]]: ...
118118

119119
@overload
120120
async def ttl_many(
121-
self, keys: list[str], *, collection: str | None = None, raise_on_missing: Literal[True]
121+
self, keys: Sequence[str], *, collection: str | None = None, raise_on_missing: Literal[True]
122122
) -> list[tuple[dict[str, Any], float | None]]: ...
123123

124124
async def ttl_many(
125-
self, keys: list[str], *, collection: str | None = None, raise_on_missing: bool = False
125+
self, keys: Sequence[str], *, collection: str | None = None, raise_on_missing: bool = False
126126
) -> list[tuple[dict[str, Any], float | None]] | list[tuple[dict[str, Any] | None, float | None]]:
127127
"""Retrieve multiple values and TTL information by key from the specified collection.
128128
@@ -152,20 +152,21 @@ async def put(self, key: str, value: Mapping[str, Any], *, collection: str | Non
152152

153153
async def put_many(
154154
self,
155-
keys: list[str],
155+
keys: Sequence[str],
156156
values: Sequence[Mapping[str, Any]],
157157
*,
158158
collection: str | None = None,
159-
ttl: Sequence[SupportsFloat | None] | None = None,
159+
ttl: SupportsFloat | None = None,
160160
) -> None:
161161
"""Store multiple key-value pairs in the specified collection.
162162
163163
Args:
164164
keys: The keys to store the values in.
165165
values: The values to store.
166166
collection: The collection to store keys in. If no collection is provided, it will use the default collection.
167-
ttl: The optional time-to-live (expiry duration) for the key-value pairs. Defaults to no TTL. Note: The
168-
backend store will convert the provided format to its own internal format.
167+
ttl: The optional time-to-live (expiry duration) for all key-value pairs. The same TTL will be applied to all
168+
items in the batch. Defaults to no TTL. Note: The backend store will convert the provided format to its own
169+
internal format.
169170
"""
170171
return await self.key_value.put_many(keys=keys, values=values, collection=collection, ttl=ttl)
171172

@@ -178,7 +179,7 @@ async def delete(self, key: str, *, collection: str | None = None) -> bool:
178179
"""
179180
return await self.key_value.delete(key=key, collection=collection)
180181

181-
async def delete_many(self, keys: list[str], *, collection: str | None = None) -> int:
182+
async def delete_many(self, keys: Sequence[str], *, collection: str | None = None) -> int:
182183
"""Delete multiple key-value pairs from the specified collection.
183184
184185
Args:

key-value/key-value-aio/src/key_value/aio/protocols/key_value.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ async def delete(self, key: str, *, collection: str | None = None) -> bool:
5757
"""
5858
...
5959

60-
async def get_many(self, keys: list[str], *, collection: str | None = None) -> list[dict[str, Any] | None]:
60+
async def get_many(self, keys: Sequence[str], *, collection: str | None = None) -> list[dict[str, Any] | None]:
6161
"""Retrieve multiple values by key from the specified collection.
6262
6363
Args:
@@ -69,7 +69,7 @@ async def get_many(self, keys: list[str], *, collection: str | None = None) -> l
6969
"""
7070
...
7171

72-
async def ttl_many(self, keys: list[str], *, collection: str | None = None) -> list[tuple[dict[str, Any] | None, float | None]]:
72+
async def ttl_many(self, keys: Sequence[str], *, collection: str | None = None) -> list[tuple[dict[str, Any] | None, float | None]]:
7373
"""Retrieve multiple values and TTL information by key from the specified collection.
7474
7575
Args:
@@ -84,24 +84,25 @@ async def ttl_many(self, keys: list[str], *, collection: str | None = None) -> l
8484

8585
async def put_many(
8686
self,
87-
keys: list[str],
87+
keys: Sequence[str],
8888
values: Sequence[Mapping[str, Any]],
8989
*,
9090
collection: str | None = None,
91-
ttl: Sequence[SupportsFloat | None] | None = None,
91+
ttl: SupportsFloat | None = None,
9292
) -> None:
9393
"""Store multiple key-value pairs in the specified collection.
9494
9595
Args:
9696
keys: The keys to store the values in.
9797
values: The values to store.
9898
collection: The collection to store keys in. If no collection is provided, it will use the default collection.
99-
ttl: The optional time-to-live (expiry duration) in seconds for the key-value pairs. Defaults to no TTL. Note: The
100-
backend store will convert the provided format to its own internal format.
99+
ttl: The optional time-to-live (expiry duration) in seconds for all key-value pairs. The same TTL will be applied
100+
to all items in the batch. Defaults to no TTL. Note: The backend store will convert the provided format to
101+
its own internal format.
101102
"""
102103
...
103104

104-
async def delete_many(self, keys: list[str], *, collection: str | None = None) -> int:
105+
async def delete_many(self, keys: Sequence[str], *, collection: str | None = None) -> int:
105106
"""Delete multiple key-value pairs from the specified collection.
106107
107108
Args:

key-value/key-value-aio/src/key_value/aio/stores/base.py

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from key_value.shared.constants import DEFAULT_COLLECTION_NAME
1313
from key_value.shared.errors import StoreSetupError
1414
from key_value.shared.utils.managed_entry import ManagedEntry
15-
from key_value.shared.utils.time_to_live import now, prepare_ttl, prepare_ttls
15+
from key_value.shared.utils.time_to_live import now, prepare_ttl
1616
from typing_extensions import Self, override
1717

1818
from key_value.aio.protocols.key_value import (
@@ -102,7 +102,7 @@ async def setup_collection(self, *, collection: str) -> None:
102102
async def _get_managed_entry(self, *, collection: str, key: str) -> ManagedEntry | None:
103103
"""Retrieve a cache entry by key from the specified collection."""
104104

105-
async def _get_managed_entries(self, *, collection: str, keys: list[str]) -> list[ManagedEntry | None]:
105+
async def _get_managed_entries(self, *, collection: str, keys: Sequence[str]) -> list[ManagedEntry | None]:
106106
"""Retrieve multiple managed entries by key from the specified collection."""
107107

108108
return [await self._get_managed_entry(collection=collection, key=key) for key in keys]
@@ -137,7 +137,7 @@ async def get(
137137
return dict(managed_entry.value)
138138

139139
@override
140-
async def get_many(self, keys: list[str], *, collection: str | None = None) -> list[dict[str, Any] | None]:
140+
async def get_many(self, keys: Sequence[str], *, collection: str | None = None) -> list[dict[str, Any] | None]:
141141
collection = collection or self.default_collection
142142
await self.setup_collection(collection=collection)
143143

@@ -159,7 +159,7 @@ async def ttl(self, key: str, *, collection: str | None = None) -> tuple[dict[st
159159
@override
160160
async def ttl_many(
161161
self,
162-
keys: list[str],
162+
keys: Sequence[str],
163163
*,
164164
collection: str | None = None,
165165
) -> list[tuple[dict[str, Any] | None, float | None]]:
@@ -179,7 +179,7 @@ async def _put_managed_entry(self, *, collection: str, key: str, managed_entry:
179179
"""Store a managed entry by key in the specified collection."""
180180
...
181181

182-
async def _put_managed_entries(self, *, collection: str, keys: list[str], managed_entries: Sequence[ManagedEntry]) -> None:
182+
async def _put_managed_entries(self, *, collection: str, keys: Sequence[str], managed_entries: Sequence[ManagedEntry]) -> None:
183183
"""Store multiple managed entries by key in the specified collection."""
184184

185185
for key, managed_entry in zip(keys, managed_entries, strict=True):
@@ -204,8 +204,8 @@ async def put(self, key: str, value: Mapping[str, Any], *, collection: str | Non
204204
)
205205

206206
def _prepare_put_many(
207-
self, *, keys: list[str], values: Sequence[Mapping[str, Any]], ttl: Sequence[SupportsFloat | None] | SupportsFloat | None
208-
) -> tuple[list[str], Sequence[Mapping[str, Any]], list[float | None]]:
207+
self, *, keys: Sequence[str], values: Sequence[Mapping[str, Any]], ttl: SupportsFloat | None
208+
) -> tuple[Sequence[str], Sequence[Mapping[str, Any]], float | None]:
209209
"""Prepare multiple managed entries for a put_many operation.
210210
211211
Inheriting classes can use this method if they need to modify a put_many operation."""
@@ -214,22 +214,18 @@ def _prepare_put_many(
214214
msg = "put_many called but a different number of keys and values were provided"
215215
raise ValueError(msg) from None
216216

217-
if ttl and isinstance(ttl, Sequence) and len(ttl) != len(keys):
218-
msg = "put_many called but a different number of keys and ttl values were provided"
219-
raise ValueError(msg) from None
220-
221-
ttl_for_entries: list[float | None] = prepare_ttls(t=ttl, count=len(keys))
217+
ttl_for_entries: float | None = prepare_ttl(t=ttl)
222218

223219
return (keys, values, ttl_for_entries)
224220

225221
@override
226222
async def put_many(
227223
self,
228-
keys: list[str],
224+
keys: Sequence[str],
229225
values: Sequence[Mapping[str, Any]],
230226
*,
231227
collection: str | None = None,
232-
ttl: Sequence[SupportsFloat | None] | None = None,
228+
ttl: SupportsFloat | None = None,
233229
) -> None:
234230
"""Store multiple key-value pairs in the specified collection."""
235231

@@ -238,9 +234,7 @@ async def put_many(
238234

239235
keys, values, ttl_for_entries = self._prepare_put_many(keys=keys, values=values, ttl=ttl)
240236

241-
managed_entries: list[ManagedEntry] = [
242-
ManagedEntry(value=value, ttl=ttl_for_entries[i], created_at=now()) for i, value in enumerate(values)
243-
]
237+
managed_entries: list[ManagedEntry] = [ManagedEntry(value=value, ttl=ttl_for_entries, created_at=now()) for value in values]
244238

245239
await self._put_managed_entries(collection=collection, keys=keys, managed_entries=managed_entries)
246240

@@ -249,7 +243,7 @@ async def _delete_managed_entry(self, *, key: str, collection: str) -> bool:
249243
"""Delete a managed entry by key from the specified collection."""
250244
...
251245

252-
async def _delete_managed_entries(self, *, keys: list[str], collection: str) -> int:
246+
async def _delete_managed_entries(self, *, keys: Sequence[str], collection: str) -> int:
253247
"""Delete multiple managed entries by key from the specified collection."""
254248

255249
deleted_count: int = 0
@@ -268,7 +262,7 @@ async def delete(self, key: str, *, collection: str | None = None) -> bool:
268262
return await self._delete_managed_entry(key=key, collection=collection)
269263

270264
@override
271-
async def delete_many(self, keys: list[str], *, collection: str | None = None) -> int:
265+
async def delete_many(self, keys: Sequence[str], *, collection: str | None = None) -> int:
272266
"""Delete multiple managed entries by key from the specified collection."""
273267
collection = collection or self.default_collection
274268
await self.setup_collection(collection=collection)

key-value/key-value-aio/src/key_value/aio/stores/memory/store.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def _memory_cache_ttu(_key: Any, value: MemoryCacheEntry, now: float) -> float:
5555
return float(expiration_epoch)
5656

5757

58-
def _memory_cache_getsizeof(value: MemoryCacheEntry) -> int: # pyright: ignore[reportUnusedParameter] # noqa: ARG001
58+
def _memory_cache_getsizeof(value: MemoryCacheEntry) -> int: # pyright: ignore[reportUnusedParameter]
5959
"""Return size of cache entry (always 1 for entry counting)."""
6060
return 1
6161

key-value/key-value-aio/src/key_value/aio/wrappers/base.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ async def get(self, key: str, *, collection: str | None = None) -> dict[str, Any
1616
return await self.key_value.get(collection=collection, key=key)
1717

1818
@override
19-
async def get_many(self, keys: list[str], *, collection: str | None = None) -> list[dict[str, Any] | None]:
19+
async def get_many(self, keys: Sequence[str], *, collection: str | None = None) -> list[dict[str, Any] | None]:
2020
return await self.key_value.get_many(collection=collection, keys=keys)
2121

2222
@override
2323
async def ttl(self, key: str, *, collection: str | None = None) -> tuple[dict[str, Any] | None, float | None]:
2424
return await self.key_value.ttl(collection=collection, key=key)
2525

2626
@override
27-
async def ttl_many(self, keys: list[str], *, collection: str | None = None) -> list[tuple[dict[str, Any] | None, float | None]]:
27+
async def ttl_many(self, keys: Sequence[str], *, collection: str | None = None) -> list[tuple[dict[str, Any] | None, float | None]]:
2828
return await self.key_value.ttl_many(collection=collection, keys=keys)
2929

3030
@override
@@ -34,11 +34,11 @@ async def put(self, key: str, value: Mapping[str, Any], *, collection: str | Non
3434
@override
3535
async def put_many(
3636
self,
37-
keys: list[str],
37+
keys: Sequence[str],
3838
values: Sequence[Mapping[str, Any]],
3939
*,
4040
collection: str | None = None,
41-
ttl: Sequence[SupportsFloat | None] | None = None,
41+
ttl: SupportsFloat | None = None,
4242
) -> None:
4343
return await self.key_value.put_many(keys=keys, values=values, collection=collection, ttl=ttl)
4444

@@ -47,5 +47,5 @@ async def delete(self, key: str, *, collection: str | None = None) -> bool:
4747
return await self.key_value.delete(collection=collection, key=key)
4848

4949
@override
50-
async def delete_many(self, keys: list[str], *, collection: str | None = None) -> int:
50+
async def delete_many(self, keys: Sequence[str], *, collection: str | None = None) -> int:
5151
return await self.key_value.delete_many(keys=keys, collection=collection)

key-value/key-value-aio/src/key_value/aio/wrappers/compression/wrapper.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ async def get(self, key: str, *, collection: str | None = None) -> dict[str, Any
116116
return self._decompress_value(value)
117117

118118
@override
119-
async def get_many(self, keys: list[str], *, collection: str | None = None) -> list[dict[str, Any] | None]:
119+
async def get_many(self, keys: Sequence[str], *, collection: str | None = None) -> list[dict[str, Any] | None]:
120120
values = await self.key_value.get_many(keys=keys, collection=collection)
121121
return [self._decompress_value(value) for value in values]
122122

@@ -126,7 +126,7 @@ async def ttl(self, key: str, *, collection: str | None = None) -> tuple[dict[st
126126
return self._decompress_value(value), ttl
127127

128128
@override
129-
async def ttl_many(self, keys: list[str], *, collection: str | None = None) -> list[tuple[dict[str, Any] | None, float | None]]:
129+
async def ttl_many(self, keys: Sequence[str], *, collection: str | None = None) -> list[tuple[dict[str, Any] | None, float | None]]:
130130
results = await self.key_value.ttl_many(keys=keys, collection=collection)
131131
return [(self._decompress_value(value), ttl) for value, ttl in results]
132132

@@ -138,11 +138,11 @@ async def put(self, key: str, value: Mapping[str, Any], *, collection: str | Non
138138
@override
139139
async def put_many(
140140
self,
141-
keys: list[str],
141+
keys: Sequence[str],
142142
values: Sequence[Mapping[str, Any]],
143143
*,
144144
collection: str | None = None,
145-
ttl: Sequence[SupportsFloat | None] | None = None,
145+
ttl: SupportsFloat | None = None,
146146
) -> None:
147147
compressed_values = [self._compress_value(dict(value)) for value in values]
148148
return await self.key_value.put_many(keys=keys, values=compressed_values, collection=collection, ttl=ttl)

0 commit comments

Comments
 (0)