##// END OF EJS Templates
util: add a popoldest() method to lrucachedict...
Gregory Szorc -
r39602:bd9d3a89 default
parent child Browse files
Show More
@@ -1341,6 +1341,28 b' class lrucachedict(object):'
1341
1341
1342 return result
1342 return result
1343
1343
1344 def popoldest(self):
1345 """Remove the oldest item from the cache.
1346
1347 Returns the (key, value) describing the removed cache entry.
1348 """
1349 if not self._cache:
1350 return
1351
1352 # Walk the linked list backwards starting at tail node until we hit
1353 # a non-empty node.
1354 n = self._head.prev
1355 while n.key is _notset:
1356 n = n.prev
1357
1358 key, value = n.key, n.value
1359
1360 # And remove it from the cache and mark it as empty.
1361 del self._cache[n.key]
1362 n.markempty()
1363
1364 return key, value
1365
1344 def _movetohead(self, node):
1366 def _movetohead(self, node):
1345 """Mark a node as the newest, making it the new head.
1367 """Mark a node as the newest, making it the new head.
1346
1368
@@ -172,5 +172,30 b' class testlrucachedict(unittest.TestCase'
172 self.assertIn(key, d)
172 self.assertIn(key, d)
173 self.assertEqual(d[key], 'v%s' % key)
173 self.assertEqual(d[key], 'v%s' % key)
174
174
175 def testpopoldest(self):
176 d = util.lrucachedict(4)
177 d['a'] = 'va'
178 d['b'] = 'vb'
179
180 self.assertEqual(len(d), 2)
181 self.assertEqual(d.popoldest(), ('a', 'va'))
182 self.assertEqual(len(d), 1)
183 self.assertEqual(d.popoldest(), ('b', 'vb'))
184 self.assertEqual(len(d), 0)
185 self.assertIsNone(d.popoldest())
186
187 d['a'] = 'va'
188 d['b'] = 'vb'
189 d['c'] = 'vc'
190 d['d'] = 'vd'
191
192 self.assertEqual(d.popoldest(), ('a', 'va'))
193 self.assertEqual(len(d), 3)
194 for key in ('b', 'c', 'd'):
195 self.assertEqual(d[key], 'v%s' % key)
196
197 d['a'] = 'va'
198 self.assertEqual(d.popoldest(), ('b', 'vb'))
199
175 if __name__ == '__main__':
200 if __name__ == '__main__':
176 silenttestrunner.main(__name__)
201 silenttestrunner.main(__name__)
General Comments 0
You need to be logged in to leave comments. Login now