Package logilab-common-0 :: Package 39 :: Package 0 :: Module cache
[frames] | no frames]

Source Code for Module logilab-common-0.39.0.cache

 1  """Cache module, with a least recently used algorithm for the management of the 
 2  deletion of entries. 
 3   
 4  :copyright: 2002-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved. 
 5  :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr 
 6  :license: General Public License version 2 - http://www.gnu.org/licenses 
 7  """ 
 8  __docformat__ = "restructuredtext en" 
 9   
10  from threading import Lock 
11   
12  from logilab.common.decorators import locked 
13   
14  _marker = object() 
15   
16 -class Cache(dict):
17 """A dictionnary like cache. 18 19 inv: 20 len(self._usage) <= self.size 21 len(self.data) <= self.size 22 """ 23
24 - def __init__(self, size=100):
25 """ Warning : Cache.__init__() != dict.__init__(). 26 Constructor does not take any arguments beside size. 27 """ 28 assert size >= 0, 'cache size must be >= 0 (0 meaning no caching)' 29 self.size = size 30 self._usage = [] 31 self._lock = Lock() 32 super(Cache, self).__init__()
33
34 - def _acquire(self):
35 self._lock.acquire()
36
37 - def _release(self):
38 self._lock.release()
39
40 - def _update_usage(self, key):
41 if not self._usage: 42 self._usage.append(key) 43 elif self._usage[-1] != key: 44 try: 45 self._usage.remove(key) 46 except ValueError: 47 # we are inserting a new key 48 # check the size of the dictionnary 49 # and remove the oldest item in the cache 50 if self.size and len(self._usage) >= self.size: 51 super(Cache, self).__delitem__(self._usage[0]) 52 del self._usage[0] 53 self._usage.append(key) 54 else: 55 pass # key is already the most recently used key
56
57 - def __getitem__(self, key):
58 value = super(Cache, self).__getitem__(key) 59 self._update_usage(key) 60 return value
61 __getitem__ = locked(_acquire, _release)(__getitem__) 62
63 - def __setitem__(self, key, item):
64 # Just make sure that size > 0 before inserting a new item in the cache 65 if self.size > 0: 66 super(Cache, self).__setitem__(key, item) 67 self._update_usage(key)
68 __setitem__ = locked(_acquire, _release)(__setitem__) 69
70 - def __delitem__(self, key):
71 super(Cache, self).__delitem__(key) 72 self._usage.remove(key)
73 __delitem__ = locked(_acquire, _release)(__delitem__) 74
75 - def clear(self):
76 super(Cache, self).clear() 77 self._usage = []
78 clear = locked(_acquire, _release)(clear) 79
80 - def pop(self, key, default=_marker):
81 if key in self: 82 self._usage.remove(key) 83 #if default is _marker: 84 # return super(Cache, self).pop(key) 85 return super(Cache, self).pop(key, default)
86 pop = locked(_acquire, _release)(pop) 87
88 - def popitem(self):
89 raise NotImplementedError()
90
91 - def setdefault(self, key, default=None):
92 raise NotImplementedError()
93
94 - def update(self, other):
95 raise NotImplementedError()
96