Skip to content

Commit 8f8f7db

Browse files
committed
FIX: delete_many not working properly in sync Django backend 🚑️
1 parent 9456953 commit 8f8f7db

File tree

6 files changed

+37
-8
lines changed

6 files changed

+37
-8
lines changed

cachetory/backends/async_/redis.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ async def delete(self, key: str) -> bool:
6868
return bool(await self._client.delete(key))
6969

7070
async def delete_many(self, *keys: str) -> None:
71-
await self._client.delete(*keys)
71+
if keys:
72+
await self._client.delete(*keys)
7273

7374
async def clear(self) -> None:
7475
await self._client.flushdb()

cachetory/backends/sync/django.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def delete(self, key: str) -> bool:
5858
return self._cache.delete(key) # type: ignore[no-any-return]
5959

6060
def delete_many(self, *keys: str) -> None:
61-
self._cache.delete_many(*keys)
61+
self._cache.delete_many(keys)
6262

6363
def clear(self) -> None:
6464
self._cache.clear()

cachetory/backends/sync/memory.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from __future__ import annotations
22

3-
from collections.abc import Set
43
from datetime import datetime, timedelta, timezone
54
from typing import Generic
65

@@ -51,10 +50,8 @@ def delete(self, key: str) -> bool:
5150
return self._entries.pop(key, _SENTINEL) is not _SENTINEL
5251

5352
def delete_many(self, *keys: str) -> None:
54-
keys: Set[str] = set(keys) # type: ignore[no-redef]
55-
56-
# Replace the entire dictionary to make the operation atomic:
57-
self._entries = {key: value for key, value in self._entries.items() if key not in keys}
53+
for key in keys:
54+
self._entries.pop(key, None)
5855

5956
def clear(self) -> None:
6057
self._entries.clear()

cachetory/backends/sync/redis.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ def delete(self, key: str) -> bool:
6868
return bool(self._client.delete(key))
6969

7070
def delete_many(self, *keys: str) -> None:
71-
self._client.delete(*keys)
71+
if keys:
72+
self._client.delete(*keys)
7273

7374
def clear(self) -> None:
7475
self._client.flushdb()

tests/backends/test_async.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,21 @@ async def test_delete_missing(backend: AsyncBackend[bytes]) -> None:
7676
assert not await backend.delete("foo")
7777

7878

79+
async def test_delete_many(backend: AsyncBackend[bytes]) -> None:
80+
await backend.set("foo", b"foo")
81+
await backend.set("qux", b"qux")
82+
await backend.delete_many("foo", "bar")
83+
84+
with pytest.raises(KeyError):
85+
await backend.get("foo")
86+
assert await backend.get("qux") == b"qux"
87+
88+
89+
async def test_delete_many_without_arguments(backend: AsyncBackend[bytes]) -> None:
90+
"""Verify that it does not raise an error."""
91+
await backend.delete_many()
92+
93+
7994
async def test_set_get_many(backend: AsyncBackend[bytes]) -> None:
8095
await backend.set_many([("non-empty", b"foo"), ("empty", b"")])
8196
assert [entry async for entry in backend.get_many("non-empty", "missing", "empty")] == [

tests/backends/test_sync.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,21 @@ def test_delete_missing(backend: SyncBackend[bytes]) -> None:
7575
assert not backend.delete("foo")
7676

7777

78+
def test_delete_many(backend: SyncBackend[bytes]) -> None:
79+
backend.set("foo", b"foo")
80+
backend.set("qux", b"qux")
81+
backend.delete_many("foo", "bar")
82+
83+
with pytest.raises(KeyError):
84+
backend.get("foo")
85+
assert backend.get("qux") == b"qux"
86+
87+
88+
def test_delete_many_without_arguments(backend: SyncBackend[bytes]) -> None:
89+
"""Verify that it does not raise an error."""
90+
backend.delete_many()
91+
92+
7893
def test_set_get_many(backend: SyncBackend[bytes]) -> None:
7994
backend.set_many([("non-empty", b"foo"), ("empty", b"")])
8095
assert list(backend.get_many("non-empty", "missing", "empty")) == [("non-empty", b"foo"), ("empty", b"")]

0 commit comments

Comments
 (0)