cledar-sdk 2.1.0__py3-none-any.whl → 2.1.1__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.
- cledar/redis/redis.py +45 -6
- {cledar_sdk-2.1.0.dist-info → cledar_sdk-2.1.1.dist-info}/METADATA +1 -1
- {cledar_sdk-2.1.0.dist-info → cledar_sdk-2.1.1.dist-info}/RECORD +5 -5
- {cledar_sdk-2.1.0.dist-info → cledar_sdk-2.1.1.dist-info}/WHEEL +0 -0
- {cledar_sdk-2.1.0.dist-info → cledar_sdk-2.1.1.dist-info}/licenses/LICENSE +0 -0
cledar/redis/redis.py
CHANGED
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
|
-
|
|
5
|
+
import urllib.parse
|
|
6
6
|
from datetime import datetime
|
|
7
7
|
from enum import Enum
|
|
8
8
|
from typing import Any, TypeVar, cast
|
|
9
9
|
|
|
10
10
|
import redis
|
|
11
11
|
import redis.asyncio as aioredis
|
|
12
|
-
from pydantic import BaseModel, ValidationError
|
|
12
|
+
from pydantic import BaseModel, ConfigDict, ValidationError
|
|
13
|
+
from pydantic.dataclasses import dataclass
|
|
13
14
|
|
|
14
15
|
from .exceptions import (
|
|
15
16
|
RedisConnectionError,
|
|
@@ -44,7 +45,7 @@ class CustomEncoder(json.JSONEncoder):
|
|
|
44
45
|
T = TypeVar("T", bound=BaseModel)
|
|
45
46
|
|
|
46
47
|
|
|
47
|
-
@dataclass
|
|
48
|
+
@dataclass(config=ConfigDict(arbitrary_types_allowed=True))
|
|
48
49
|
class FailedValue:
|
|
49
50
|
"""Represents a failed Redis operation for a specific key."""
|
|
50
51
|
|
|
@@ -54,12 +55,50 @@ class FailedValue:
|
|
|
54
55
|
|
|
55
56
|
@dataclass
|
|
56
57
|
class RedisServiceConfig:
|
|
57
|
-
"""Configuration for Redis services.
|
|
58
|
+
"""Configuration for Redis services.
|
|
59
|
+
|
|
60
|
+
Supports two initialization modes:
|
|
61
|
+
1. Pass redis_url to parse connection details from a URL
|
|
62
|
+
2. Pass individual connection parameters (redis_host, redis_port, etc.)
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
redis_url: Redis connection URL (e.g., redis://:password@host:port/db).
|
|
66
|
+
If provided, individual parameters are ignored.
|
|
67
|
+
redis_host: Redis host address.
|
|
68
|
+
redis_port: Redis port number.
|
|
69
|
+
redis_db: Redis database number (default: 0).
|
|
70
|
+
redis_password: Redis password (optional).
|
|
58
71
|
|
|
59
|
-
|
|
60
|
-
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
redis_host: str = ""
|
|
75
|
+
redis_port: int = 0
|
|
61
76
|
redis_db: int = 0
|
|
62
77
|
redis_password: str | None = None
|
|
78
|
+
redis_url: str | None = None
|
|
79
|
+
|
|
80
|
+
def __post_init__(self) -> None:
|
|
81
|
+
"""Parse redis_url if provided, otherwise validate individual parameters.
|
|
82
|
+
|
|
83
|
+
Raises:
|
|
84
|
+
ValueError: When neither redis_url nor redis_host/redis_port are provided.
|
|
85
|
+
|
|
86
|
+
"""
|
|
87
|
+
if self.redis_url:
|
|
88
|
+
parsed = urllib.parse.urlparse(self.redis_url)
|
|
89
|
+
self.redis_host = parsed.hostname or ""
|
|
90
|
+
self.redis_port = parsed.port or 6379
|
|
91
|
+
self.redis_db = (
|
|
92
|
+
int(parsed.path.lstrip("/")) if parsed.path.lstrip("/") else 0
|
|
93
|
+
)
|
|
94
|
+
self.redis_password = parsed.password
|
|
95
|
+
else:
|
|
96
|
+
if not self.redis_host or not self.redis_port:
|
|
97
|
+
msg = (
|
|
98
|
+
"Either redis_url or both redis_host and redis_port must be "
|
|
99
|
+
"provided"
|
|
100
|
+
)
|
|
101
|
+
raise ValueError(msg)
|
|
63
102
|
|
|
64
103
|
|
|
65
104
|
class RedisService:
|
|
@@ -60,7 +60,7 @@ cledar/redis/example.py,sha256=J1R9Um4jd3MXp8lFftVbLZyorwg2Q_cKyh7sIRGhFj0,1757
|
|
|
60
60
|
cledar/redis/exceptions.py,sha256=C_5LJ9CsOT2VWqnX-eTmMgTzyT1AyIzjMvrpsSfOdn0,790
|
|
61
61
|
cledar/redis/logger.py,sha256=opRHMp546sjaFrlIOZ7OM6Jyc8OMR65GLenqnBBzu1I,110
|
|
62
62
|
cledar/redis/model.py,sha256=6smQWMMc9dFeronUX3ZiiSeB3Yo0UXWQfct-2SY-2eg,288
|
|
63
|
-
cledar/redis/redis.py,sha256=
|
|
63
|
+
cledar/redis/redis.py,sha256=kvebNW7l9fKoXP10YemZUcP528xVBD7j74A6TE8MiFw,27771
|
|
64
64
|
cledar/redis/redis_config_store.py,sha256=74sjPSozWl8Si488N0ulvlqgLG5xj-A9KAeMGaLiY5k,10915
|
|
65
65
|
cledar/redis/tests/test_async_integration_redis.py,sha256=DHwZusY6rdRHaOt_lPzmB4buq7GKH-4xTjSbiIWggFY,4981
|
|
66
66
|
cledar/redis/tests/test_async_redis_service.py,sha256=uxmpNQt-eCuS3MVW3Iw-zWKy_BykpmCAU6ab5BlClBE,12474
|
|
@@ -78,7 +78,7 @@ cledar/storage/tests/test_integration_filesystem.py,sha256=TERmSJrw043S99fYE3xgE
|
|
|
78
78
|
cledar/storage/tests/test_integration_s3.py,sha256=yl85bSW-QcaxCL8GVcXE6XXZe8Mrk65JZZDtNaGma4Y,13611
|
|
79
79
|
cledar/storage/tests/test_local.py,sha256=ZT5EcBI7CzzviGJnadSTi8eSKOH9ntgk5UtmFG4GArU,11253
|
|
80
80
|
cledar/storage/tests/test_s3.py,sha256=_ZuER9IWJSN-MEkTg83iRLqw9WvECkSBYQUTg81Na8U,16352
|
|
81
|
-
cledar_sdk-2.1.
|
|
82
|
-
cledar_sdk-2.1.
|
|
83
|
-
cledar_sdk-2.1.
|
|
84
|
-
cledar_sdk-2.1.
|
|
81
|
+
cledar_sdk-2.1.1.dist-info/METADATA,sha256=ecC1FSy7N12QriaqytJb_GTjUTYftiOYIrNbVzb2bSo,6733
|
|
82
|
+
cledar_sdk-2.1.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
83
|
+
cledar_sdk-2.1.1.dist-info/licenses/LICENSE,sha256=Pz2eACSxkhsGfW9_iN60pgy-enjnbGTj8df8O3ebnQQ,16726
|
|
84
|
+
cledar_sdk-2.1.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|