Skip to content

Commit 4c72c9a

Browse files
Add an option to use the given key as-is (#112)
This is required when we're dealing with data cached in a different way than through the CacheManager.
1 parent 463f608 commit 4c72c9a

File tree

3 files changed

+40
-21
lines changed

3 files changed

+40
-21
lines changed

matter_persistence/redis/manager.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,9 @@ async def save_with_key(
175175
value: Any,
176176
object_class: type[Model] | None = None,
177177
expiration_in_seconds: int | None = None,
178+
use_key_as_is: bool = False,
178179
):
179-
object_name = object_class.__name__ if object_class else None
180-
hash_key = CacheHelper.create_basic_hash_key(key, object_name)
180+
hash_key = self._get_key_from_params(key=key, object_class=object_class, use_key_as_is=use_key_as_is)
181181
if object_class:
182182
value = value.model_dump_json()
183183

@@ -215,9 +215,8 @@ async def save_many_with_keys(
215215
}
216216
await cache_client.set_many_values(processed_input, ttl=expiration_in_seconds)
217217

218-
async def get_with_key(self, key: str, object_class: type[Model] | None = None) -> Any:
219-
object_name = object_class.__name__ if object_class else None
220-
hash_key = CacheHelper.create_basic_hash_key(key, object_name)
218+
async def get_with_key(self, key: str, object_class: type[Model] | None = None, use_key_as_is: bool = False) -> Any:
219+
hash_key = self._get_key_from_params(key=key, object_class=object_class, use_key_as_is=use_key_as_is)
221220
async with self.__get_cache_client(for_writing=False) as cache_client:
222221
value = await cache_client.get_value(hash_key)
223222
if not value:
@@ -260,10 +259,9 @@ async def delete_with_key(
260259
self,
261260
key: str,
262261
object_class: type[Model] | None = None,
262+
use_key_as_is: bool = False,
263263
) -> Any:
264-
object_name = object_class.__name__ if object_class else None
265-
hash_key = CacheHelper.create_basic_hash_key(key, object_name)
266-
264+
hash_key = self._get_key_from_params(key=key, object_class=object_class, use_key_as_is=use_key_as_is)
267265
async with self.__get_cache_client(for_writing=True) as cache_client:
268266
if not await cache_client.delete_key(hash_key):
269267
raise CacheRecordNotFoundError(
@@ -275,9 +273,9 @@ async def cache_record_with_key_exists(
275273
self,
276274
key: str,
277275
object_class: type[Model] | None = None,
276+
use_key_as_is: bool = False,
278277
) -> bool:
279-
object_name = object_class.__name__ if object_class else None
280-
hash_key = CacheHelper.create_basic_hash_key(key, object_name)
278+
hash_key = self._get_key_from_params(key=key, object_class=object_class, use_key_as_is=use_key_as_is)
281279
async with self.__get_cache_client(for_writing=False) as cache_client:
282280
return bool(await cache_client.exists(hash_key)) # cache_client.exists() returns 0 or 1
283281

@@ -287,3 +285,11 @@ async def is_cache_alive(self):
287285
"""
288286
async with self.__get_cache_client(for_writing=False) as cache_client:
289287
return await cache_client.is_alive()
288+
289+
@staticmethod
290+
def _get_key_from_params(key: str, object_class: type[Model] | None = None, use_key_as_is: bool = False) -> str:
291+
if use_key_as_is:
292+
return key
293+
else:
294+
object_name = object_class.__name__ if object_class else None
295+
return CacheHelper.create_basic_hash_key(key, object_name)

tests/redis/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
# https://pytest-asyncio.readthedocs.io/en/latest/how-to-guides/run_session_tests_in_same_loop.html
2424
def pytest_collection_modifyitems(items):
2525
pytest_asyncio_tests = (item for item in items if is_async_test(item))
26-
session_scope_marker = pytest.mark.asyncio(scope="session")
26+
session_scope_marker = pytest.mark.asyncio(loop_scope="session")
2727
for async_test in pytest_asyncio_tests:
2828
async_test.add_marker(session_scope_marker, append=False)
2929

tests/redis/test_manager.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import pytest
44
from pydantic import BaseModel
5+
from redis.asyncio import Redis
56

67
from matter_persistence.redis.exceptions import CacheRecordNotFoundError
78
from matter_persistence.redis.manager import CacheManager
@@ -66,9 +67,10 @@ async def test_cache_manager_incorrect_argument_combination():
6667
_ = CacheManager()
6768

6869

69-
async def test_cache_manager_save_with_key_and_get_with_key_success(cache_manager, test_dto):
70-
await cache_manager.save_with_key("key", test_dto, TestDTO)
71-
assert await cache_manager.get_with_key("key", TestDTO)
70+
@pytest.mark.parametrize("use_key_as_is", (True, False))
71+
async def test_cache_manager_save_with_key_and_get_with_key_success(cache_manager, test_dto, use_key_as_is: bool):
72+
await cache_manager.save_with_key("key", test_dto, TestDTO, use_key_as_is=use_key_as_is)
73+
assert await cache_manager.get_with_key("key", TestDTO, use_key_as_is=use_key_as_is)
7274

7375

7476
async def test_cache_manager_save_and_get_many_objects_with_keys_success(cache_manager: CacheManager) -> None:
@@ -107,18 +109,29 @@ async def test_cache_manager_save_with_key_and_get_with_key_expired(cache_manage
107109
await cache_manager.get_with_key("key", TestDTO)
108110

109111

110-
async def test_cache_manager_cache_record_with_key_exists(cache_manager, test_dto):
111-
await cache_manager.save_with_key("key", test_dto, TestDTO)
112-
assert await cache_manager.cache_record_with_key_exists("key", TestDTO)
112+
@pytest.mark.parametrize("use_key_as_is", (True, False))
113+
async def test_cache_manager_cache_record_with_key_exists(cache_manager, test_dto, use_key_as_is: bool):
114+
await cache_manager.save_with_key("key", test_dto, TestDTO, use_key_as_is=use_key_as_is)
115+
assert await cache_manager.cache_record_with_key_exists("key", TestDTO, use_key_as_is=use_key_as_is)
113116

114117

115-
async def test_cache_manager_delete_with_key(cache_manager):
116-
await cache_manager.save_with_key("key", "value")
117-
await cache_manager.delete_with_key("key")
118+
@pytest.mark.parametrize("use_key_as_is", (True, False))
119+
async def test_cache_manager_delete_with_key(cache_manager, use_key_as_is: bool):
120+
await cache_manager.save_with_key("key", "value", use_key_as_is=use_key_as_is)
121+
await cache_manager.delete_with_key("key", use_key_as_is=use_key_as_is)
118122
with pytest.raises(CacheRecordNotFoundError):
119-
await cache_manager.get_with_key("key")
123+
await cache_manager.get_with_key("key", use_key_as_is=use_key_as_is)
120124

121125

122126
async def test_cache_manager_set_many_with_sentinel(cache_manager_with_sentinel: CacheManager) -> None:
123127
await cache_manager_with_sentinel.save_with_key("test", "some_value")
124128
assert (await cache_manager_with_sentinel.get_with_key("test")).decode() == "some_value"
129+
130+
131+
async def test_cache_manager_use_key_as_is_works(
132+
cache_manager: CacheManager, async_redis_client: Redis, test_dto: TestDTO
133+
) -> None:
134+
key = "test.key.without.need.of.changing"
135+
value = TestDTO(test_field=234)
136+
await async_redis_client.set(key, value.model_dump_json())
137+
assert await cache_manager.get_with_key(key=key, object_class=TestDTO, use_key_as_is=True) == value

0 commit comments

Comments
 (0)