Skip to content

Remove MemoryCache #101

@alukach

Description

@alukach

stac-auth-proxy shouldn't be responsible for caching values.

@dataclass
class MemoryCache:
"""Cache results of a method call for a given key."""
ttl: float = 5.0
cache: dict[tuple[Any], tuple[Any, float]] = field(default_factory=dict)
_last_pruned: float = field(default_factory=time)
def __getitem__(self, key: Any) -> Any:
"""Get a value from the cache if it is not expired."""
if key not in self.cache:
msg = f"{self._key_str(key)!r} not in cache."
logger.debug(msg)
raise KeyError(msg)
result, timestamp = self.cache[key]
if (time() - timestamp) > self.ttl:
msg = f"{self._key_str(key)!r} in cache, but expired."
del self.cache[key]
logger.debug(msg)
raise KeyError(f"{key} expired")
logger.debug(f"{self._key_str(key)} in cache, returning cached result.")
return result
def __setitem__(self, key: Any, value: Any):
"""Set a value in the cache."""
self.cache[key] = (value, time())
self._prune()
def __contains__(self, key: Any) -> bool:
"""Check if a key is in the cache and is not expired."""
try:
self[key]
return True
except KeyError:
return False
def get(self, key: Any) -> Any:
"""Get a value from the cache."""
try:
return self[key]
except KeyError:
return None
def _prune(self):
"""Prune the cache of expired items."""
if time() - self._last_pruned < self.ttl:
return
self.cache = {
k: (v, time_entered)
for k, (v, time_entered) in self.cache.items()
if time_entered > (time() - self.ttl)
}
self._last_pruned = time()
@staticmethod
def _key_str(key: Any) -> str:
"""Get a string representation of a key."""
return key if len(str(key)) < 10 else f"{str(key)[:9]}..."

Instead, we should direct users to modules such as cachetools

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions