From 0ee1c75031be121b51cecf5d1664f0d040645d58 Mon Sep 17 00:00:00 2001 From: Renovate Date: Sun, 2 Mar 2025 15:25:02 +0200 Subject: [PATCH 01/18] Update dependency pytest to v8.3.5 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 167d6ef..2ea827d 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -5,7 +5,7 @@ mypy==1.15.0 pylint==3.3.4 pytest-asyncio==0.25.3 pytest-cov==6.0.0 -pytest==8.3.4 +pytest==8.3.5 tox==4.24.0 twine==6.1.0 types-aiofiles==24.1.0.20241221 From f29a6e4896e94e792751e78a362f8c49ae53019a Mon Sep 17 00:00:00 2001 From: Renovate Date: Fri, 7 Mar 2025 20:38:14 +0200 Subject: [PATCH 02/18] Update dependency tox to v4.24.2 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 2ea827d..5f3426a 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -6,7 +6,7 @@ pylint==3.3.4 pytest-asyncio==0.25.3 pytest-cov==6.0.0 pytest==8.3.5 -tox==4.24.0 +tox==4.24.2 twine==6.1.0 types-aiofiles==24.1.0.20241221 types-ujson==5.10.0.20240515 \ No newline at end of file From cc41f4aa835b46d2124811f10f27a61068907e25 Mon Sep 17 00:00:00 2001 From: Renovate Date: Sun, 9 Mar 2025 09:34:58 +0200 Subject: [PATCH 03/18] Update dependency pylint to v3.3.5 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 5f3426a..973e485 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -2,7 +2,7 @@ black==25.1.0 build==1.2.2.post1 isort==5.13.2 mypy==1.15.0 -pylint==3.3.4 +pylint==3.3.5 pytest-asyncio==0.25.3 pytest-cov==6.0.0 pytest==8.3.5 From 7908d0b90690d71ee2a62d28ebb71e333a7d906f Mon Sep 17 00:00:00 2001 From: Renovate Date: Thu, 20 Mar 2025 13:40:52 +0200 Subject: [PATCH 04/18] Update dependency pylint to v3.3.6 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 973e485..34da20d 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -2,7 +2,7 @@ black==25.1.0 build==1.2.2.post1 isort==5.13.2 mypy==1.15.0 -pylint==3.3.5 +pylint==3.3.6 pytest-asyncio==0.25.3 pytest-cov==6.0.0 pytest==8.3.5 From e34cb7f4b1f15eeec84a6657536722d40f61e174 Mon Sep 17 00:00:00 2001 From: Renovate Date: Tue, 25 Mar 2025 08:50:28 +0200 Subject: [PATCH 05/18] Update dependency pytest-asyncio to v0.26.0 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 34da20d..ffad85f 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -3,7 +3,7 @@ build==1.2.2.post1 isort==5.13.2 mypy==1.15.0 pylint==3.3.6 -pytest-asyncio==0.25.3 +pytest-asyncio==0.26.0 pytest-cov==6.0.0 pytest==8.3.5 tox==4.24.2 From 762c20a213dc606e6bc8dc9c8cf28edfaa336f03 Mon Sep 17 00:00:00 2001 From: Renovate Date: Wed, 26 Mar 2025 05:28:21 +0200 Subject: [PATCH 06/18] Update dependency types-aiofiles to v24.1.0.20250326 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index ffad85f..1962ea6 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -8,5 +8,5 @@ pytest-cov==6.0.0 pytest==8.3.5 tox==4.24.2 twine==6.1.0 -types-aiofiles==24.1.0.20241221 +types-aiofiles==24.1.0.20250326 types-ujson==5.10.0.20240515 \ No newline at end of file From cb5e6c7bdb24e0c96757105c10a489d664a9b119 Mon Sep 17 00:00:00 2001 From: Renovate Date: Wed, 26 Mar 2025 06:30:43 +0200 Subject: [PATCH 07/18] Update dependency typing-extensions to ~=4.13.0 --- requirements/_.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/_.txt b/requirements/_.txt index 3a5d6be..aa412d5 100644 --- a/requirements/_.txt +++ b/requirements/_.txt @@ -1,2 +1,2 @@ aiofiles>=23.0.0 -typing-extensions~=4.12.2 \ No newline at end of file +typing-extensions~=4.13.0 \ No newline at end of file From b7f847752c09895233383cba33b0f644b894b85e Mon Sep 17 00:00:00 2001 From: Renovate Date: Wed, 26 Mar 2025 07:32:40 +0200 Subject: [PATCH 08/18] Update dependency types-ujson to v5.10.0.20250326 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 1962ea6..479513b 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -9,4 +9,4 @@ pytest==8.3.5 tox==4.24.2 twine==6.1.0 types-aiofiles==24.1.0.20250326 -types-ujson==5.10.0.20240515 \ No newline at end of file +types-ujson==5.10.0.20250326 \ No newline at end of file From 6171dac7b81c0816db4f3601d51f47e2d0a6d3f4 Mon Sep 17 00:00:00 2001 From: Renovate Date: Thu, 27 Mar 2025 17:30:45 +0200 Subject: [PATCH 09/18] Update dependency tox to v4.25.0 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 479513b..0a2bd7e 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -6,7 +6,7 @@ pylint==3.3.6 pytest-asyncio==0.26.0 pytest-cov==6.0.0 pytest==8.3.5 -tox==4.24.2 +tox==4.25.0 twine==6.1.0 types-aiofiles==24.1.0.20250326 types-ujson==5.10.0.20250326 \ No newline at end of file From 74f5d638e30838732f5476d8ac499afacba0259e Mon Sep 17 00:00:00 2001 From: Renovate Date: Tue, 1 Apr 2025 14:38:36 +0300 Subject: [PATCH 10/18] Update dependency pytest-cov to v6.1.0 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 0a2bd7e..7098f48 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -4,7 +4,7 @@ isort==5.13.2 mypy==1.15.0 pylint==3.3.6 pytest-asyncio==0.26.0 -pytest-cov==6.0.0 +pytest-cov==6.1.0 pytest==8.3.5 tox==4.25.0 twine==6.1.0 From 0690a0fe2290d5cffb4d75e73843510bded452d5 Mon Sep 17 00:00:00 2001 From: Renovate Date: Sat, 5 Apr 2025 17:22:39 +0300 Subject: [PATCH 11/18] Update dependency pytest-cov to v6.1.1 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 7098f48..4e20679 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -4,7 +4,7 @@ isort==5.13.2 mypy==1.15.0 pylint==3.3.6 pytest-asyncio==0.26.0 -pytest-cov==6.1.0 +pytest-cov==6.1.1 pytest==8.3.5 tox==4.25.0 twine==6.1.0 From 9f1179f330bb8cee995274e0672fca5bcc534e09 Mon Sep 17 00:00:00 2001 From: Renovate Date: Wed, 30 Apr 2025 18:22:21 +0300 Subject: [PATCH 12/18] Update dependency redis to ~=5.3.0 --- requirements/cache.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/cache.txt b/requirements/cache.txt index f0f2e14..2227167 100644 --- a/requirements/cache.txt +++ b/requirements/cache.txt @@ -1,2 +1,2 @@ pymemcache~=4.0.0 -redis~=5.2.1 \ No newline at end of file +redis~=5.3.0 \ No newline at end of file From e45266a97769a120e94fd79cc53a32226d9f99aa Mon Sep 17 00:00:00 2001 From: Renovate Date: Wed, 30 Apr 2025 22:28:51 +0300 Subject: [PATCH 13/18] Update dependency redis to v6 --- requirements/cache.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/cache.txt b/requirements/cache.txt index 2227167..33602cf 100644 --- a/requirements/cache.txt +++ b/requirements/cache.txt @@ -1,2 +1,2 @@ pymemcache~=4.0.0 -redis~=5.3.0 \ No newline at end of file +redis~=6.0.0 \ No newline at end of file From 6de12244ec5b0d541423369ed9837eea06636017 Mon Sep 17 00:00:00 2001 From: Renovate Date: Sun, 4 May 2025 20:55:27 +0300 Subject: [PATCH 14/18] Update dependency pylint to v3.3.7 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 4e20679..eb93818 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -2,7 +2,7 @@ black==25.1.0 build==1.2.2.post1 isort==5.13.2 mypy==1.15.0 -pylint==3.3.6 +pylint==3.3.7 pytest-asyncio==0.26.0 pytest-cov==6.1.1 pytest==8.3.5 From e296aaa6b39baa6aed29b8936ed2c474acdc58aa Mon Sep 17 00:00:00 2001 From: Renovate Date: Tue, 13 May 2025 16:06:05 +0300 Subject: [PATCH 15/18] Update dependency redis to ~=6.1.0 --- requirements/cache.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/cache.txt b/requirements/cache.txt index 33602cf..6c3d33f 100644 --- a/requirements/cache.txt +++ b/requirements/cache.txt @@ -1,2 +1,2 @@ pymemcache~=4.0.0 -redis~=6.0.0 \ No newline at end of file +redis~=6.1.0 \ No newline at end of file From accd22dd4d31df0d9d13ab70d31677c69a3f6d7c Mon Sep 17 00:00:00 2001 From: Renovate Date: Tue, 13 May 2025 18:09:36 +0300 Subject: [PATCH 16/18] Update dependency tox to v4.26.0 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index eb93818..11af3df 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -6,7 +6,7 @@ pylint==3.3.7 pytest-asyncio==0.26.0 pytest-cov==6.1.1 pytest==8.3.5 -tox==4.25.0 +tox==4.26.0 twine==6.1.0 types-aiofiles==24.1.0.20250326 types-ujson==5.10.0.20250326 \ No newline at end of file From 84e1cf7ce992df9f36c37e7acd798286e9cbca6f Mon Sep 17 00:00:00 2001 From: Renovate Date: Fri, 16 May 2025 06:49:57 +0300 Subject: [PATCH 17/18] Update dependency types-aiofiles to v24.1.0.20250516 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 11af3df..54f12e3 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -8,5 +8,5 @@ pytest-cov==6.1.1 pytest==8.3.5 tox==4.26.0 twine==6.1.0 -types-aiofiles==24.1.0.20250326 +types-aiofiles==24.1.0.20250516 types-ujson==5.10.0.20250326 \ No newline at end of file From 95abf4265c1efcb8426ff8ff11de18f175ecb6d9 Mon Sep 17 00:00:00 2001 From: profitroll Date: Sun, 18 May 2025 17:29:27 +0200 Subject: [PATCH 18/18] Added support for cache prefix --- README.md | 1 + src/libbot/__init__.py | 2 +- src/libbot/cache/classes/cache_memcached.py | 24 ++++++++++++++++----- src/libbot/cache/classes/cache_redis.py | 24 ++++++++++++++++----- src/libbot/cache/manager/manager.py | 7 +++--- 5 files changed, 44 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index b77c3c9..76b7679 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ There are different sub-packages available: * pyrogram - Telegram bots with Pyrogram's fork "Pyrofork" * pycord - Discord bots with Pycord * speed - Performance improvements +* cache - Support for Redis and Memcached * dev - Dependencies for package development purposes You can freely choose any sub-package you want, as well as add multiple (comma-separated) or none at all. diff --git a/src/libbot/__init__.py b/src/libbot/__init__.py index 52f592d..fcb6220 100644 --- a/src/libbot/__init__.py +++ b/src/libbot/__init__.py @@ -1,4 +1,4 @@ -__version__ = "4.1.0" +__version__ = "4.2.0" __license__ = "GPL3" __author__ = "Profitroll" diff --git a/src/libbot/cache/classes/cache_memcached.py b/src/libbot/cache/classes/cache_memcached.py index 41b654c..f592b1d 100644 --- a/src/libbot/cache/classes/cache_memcached.py +++ b/src/libbot/cache/classes/cache_memcached.py @@ -1,6 +1,6 @@ import logging from logging import Logger -from typing import Dict, Any +from typing import Dict, Any, Optional from pymemcache import Client @@ -13,21 +13,27 @@ logger: Logger = logging.getLogger(__name__) class CacheMemcached(Cache): client: Client - def __init__(self, client: Client): - self.client = client + def __init__(self, client: Client, prefix: Optional[str] = None): + self.client: Client = client + self.prefix: str | None = prefix logger.info("Initialized Memcached for caching") @classmethod - def from_config(cls, engine_config: Dict[str, Any]) -> "CacheMemcached": + def from_config(cls, engine_config: Dict[str, Any], prefix: Optional[str] = None) -> "CacheMemcached": if "uri" not in engine_config: raise KeyError( "Cache configuration is invalid. Please check if all keys are set (engine: memcached)" ) - return cls(Client(engine_config["uri"], default_noreply=True)) + return cls(Client(engine_config["uri"], default_noreply=True), prefix=prefix) + + def _get_prefixed_key(self, key: str) -> str: + return key if self.prefix is None else f"{self.prefix}_{key}" def get_json(self, key: str) -> Any | None: + key = self._get_prefixed_key(key) + try: result: Any | None = self.client.get(key, None) @@ -43,6 +49,8 @@ class CacheMemcached(Cache): return None if result is None else _string_to_json(result) def get_string(self, key: str) -> str | None: + key = self._get_prefixed_key(key) + try: result: str | None = self.client.get(key, None) @@ -62,6 +70,8 @@ class CacheMemcached(Cache): raise NotImplementedError() def set_json(self, key: str, value: Any) -> None: + key = self._get_prefixed_key(key) + try: self.client.set(key, _json_to_string(value)) logger.debug("Set json cache key '%s'", key) @@ -70,6 +80,8 @@ class CacheMemcached(Cache): return None def set_string(self, key: str, value: str) -> None: + key = self._get_prefixed_key(key) + try: self.client.set(key, value) logger.debug("Set string cache key '%s'", key) @@ -82,6 +94,8 @@ class CacheMemcached(Cache): raise NotImplementedError() def delete(self, key: str) -> None: + key = self._get_prefixed_key(key) + try: self.client.delete(key) logger.debug("Deleted cache key '%s'", key) diff --git a/src/libbot/cache/classes/cache_redis.py b/src/libbot/cache/classes/cache_redis.py index 2edfa43..797a866 100644 --- a/src/libbot/cache/classes/cache_redis.py +++ b/src/libbot/cache/classes/cache_redis.py @@ -1,6 +1,6 @@ import logging from logging import Logger -from typing import Dict, Any +from typing import Dict, Any, Optional from redis import Redis @@ -13,21 +13,27 @@ logger: Logger = logging.getLogger(__name__) class CacheRedis(Cache): client: Redis - def __init__(self, client: Redis): - self.client = client + def __init__(self, client: Redis, prefix: Optional[str] = None): + self.client: Redis = client + self.prefix: str | None = prefix logger.info("Initialized Redis for caching") @classmethod - def from_config(cls, engine_config: Dict[str, Any]) -> Any: + def from_config(cls, engine_config: Dict[str, Any], prefix: Optional[str] = None) -> Any: if "uri" not in engine_config: raise KeyError( "Cache configuration is invalid. Please check if all keys are set (engine: memcached)" ) - return cls(Redis.from_url(engine_config["uri"])) + return cls(Redis.from_url(engine_config["uri"]), prefix=prefix) + + def _get_prefixed_key(self, key: str) -> str: + return key if self.prefix is None else f"{self.prefix}_{key}" def get_json(self, key: str) -> Any | None: + key = self._get_prefixed_key(key) + try: result: Any | None = self.client.get(key) @@ -43,6 +49,8 @@ class CacheRedis(Cache): return None if result is None else _string_to_json(result) def get_string(self, key: str) -> str | None: + key = self._get_prefixed_key(key) + try: result: str | None = self.client.get(key) @@ -62,6 +70,8 @@ class CacheRedis(Cache): raise NotImplementedError() def set_json(self, key: str, value: Any) -> None: + key = self._get_prefixed_key(key) + try: self.client.set(key, _json_to_string(value)) logger.debug("Set json cache key '%s'", key) @@ -70,6 +80,8 @@ class CacheRedis(Cache): return None def set_string(self, key: str, value: str) -> None: + key = self._get_prefixed_key(key) + try: self.client.set(key, value) logger.debug("Set string cache key '%s'", key) @@ -82,6 +94,8 @@ class CacheRedis(Cache): raise NotImplementedError() def delete(self, key: str) -> None: + key = self._get_prefixed_key(key) + try: self.client.delete(key) logger.debug("Deleted cache key '%s'", key) diff --git a/src/libbot/cache/manager/manager.py b/src/libbot/cache/manager/manager.py index 6b7db2c..67d3f6b 100644 --- a/src/libbot/cache/manager/manager.py +++ b/src/libbot/cache/manager/manager.py @@ -1,4 +1,4 @@ -from typing import Dict, Any, Literal +from typing import Dict, Any, Literal, Optional from ..classes import CacheMemcached, CacheRedis @@ -6,6 +6,7 @@ from ..classes import CacheMemcached, CacheRedis def create_cache_client( config: Dict[str, Any], engine: Literal["memcached", "redis"] | None = None, + prefix: Optional[str] = None, ) -> CacheMemcached | CacheRedis: if engine not in ["memcached", "redis"] or engine is None: raise KeyError(f"Incorrect cache engine provided. Expected 'memcached' or 'redis', got '{engine}'") @@ -17,8 +18,8 @@ def create_cache_client( match engine: case "memcached": - return CacheMemcached.from_config(config["cache"][engine]) + return CacheMemcached.from_config(config["cache"][engine], prefix=prefix) case "redis": - return CacheRedis.from_config(config["cache"][engine]) + return CacheRedis.from_config(config["cache"][engine], prefix=prefix) case _: raise KeyError(f"Cache implementation for the engine '{engine}' is not present.")