diff --git a/__init__.py b/__init__.py index 39f870a..ca10cbb 100644 --- a/__init__.py +++ b/__init__.py @@ -142,28 +142,34 @@ class property_cache_pickle(object): :param default: value to be returned, if key does not exists. :returns: value for a given key or default value. """ - if key in self._source_instance.keys() and key not in self._source_get_keys: - if self._cached_props is None: - self._init_cache() - if self._max_age is None: - cache_old = False + # Init cache + if self._cached_props is None: + self._init_cache() + # Identify old cache + if self._max_age is None: + cache_old = False + else: + cache_old = time.time() - self._cached_props[self.AGE_TAG].get(self._key_filter(key), 0) > self._max_age + if cache_old: + logger.debug("The cached value is old, cached value will be ignored") + # Return cached value + if not cache_old and key not in self._source_get_keys and self._key_filter(key) in self._cached_props[self.DATA_TAG]: + logger.debug("Providing property for '%s' from cache", key) + rv = self._cached_props[self.DATA_TAG].get(self._key_filter(key), default) + if rv is not None or not self._return_source_on_none: + return rv + # Create cache and return value + if key in self._source_instance.keys(): + logger.debug("Loading property for key='%s' from source instance", key) + val = self._source_instance.get(key, None) + if self._store_on_get: + tm = int(time.time()) + logger.debug("Adding key=%s, value=%s with timestamp=%d to chache", key, val, tm) + self._cached_props[self.DATA_TAG][self._key_filter(key)] = val + self._cached_props[self.AGE_TAG][self._key_filter(key)] = tm + self._save_cache() else: - cache_old = time.time() - self._cached_props[self.AGE_TAG].get(self._key_filter(key), 0) > self._max_age - if cache_old: - logger.debug("The cached value is old, cached value will be ignored") - if self._key_filter(key) not in self._cached_props[self.DATA_TAG] or cache_old: - logger.debug("Loading property for key='%s' from source instance", key) - val = self._source_instance.get(key, None) - if self._store_on_get: - tm = int(time.time()) - logger.debug("Adding key=%s, value=%s with timestamp=%d to chache", key, val, tm) - self._cached_props[self.DATA_TAG][self._key_filter(key)] = val - self._cached_props[self.AGE_TAG][self._key_filter(key)] = tm - self._save_cache() - else: - return val - else: - logger.debug("Providing property for '%s' from cache", key) + return val cached_data = self._cached_props[self.DATA_TAG].get(self._key_filter(key), default) if cached_data is None and self._return_source_on_none: return self._source_instance.get(key, default)