evoid-redis 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
evoid_redis/__init__.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Redis Cache Engine for EVOID.
|
|
2
|
+
|
|
3
|
+
IOP: Plugin registry pattern — register, resolve, use.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import json
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from evoid.engines.plugin import register
|
|
12
|
+
|
|
13
|
+
MANIFEST = {
|
|
14
|
+
"name": "evoid-redis",
|
|
15
|
+
"version": "0.1.0",
|
|
16
|
+
"type": "engine",
|
|
17
|
+
"description": "Redis cache engine for EVOID",
|
|
18
|
+
"entry_point": "evoid_redis:register_plugin",
|
|
19
|
+
"dependencies": ["redis[hiredis]>=5.0.0"],
|
|
20
|
+
"evoid_version": ">=0.4.0",
|
|
21
|
+
"tags": ["cache", "redis"],
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class RedisCache:
|
|
26
|
+
"""Redis-backed cache engine."""
|
|
27
|
+
|
|
28
|
+
def __init__(self, url: str = "redis://localhost:6379", prefix: str = "evoid:"):
|
|
29
|
+
self.url = url
|
|
30
|
+
self.prefix = prefix
|
|
31
|
+
self._client = None
|
|
32
|
+
|
|
33
|
+
async def _get_client(self):
|
|
34
|
+
if self._client is None:
|
|
35
|
+
import redis.asyncio as aioredis
|
|
36
|
+
self._client = aioredis.from_url(self.url, decode_responses=True)
|
|
37
|
+
return self._client
|
|
38
|
+
|
|
39
|
+
def _key(self, key: str) -> str:
|
|
40
|
+
return f"{self.prefix}{key}"
|
|
41
|
+
|
|
42
|
+
async def get(self, key: str) -> Any | None:
|
|
43
|
+
client = await self._get_client()
|
|
44
|
+
raw = await client.get(self._key(key))
|
|
45
|
+
if raw is None:
|
|
46
|
+
return None
|
|
47
|
+
try:
|
|
48
|
+
return json.loads(raw)
|
|
49
|
+
except (json.JSONDecodeError, TypeError):
|
|
50
|
+
return raw
|
|
51
|
+
|
|
52
|
+
async def set(self, key: str, value: Any, ttl: int | None = None) -> bool:
|
|
53
|
+
client = await self._get_client()
|
|
54
|
+
data = json.dumps(value) if not isinstance(value, str) else value
|
|
55
|
+
if ttl:
|
|
56
|
+
await client.setex(self._key(key), ttl, data)
|
|
57
|
+
else:
|
|
58
|
+
await client.set(self._key(key), data)
|
|
59
|
+
return True
|
|
60
|
+
|
|
61
|
+
async def delete(self, key: str) -> bool:
|
|
62
|
+
client = await self._get_client()
|
|
63
|
+
result = await client.delete(self._key(key))
|
|
64
|
+
return result > 0
|
|
65
|
+
|
|
66
|
+
async def exists(self, key: str) -> bool:
|
|
67
|
+
client = await self._get_client()
|
|
68
|
+
return await client.exists(self._key(key)) > 0
|
|
69
|
+
|
|
70
|
+
async def health(self) -> bool:
|
|
71
|
+
try:
|
|
72
|
+
client = await self._get_client()
|
|
73
|
+
return await client.ping()
|
|
74
|
+
except Exception:
|
|
75
|
+
return False
|
|
76
|
+
|
|
77
|
+
async def close(self):
|
|
78
|
+
if self._client:
|
|
79
|
+
await self._client.close()
|
|
80
|
+
self._client = None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def create_cache(url: str = "redis://localhost:6379", prefix: str = "evoid:") -> RedisCache:
|
|
84
|
+
"""Factory: create a Redis cache instance."""
|
|
85
|
+
return RedisCache(url=url, prefix=prefix)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def register_plugin():
|
|
89
|
+
"""Called when the plugin is loaded."""
|
|
90
|
+
register(
|
|
91
|
+
name="redis",
|
|
92
|
+
type="engine",
|
|
93
|
+
factory=create_cache,
|
|
94
|
+
version="0.1.0",
|
|
95
|
+
description="Redis cache engine for EVOID",
|
|
96
|
+
)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "evoid-redis",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "engine",
|
|
5
|
+
"description": "Redis cache engine for EVOID",
|
|
6
|
+
"entry_point": "evoid_redis:register_plugin",
|
|
7
|
+
"dependencies": ["redis[hiredis]>=5.0.0"],
|
|
8
|
+
"evoid_version": ">=0.4.0",
|
|
9
|
+
"tags": ["cache", "redis"]
|
|
10
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: evoid-redis
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Redis cache engine for EVOID
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Requires-Python: >=3.12
|
|
7
|
+
Requires-Dist: evoid>=0.4.0
|
|
8
|
+
Requires-Dist: redis[hiredis]>=5.0.0
|
|
9
|
+
Provides-Extra: dev
|
|
10
|
+
Requires-Dist: pytest; extra == 'dev'
|
|
11
|
+
Requires-Dist: pytest-asyncio; extra == 'dev'
|
|
12
|
+
Requires-Dist: ruff; extra == 'dev'
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
evoid_redis/__init__.py,sha256=fKKUWaqmWi9IFRi5UF4atU4Ej_FisziiOJijav7C9BQ,2744
|
|
2
|
+
evoid_redis/evoid_plugin.json,sha256=s2aUKtOSakHEghdnYOaAIo9ROGiTX1VN5XdAJ06pVwI,272
|
|
3
|
+
evoid_redis-0.1.0.dist-info/METADATA,sha256=Ztvw0aeQVfDKcmfsVXhY8ar_PieZUgExSujcsjMh8hQ,346
|
|
4
|
+
evoid_redis-0.1.0.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
|
|
5
|
+
evoid_redis-0.1.0.dist-info/RECORD,,
|