From f02b46d60453d40feb8f5e34f828899bb9d2f22c Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sat, 10 Oct 2020 15:06:58 +0200 Subject: [PATCH] BaseUtils: added MultiCacheKeyService.py --- .../MultiCacheKeyService.py | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py diff --git a/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py b/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py new file mode 100644 index 0000000..0228b8d --- /dev/null +++ b/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py @@ -0,0 +1,40 @@ +import abc +from abc import ABC +from dataclasses import dataclass +from datetime import datetime +from typing import Dict + + +@dataclass +class CacheEntry: + key: str + lastFetchTimestamp: float + settings: Dict + cachedData: Dict + + +class MultiCacheKeyService(ABC): + def __init__(self, fetchThresholdInSeconds: int): + self._fetchThresholdInSeconds = fetchThresholdInSeconds + self._cache = {} + + def get_data(self, cacheKey: str, settings: Dict) -> Dict: + if cacheKey not in self._cache: + self._cache[cacheKey] = CacheEntry(cacheKey, datetime.now().timestamp(), settings, {}) + + cacheEntry = self._cache[cacheKey] + if self.__is_data_obsolete(cacheEntry): + cacheEntry.cachedData = self._fetch_data(cacheEntry.settings) + return cacheEntry.cachedData + + def __is_data_obsolete(self, cacheEntry: CacheEntry) -> bool: + now = datetime.now().timestamp() + if (now - cacheEntry.lastFetchTimestamp) > self._fetchThresholdInSeconds: + cacheEntry.lastFetchTimestamp = now + return True + + return False + + @abc.abstractmethod + def _fetch_data(self, settings: Dict) -> Dict: + pass -- GitLab