Source code for memcachio.types

from __future__ import annotations

from collections.abc import Sequence
from dataclasses import dataclass
from pathlib import Path
from typing import AnyStr, Generic, NamedTuple, TypeGuard, cast

#: Acceptable types for a memcached key
KeyT = str | bytes
#: Acceptable types for values to store
ValueT = str | bytes | int


[docs] class TCPEndpoint(NamedTuple): """ Location of a memcached server listening on a tcp port """ #: IPV4/6 host address host: str #: IPV4/6 port port: int
#: Path to a memcached server listening on a UDS socket UnixSocketEndpoint = str | Path
[docs] class AWSAutoDiscoveryEndpoint(NamedTuple): """ Location of a memcached auto-discovery endpoint for use with AWS Elasticache """ #: IPV4/6 host address host: str #: IPV4/6 port port: int #: How often to trigger a refresh to check for updates refresh_interval: float
#: The total description of a single memcached instance SingleMemcachedInstanceEndpoint = UnixSocketEndpoint | TCPEndpoint | tuple[str, int] #: The total description of either a single memcached instance or a memcached cluster MemcachedEndpoint = ( SingleMemcachedInstanceEndpoint | Sequence[SingleMemcachedInstanceEndpoint] | AWSAutoDiscoveryEndpoint )
[docs] @dataclass class MemcachedItem(Generic[AnyStr]): """ Data class returned by retrieval commands such as :meth:`~memcachio.Client.get`, :meth:`~memcachio.Client.gets`, :meth:`~memcachio.Client.gat` and :meth:`~memcachio.Client.gats` """ #: The key of the item key: AnyStr #: Any flags set on the item flags: int #: The size (in bytes) of the data stored in the item size: int #: The CAS value for the item if retrieved cas: int | None #: The data value of the item value: AnyStr
def is_single_server(endpoint: MemcachedEndpoint) -> TypeGuard[SingleMemcachedInstanceEndpoint]: if isinstance(endpoint, AWSAutoDiscoveryEndpoint): return False if isinstance(endpoint, (UnixSocketEndpoint, TCPEndpoint)): return True if ( isinstance(endpoint, Sequence) and len(endpoint) == 2 and isinstance(endpoint[0], str) and isinstance(endpoint[1], int) ): return True return False def normalize_single_server_endpoint( endpoint: SingleMemcachedInstanceEndpoint, ) -> SingleMemcachedInstanceEndpoint: if not isinstance(endpoint, UnixSocketEndpoint): return TCPEndpoint(*endpoint) return endpoint def normalize_endpoint(endpoint: MemcachedEndpoint) -> MemcachedEndpoint: if is_single_server(endpoint): return normalize_single_server_endpoint(endpoint) elif isinstance(endpoint, AWSAutoDiscoveryEndpoint): return endpoint else: return [ normalize_single_server_endpoint(single) for single in cast(Sequence[SingleMemcachedInstanceEndpoint], endpoint) ]