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.
@@ -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,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.31.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any