Compare commits

..

29 Commits

Author SHA1 Message Date
af74e3fdd0 Merge pull request 'v4.2.0' (#207) from dev into main
All checks were successful
Analysis / SonarCloud (push) Successful in 51s
Tests / Build and Test (3.11) (push) Successful in 1m11s
Tests / Build and Test (3.12) (push) Successful in 1m7s
Tests / Build and Test (3.13) (push) Successful in 1m6s
Upload Python Package / release-build (release) Successful in 21s
Upload Python Package / gitea-publish (release) Successful in 22s
Upload Python Package / pypi-publish (release) Successful in 13s
Reviewed-on: #207
2025-05-18 18:38:49 +03:00
95abf4265c Added support for cache prefix
All checks were successful
Analysis / SonarCloud (push) Successful in 54s
Analysis / SonarCloud (pull_request) Successful in 46s
Tests / Build and Test (3.11) (pull_request) Successful in 1m12s
Tests / Build and Test (3.12) (pull_request) Successful in 1m9s
Tests / Build and Test (3.13) (pull_request) Successful in 1m6s
2025-05-18 17:29:27 +02:00
84e1cf7ce9 Update dependency types-aiofiles to v24.1.0.20250516
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 41s
Tests / Build and Test (3.11) (pull_request) Successful in 1m9s
Tests / Build and Test (3.12) (pull_request) Successful in 1m9s
Tests / Build and Test (3.13) (pull_request) Successful in 1m7s
Analysis / SonarCloud (push) Successful in 48s
2025-05-16 06:49:57 +03:00
accd22dd4d Update dependency tox to v4.26.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 43s
Tests / Build and Test (3.11) (pull_request) Successful in 1m9s
Tests / Build and Test (3.12) (pull_request) Successful in 1m7s
Tests / Build and Test (3.13) (pull_request) Successful in 1m4s
Analysis / SonarCloud (push) Successful in 46s
2025-05-13 18:09:36 +03:00
e296aaa6b3 Update dependency redis to ~=6.1.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 1m39s
Tests / Build and Test (3.11) (pull_request) Successful in 1m19s
Tests / Build and Test (3.12) (pull_request) Successful in 1m26s
Tests / Build and Test (3.13) (pull_request) Successful in 1m18s
Analysis / SonarCloud (push) Successful in 49s
2025-05-13 16:06:05 +03:00
6de12244ec Update dependency pylint to v3.3.7
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 45s
Tests / Build and Test (3.11) (pull_request) Successful in 1m9s
Tests / Build and Test (3.12) (pull_request) Successful in 1m8s
Tests / Build and Test (3.13) (pull_request) Successful in 1m9s
Analysis / SonarCloud (push) Successful in 53s
2025-05-04 20:55:27 +03:00
e45266a977 Update dependency redis to v6
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 44s
Tests / Build and Test (3.11) (pull_request) Successful in 1m7s
Tests / Build and Test (3.12) (pull_request) Successful in 1m6s
Tests / Build and Test (3.13) (pull_request) Successful in 1m6s
Analysis / SonarCloud (push) Successful in 48s
2025-04-30 22:28:51 +03:00
9f1179f330 Update dependency redis to ~=5.3.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 1m36s
Tests / Build and Test (3.11) (pull_request) Successful in 1m23s
Tests / Build and Test (3.12) (pull_request) Successful in 1m23s
Tests / Build and Test (3.13) (pull_request) Successful in 1m22s
Analysis / SonarCloud (push) Successful in 53s
2025-04-30 18:22:21 +03:00
0690a0fe22 Update dependency pytest-cov to v6.1.1
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 39s
Tests / Build and Test (3.11) (pull_request) Successful in 1m10s
Tests / Build and Test (3.12) (pull_request) Successful in 1m8s
Tests / Build and Test (3.13) (pull_request) Successful in 1m5s
Analysis / SonarCloud (push) Successful in 51s
2025-04-05 17:22:39 +03:00
74f5d638e3 Update dependency pytest-cov to v6.1.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 39s
Tests / Build and Test (3.11) (pull_request) Successful in 1m11s
Tests / Build and Test (3.12) (pull_request) Successful in 1m6s
Tests / Build and Test (3.13) (pull_request) Successful in 1m5s
Analysis / SonarCloud (push) Successful in 1m38s
2025-04-01 14:38:36 +03:00
809e103aa3 Merge pull request 'Update dependency tox to v4.25.0' (#198) from renovate/tox-4.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 46s
Reviewed-on: #198
2025-03-27 17:57:47 +02:00
6171dac7b8 Update dependency tox to v4.25.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 39s
Tests / Build and Test (3.11) (pull_request) Successful in 1m9s
Tests / Build and Test (3.12) (pull_request) Successful in 1m7s
Tests / Build and Test (3.13) (pull_request) Successful in 1m4s
2025-03-27 17:30:45 +02:00
b7f847752c Update dependency types-ujson to v5.10.0.20250326
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 42s
Tests / Build and Test (3.11) (pull_request) Successful in 1m12s
Tests / Build and Test (3.12) (pull_request) Successful in 1m5s
Tests / Build and Test (3.13) (pull_request) Successful in 1m3s
Analysis / SonarCloud (push) Successful in 49s
2025-03-26 07:32:40 +02:00
cb5e6c7bdb Update dependency typing-extensions to ~=4.13.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 38s
Tests / Build and Test (3.11) (pull_request) Successful in 1m11s
Tests / Build and Test (3.12) (pull_request) Successful in 1m8s
Tests / Build and Test (3.13) (pull_request) Successful in 1m4s
Analysis / SonarCloud (push) Successful in 49s
2025-03-26 06:30:43 +02:00
762c20a213 Update dependency types-aiofiles to v24.1.0.20250326
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 50s
Tests / Build and Test (3.11) (pull_request) Successful in 1m31s
Tests / Build and Test (3.12) (pull_request) Successful in 1m11s
Tests / Build and Test (3.13) (pull_request) Successful in 1m10s
Analysis / SonarCloud (push) Successful in 46s
2025-03-26 05:28:21 +02:00
fdb8db4782 Merge pull request 'v4.1.0' (#189) from dev into main
Some checks failed
Analysis / SonarCloud (push) Successful in 46s
Tests / Build and Test (3.11) (push) Successful in 1m9s
Tests / Build and Test (3.12) (push) Successful in 1m7s
Tests / Build and Test (3.13) (push) Successful in 1m4s
Upload Python Package / release-build (release) Successful in 18s
Upload Python Package / gitea-publish (release) Failing after 20s
Upload Python Package / pypi-publish (release) Failing after 11s
Reviewed-on: #189
2025-02-16 18:37:38 +02:00
508c48d22b Merge pull request 'v4.0.2' (#172) from dev into main
All checks were successful
Analysis / SonarCloud (push) Successful in 46s
Tests / Build and Test (3.11) (push) Successful in 1m16s
Tests / Build and Test (3.12) (push) Successful in 1m24s
Tests / Build and Test (3.13) (push) Successful in 1m24s
Upload Python Package / release-build (release) Successful in 18s
Upload Python Package / gitea-publish (release) Successful in 9s
Upload Python Package / pypi-publish (release) Successful in 15s
Reviewed-on: #172
2025-01-02 15:04:26 +02:00
bfcb067ba5 Merge pull request 'v4.0.1' (#170) from dev into main
All checks were successful
Analysis / SonarCloud (push) Successful in 39s
Tests / Build and Test (3.11) (push) Successful in 1m18s
Tests / Build and Test (3.12) (push) Successful in 1m35s
Tests / Build and Test (3.13) (push) Successful in 1m21s
Reviewed-on: #170
2024-12-29 17:18:48 +02:00
a38b55d270 Merge pull request 'v4.0.0' (#169) from dev into main
Some checks failed
Analysis / SonarCloud (push) Successful in 42s
Tests / Build and Test (3.10) (push) Failing after 57s
Tests / Build and Test (3.11) (push) Successful in 1m4s
Tests / Build and Test (3.12) (push) Successful in 1m13s
Tests / Build and Test (3.9) (push) Failing after 57s
Reviewed-on: #169
2024-12-26 19:59:34 +02:00
9907cc50f1 Merge pull request 'v3.3.1' (#160) from dev into main
All checks were successful
Analysis / SonarCloud (push) Successful in 46s
Tests / Build and Test (3.10) (push) Successful in 1m3s
Tests / Build and Test (3.11) (push) Successful in 1m1s
Tests / Build and Test (3.12) (push) Successful in 1m8s
Tests / Build and Test (3.9) (push) Successful in 1m3s
Reviewed-on: #160
2024-12-16 23:57:08 +02:00
1b60257bc5 Merge pull request 'v3.3.0' (#159) from dev into main
All checks were successful
Analysis / SonarCloud (push) Successful in 43s
Tests / Build and Test (3.10) (push) Successful in 1m2s
Tests / Build and Test (3.11) (push) Successful in 1m2s
Tests / Build and Test (3.12) (push) Successful in 1m8s
Tests / Build and Test (3.9) (push) Successful in 1m4s
Reviewed-on: #159
2024-12-16 23:48:07 +02:00
171e36a491 Merge pull request 'v3.2.3' (#118) from dev into main
All checks were successful
Tests / test (3.10) (push) Successful in 1m2s
Tests / test (3.11) (push) Successful in 58s
Tests / test (3.8) (push) Successful in 1m4s
Tests / test (3.9) (push) Successful in 1m1s
Reviewed-on: #118
2024-07-10 00:07:54 +03:00
c419c684aa Merge pull request 'v3.2.2' (#107) from dev into main
All checks were successful
Tests / test (3.10) (push) Successful in 1m10s
Tests / test (3.11) (push) Successful in 1m4s
Tests / test (3.8) (push) Successful in 1m6s
Tests / test (3.9) (push) Successful in 1m7s
Reviewed-on: #107
2024-05-26 22:44:18 +03:00
748b2b2abb Merge pull request 'v3.2.1' (#106) from dev into main
All checks were successful
Tests / test (3.10) (push) Successful in 1m3s
Tests / test (3.11) (push) Successful in 1m23s
Tests / test (3.8) (push) Successful in 1m7s
Tests / test (3.9) (push) Successful in 1m7s
Reviewed-on: #106
2024-05-26 17:53:00 +03:00
52c2e5cc13 Merge pull request 'v3.2.0' (#105) from dev into main
All checks were successful
Tests / test (3.10) (push) Successful in 1m4s
Tests / test (3.11) (push) Successful in 1m2s
Tests / test (3.8) (push) Successful in 1m29s
Tests / test (3.9) (push) Successful in 1m4s
Reviewed-on: #105
2024-05-26 17:29:44 +03:00
55c61e3fce Merge pull request 'v3.1.0' (#102) from dev into main
All checks were successful
Tests / test (3.10) (push) Successful in 55s
Tests / test (3.11) (push) Successful in 55s
Tests / test (3.8) (push) Successful in 57s
Tests / test (3.9) (push) Successful in 1m27s
Reviewed-on: #102
2024-05-19 16:22:17 +03:00
b9550032ba Merge pull request 'Update to 3.0.1' (#98) from dev into main
All checks were successful
Tests / test (3.10) (push) Successful in 57s
Tests / test (3.11) (push) Successful in 54s
Tests / test (3.8) (push) Successful in 1m8s
Tests / test (3.9) (push) Successful in 55s
Reviewed-on: #98
2024-05-15 00:19:03 +03:00
5ba763246b Merge pull request 'Update to 3.0.0' (#52) from dev into main
All checks were successful
Tests / test (3.10) (push) Successful in 1m15s
Tests / test (3.11) (push) Successful in 1m14s
Tests / test (3.8) (push) Successful in 1m14s
Tests / test (3.9) (push) Successful in 1m22s
Reviewed-on: #52
2024-01-04 00:06:50 +02:00
f0ffdf096d Merge pull request 'Pycord support initial release' (#48) from dev into main
All checks were successful
Tests / test (3.10) (push) Successful in 1m8s
Tests / test (3.11) (push) Successful in 1m5s
Tests / test (3.8) (push) Successful in 1m43s
Tests / test (3.9) (push) Successful in 1m3s
Reviewed-on: #48
2023-12-27 15:00:41 +02:00
8 changed files with 50 additions and 20 deletions

View File

@@ -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.

View File

@@ -1,2 +1,2 @@
aiofiles>=23.0.0
typing-extensions~=4.12.2
typing-extensions~=4.13.0

View File

@@ -1,2 +1,2 @@
pymemcache~=4.0.0
redis~=5.2.1
redis~=6.1.0

View File

@@ -2,11 +2,11 @@ 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.0.0
pytest-cov==6.1.1
pytest==8.3.5
tox==4.24.2
tox==4.26.0
twine==6.1.0
types-aiofiles==24.1.0.20241221
types-aiofiles==24.1.0.20250516
types-ujson==5.10.0.20250326

View File

@@ -1,4 +1,4 @@
__version__ = "4.1.0"
__version__ = "4.2.0"
__license__ = "GPL3"
__author__ = "Profitroll"

View File

@@ -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)

View File

@@ -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)

View File

@@ -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.")