Coverage for src / lexigram / contracts / infra / storage / kv.py: 0%
24 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-15 18:57 +0800
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-15 18:57 +0800
1"""Key-Value Storage protocols.
3This module defines the protocols for Key-Value storage backends.
4"""
6from __future__ import annotations
8from enum import StrEnum
9from typing import TYPE_CHECKING, Any, Protocol, runtime_checkable
11if TYPE_CHECKING:
12 from lexigram.contracts.core import HealthCheckResult
15class StorageType(StrEnum):
16 """Types of storage backends."""
18 MEMORY = "memory"
19 FILE = "file"
20 REDIS = "redis"
21 DATABASE = "database"
22 S3 = "s3"
23 OTHER = "other"
26@runtime_checkable
27class StorageBackendProtocol(Protocol):
28 """Protocol for Key-Value storage backends.
30 Defines the interface for simple KV storage operations with
31 support for namespacing and TTL.
32 """
34 @property
35 def storage_type(self) -> StorageType:
36 """Get the type of storage backend."""
37 ...
39 async def connect(self) -> None:
40 """Initialize connection to storage backend."""
41 ...
43 async def disconnect(self) -> None:
44 """Close connection to storage backend."""
45 ...
47 async def get(self, key: str, namespace: str | None = None) -> Any | None:
48 """Get value by key.
50 Args:
51 key: Storage key.
52 namespace: Optional namespace.
54 Returns:
55 Stored value or None if not found.
56 """
57 ...
59 async def set(
60 self,
61 key: str,
62 value: Any,
63 namespace: str | None = None,
64 ttl: int | None = None,
65 ) -> bool:
66 """Set value by key.
68 Args:
69 key: Storage key.
70 value: Value to store (must be serializable).
71 namespace: Optional namespace.
72 ttl: Time-to-live in seconds.
74 Returns:
75 True if successful.
76 """
77 ...
79 async def delete(self, key: str, namespace: str | None = None) -> bool:
80 """Delete value by key.
82 Args:
83 key: Storage key.
84 namespace: Optional namespace.
86 Returns:
87 True if deleted, False if not found.
88 """
89 ...
91 async def exists(self, key: str, namespace: str | None = None) -> bool:
92 """Check if key exists.
94 Args:
95 key: Storage key.
96 namespace: Optional namespace.
98 Returns:
99 True if exists.
100 """
101 ...
103 async def list_keys(
104 self,
105 pattern: str | None = None,
106 namespace: str | None = None,
107 ) -> list[str]:
108 """List keys matching pattern.
110 Args:
111 pattern: Glob-style pattern (e.g., "user:*").
112 namespace: Optional namespace.
114 Returns:
115 List of matching keys.
116 """
117 ...
119 async def clear(self, namespace: str | None = None) -> bool:
120 """Clear all keys in namespace.
122 Args:
123 namespace: Optional namespace.
125 Returns:
126 True if successful.
127 """
128 ...
130 async def health_check(self, timeout: float = 5.0) -> HealthCheckResult:
131 """Check storage health.
133 Returns:
134 Health check result.
135 """
136 ...
139__all__ = ["StorageBackendProtocol", "StorageType"]