Source code for memoize.entrybuilder

"""
[API] Provides interface (and built-in implementations)
how cache entries should be constructed (responsibility of expiry & update after times lies here).
This interface is used in cache configuration.
"""

import datetime
from abc import ABCMeta, abstractmethod

from memoize.entry import CacheKey, CachedValue, CacheEntry


[docs]class CacheEntryBuilder(metaclass=ABCMeta):
[docs] @abstractmethod def build(self, key: CacheKey, value: CachedValue) -> CacheEntry: """Constructs cache entry object (sets creation time, can transform value, governs update/expiration times).""" raise NotImplementedError()
[docs]class ProvidedLifeSpanCacheEntryBuilder(CacheEntryBuilder): """CacheEntryBuilder which uses constant delays independent form values that are cached""" def __init__(self, update_after: datetime.timedelta = datetime.timedelta(minutes=10), expire_after: datetime.timedelta = datetime.timedelta(minutes=30)) -> None: """ Builder that sets update/expire times using provided constants. :param datetime.timedelta update_after: when background/async updates should start; default = 10 minutes :param datetime.timedelta expire_after: when entry starts being out-of-date; default = 30 minutes """ self._expires_after = expire_after self._update_after = update_after
[docs] def update_timeouts(self, update_after: datetime.timedelta, expire_after: datetime.timedelta) -> None: self._expires_after = expire_after self._update_after = update_after
[docs] def build(self, key: CacheKey, value: CachedValue) -> CacheEntry: now = datetime.datetime.utcnow() return CacheEntry(created=now, update_after=now + self._update_after, expires_after=now + self._expires_after, value=value)
def __str__(self) -> str: return "{}[update_after={},expire_after={}]".format(self.__class__, self._update_after, self._expires_after)