class RoboCache(object): def __init__(self, max_age=None, max_count=None): self.data = OrderedDict() self.max_age = max_age self.max_count = max_count def _reduce_age(self, now): """Reduce size of cache by date. :param datetime.datetime now: Current time """ if self.max_age: for key, value in iteritems(self.data): if now - value['date'] > self.max_age: del self.data[key] def _reduce_count(self): """Reduce size of cache by count. """ if self.max_count: while len(self.data) > self.max_count: self.data.popitem(last=False) def store(self, response): """Store response in cache, skipping if code is forbidden. :param requests.Response response: HTTP response """ if response.status_code not in CACHE_CODES: return now = datetime.datetime.now() self.data[response.url] = { 'date': now, 'response': response, } logger.info('Stored response in cache') self._reduce_age(now) self._reduce_count() def retrieve(self, request): """Look up request in cache, skipping if verb is forbidden. :param requests.Request request: HTTP request """ if request.method not in CACHE_VERBS: return try: response = self.data[request.url]['response'] logger.info('Retrieved response from cache') return response except KeyError: return None def clear(self): "Clear cache." self.data = OrderedDict()