You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iTi-Flask/iti/cache/__init__.py

38 lines
1.0 KiB
Python

from __future__ import annotations
import time
from dataclasses import dataclass
from typing import Any
@dataclass
class CacheItem:
value: Any
expires_at: float | None
class CacheManager:
def __init__(self, *, default_timeout: int = 300) -> None:
self.default_timeout = default_timeout
self._items: dict[str, CacheItem] = {}
def get(self, key: str) -> Any:
item = self._items.get(key)
if item is None:
return None
if item.expires_at is not None and item.expires_at < time.time():
self._items.pop(key, None)
return None
return item.value
def set(self, key: str, value: Any, timeout: int | None = None) -> None:
timeout = self.default_timeout if timeout is None else timeout
expires_at = None if timeout <= 0 else time.time() + timeout
self._items[key] = CacheItem(value=value, expires_at=expires_at)
def delete(self, key: str) -> None:
self._items.pop(key, None)
def clear(self) -> None:
self._items.clear()