Show More
@@ -1311,8 +1311,19 b' class lrucachedict(object):' | |||
|
1311 | 1311 | |
|
1312 | 1312 | self._cache.clear() |
|
1313 | 1313 | |
|
1314 | def copy(self): | |
|
1315 | result = lrucachedict(self.capacity) | |
|
1314 | def copy(self, capacity=None): | |
|
1315 | """Create a new cache as a copy of the current one. | |
|
1316 | ||
|
1317 | By default, the new cache has the same capacity as the existing one. | |
|
1318 | But, the cache capacity can be changed as part of performing the | |
|
1319 | copy. | |
|
1320 | ||
|
1321 | Items in the copy have an insertion/access order matching this | |
|
1322 | instance. | |
|
1323 | """ | |
|
1324 | ||
|
1325 | capacity = capacity or self.capacity | |
|
1326 | result = lrucachedict(capacity) | |
|
1316 | 1327 | |
|
1317 | 1328 | # We copy entries by iterating in oldest-to-newest order so the copy |
|
1318 | 1329 | # has the correct ordering. |
@@ -1322,6 +1333,8 b' class lrucachedict(object):' | |||
|
1322 | 1333 | while n.key is _notset and n is not self._head: |
|
1323 | 1334 | n = n.prev |
|
1324 | 1335 | |
|
1336 | # We could potentially skip the first N items when decreasing capacity. | |
|
1337 | # But let's keep it simple unless it is a performance problem. | |
|
1325 | 1338 | for i in range(len(self._cache)): |
|
1326 | 1339 | result[n.key] = n.value |
|
1327 | 1340 | n = n.prev |
@@ -118,5 +118,59 b' class testlrucachedict(unittest.TestCase' | |||
|
118 | 118 | for key in ('a', 'b', 'c', 'd'): |
|
119 | 119 | self.assertEqual(d[key], 'v%s' % key) |
|
120 | 120 | |
|
121 | def testcopydecreasecapacity(self): | |
|
122 | d = util.lrucachedict(5) | |
|
123 | d['a'] = 'va' | |
|
124 | d['b'] = 'vb' | |
|
125 | d['c'] = 'vc' | |
|
126 | d['d'] = 'vd' | |
|
127 | ||
|
128 | dc = d.copy(2) | |
|
129 | for key in ('a', 'b'): | |
|
130 | self.assertNotIn(key, dc) | |
|
131 | for key in ('c', 'd'): | |
|
132 | self.assertIn(key, dc) | |
|
133 | self.assertEqual(dc[key], 'v%s' % key) | |
|
134 | ||
|
135 | dc['e'] = 've' | |
|
136 | self.assertNotIn('c', dc) | |
|
137 | for key in ('d', 'e'): | |
|
138 | self.assertIn(key, dc) | |
|
139 | self.assertEqual(dc[key], 'v%s' % key) | |
|
140 | ||
|
141 | # Original should remain unchanged. | |
|
142 | for key in ('a', 'b', 'c', 'd'): | |
|
143 | self.assertIn(key, d) | |
|
144 | self.assertEqual(d[key], 'v%s' % key) | |
|
145 | ||
|
146 | def testcopyincreasecapacity(self): | |
|
147 | d = util.lrucachedict(5) | |
|
148 | d['a'] = 'va' | |
|
149 | d['b'] = 'vb' | |
|
150 | d['c'] = 'vc' | |
|
151 | d['d'] = 'vd' | |
|
152 | ||
|
153 | dc = d.copy(6) | |
|
154 | for key in ('a', 'b', 'c', 'd'): | |
|
155 | self.assertIn(key, dc) | |
|
156 | self.assertEqual(dc[key], 'v%s' % key) | |
|
157 | ||
|
158 | dc['e'] = 've' | |
|
159 | dc['f'] = 'vf' | |
|
160 | for key in ('a', 'b', 'c', 'd', 'e', 'f'): | |
|
161 | self.assertIn(key, dc) | |
|
162 | self.assertEqual(dc[key], 'v%s' % key) | |
|
163 | ||
|
164 | dc['g'] = 'vg' | |
|
165 | self.assertNotIn('a', dc) | |
|
166 | for key in ('b', 'c', 'd', 'e', 'f', 'g'): | |
|
167 | self.assertIn(key, dc) | |
|
168 | self.assertEqual(dc[key], 'v%s' % key) | |
|
169 | ||
|
170 | # Original should remain unchanged. | |
|
171 | for key in ('a', 'b', 'c', 'd'): | |
|
172 | self.assertIn(key, d) | |
|
173 | self.assertEqual(d[key], 'v%s' % key) | |
|
174 | ||
|
121 | 175 | if __name__ == '__main__': |
|
122 | 176 | silenttestrunner.main(__name__) |
General Comments 0
You need to be logged in to leave comments.
Login now