lru-dict
Advanced tools
| Metadata-Version: 1.1 | ||
| Name: lru-dict | ||
| Version: 1.1.6 | ||
| Version: 1.1.7 | ||
| Summary: An Dict like LRU container. | ||
@@ -9,3 +9,6 @@ Home-page: https://github.com/amitdev/lru-dict | ||
| License: MIT | ||
| Description: LRU Dict | ||
| Description: .. image:: https://travis-ci.com/amitdev/lru-dict.svg?branch=master | ||
| :target: https://travis-ci.com/amitdev/lru-dict | ||
| LRU Dict | ||
| ======== | ||
@@ -12,0 +15,0 @@ |
+94
-0
@@ -393,2 +393,57 @@ #include <Python.h> | ||
| static PyObject * | ||
| LRU_setdefault(LRU *self, PyObject *args) | ||
| { | ||
| PyObject *key; | ||
| PyObject *default_obj = NULL; | ||
| PyObject *result; | ||
| if (!PyArg_ParseTuple(args, "O|O", &key, &default_obj)) | ||
| return NULL; | ||
| result = lru_subscript(self, key); | ||
| PyErr_Clear(); | ||
| if (result) | ||
| return result; | ||
| if (!default_obj) | ||
| default_obj = Py_None; | ||
| if (lru_ass_sub(self, key, default_obj) != 0) | ||
| return NULL; | ||
| Py_INCREF(default_obj); | ||
| return default_obj; | ||
| } | ||
| static PyObject * | ||
| LRU_pop(LRU *self, PyObject *args) | ||
| { | ||
| PyObject *key; | ||
| PyObject *default_obj = NULL; | ||
| PyObject *result; | ||
| if (!PyArg_ParseTuple(args, "O|O", &key, &default_obj)) | ||
| return NULL; | ||
| /* Trying to access the item by key. */ | ||
| result = lru_subscript(self, key); | ||
| if (result) | ||
| /* result != NULL, delete it from dict by key */ | ||
| lru_ass_sub(self, key, NULL); | ||
| else if (default_obj) { | ||
| /* result == NULL, i.e. key missing, and default_obj given */ | ||
| PyErr_Clear(); | ||
| Py_INCREF(default_obj); | ||
| result = default_obj; | ||
| } | ||
| /* Otherwise (key missing, and default_obj not given [i.e. == NULL]), the | ||
| * call to lru_subscript (at the location marked by "Trying to access the | ||
| * item by key" in the comments) has already generated the appropriate | ||
| * exception. */ | ||
| return result; | ||
| } | ||
| static PyObject * | ||
| LRU_peek_first_item(LRU *self) | ||
@@ -422,2 +477,35 @@ { | ||
| static PyObject * | ||
| LRU_popitem(LRU *self, PyObject *args, PyObject *kwds) | ||
| { | ||
| static char *kwlist[] = {"least_recent", NULL}; | ||
| int pop_least_recent = 1; | ||
| PyObject *result; | ||
| #if PY_MAJOR_VERSION >= 3 | ||
| if (!PyArg_ParseTupleAndKeywords(args, kwds, "|p", kwlist, &pop_least_recent)) | ||
| return NULL; | ||
| #else | ||
| { | ||
| PyObject *arg_ob = Py_True; | ||
| if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist, &arg_ob)) | ||
| return NULL; | ||
| pop_least_recent = PyObject_IsTrue(arg_ob); | ||
| if (pop_least_recent == -1) | ||
| return NULL; | ||
| } | ||
| #endif | ||
| if (pop_least_recent) | ||
| result = LRU_peek_last_item(self); | ||
| else | ||
| result = LRU_peek_first_item(self); | ||
| if (result == Py_None) { | ||
| PyErr_SetString(PyExc_KeyError, "popitem(): LRU dict is empty"); | ||
| return NULL; | ||
| } | ||
| lru_ass_sub(self, PyTuple_GET_ITEM(result, 0), NULL); | ||
| Py_INCREF(result); | ||
| return result; | ||
| } | ||
| static PyObject * | ||
| LRU_keys(LRU *self) { | ||
@@ -539,2 +627,8 @@ return collect(self, get_key); | ||
| PyDoc_STR("L.get(key, instead) -> If L has key return its value, otherwise instead")}, | ||
| {"setdefault", (PyCFunction)LRU_setdefault, METH_VARARGS, | ||
| PyDoc_STR("L.setdefault(key, default=None) -> If L has key return its value, otherwise insert key with a value of default and return default")}, | ||
| {"pop", (PyCFunction)LRU_pop, METH_VARARGS, | ||
| PyDoc_STR("L.pop(key[, default]) -> If L has key return its value and remove it from L, otherwise return default. If default is not given and key is not in L, a KeyError is raised.")}, | ||
| {"popitem", (PyCFunctionWithKeywords)LRU_popitem, METH_VARARGS | METH_KEYWORDS, | ||
| PyDoc_STR("L.popitem([least_recent=True]) -> Returns and removes a (key, value) pair. The pair returned is the least-recently used if least_recent is true, or the most-recently used if false.")}, | ||
| {"set_size", (PyCFunction)LRU_set_size, METH_VARARGS, | ||
@@ -541,0 +635,0 @@ PyDoc_STR("L.set_size() -> set size of LRU")}, |
+5
-2
| Metadata-Version: 1.1 | ||
| Name: lru-dict | ||
| Version: 1.1.6 | ||
| Version: 1.1.7 | ||
| Summary: An Dict like LRU container. | ||
@@ -9,3 +9,6 @@ Home-page: https://github.com/amitdev/lru-dict | ||
| License: MIT | ||
| Description: LRU Dict | ||
| Description: .. image:: https://travis-ci.com/amitdev/lru-dict.svg?branch=master | ||
| :target: https://travis-ci.com/amitdev/lru-dict | ||
| LRU Dict | ||
| ======== | ||
@@ -12,0 +15,0 @@ |
+3
-0
@@ -0,1 +1,4 @@ | ||
| .. image:: https://travis-ci.com/amitdev/lru-dict.svg?branch=master | ||
| :target: https://travis-ci.com/amitdev/lru-dict | ||
| LRU Dict | ||
@@ -2,0 +5,0 @@ ======== |
+0
-1
| [egg_info] | ||
| tag_build = | ||
| tag_date = 0 | ||
| tag_svn_revision = 0 | ||
+1
-1
@@ -7,3 +7,3 @@ from setuptools import setup, Extension | ||
| setup (name = 'lru-dict', | ||
| version = '1.1.6', | ||
| version = '1.1.7', | ||
| description = 'An Dict like LRU container.', | ||
@@ -10,0 +10,0 @@ long_description = open('README.rst').read(), |
+85
-29
@@ -12,2 +12,3 @@ import gc | ||
| class TestLRU(unittest.TestCase): | ||
@@ -44,3 +45,3 @@ | ||
| l[i] = str(i) | ||
| self._check_kvi(range(size-1,-1,-1), l) | ||
| self._check_kvi(range(size - 1, -1, -1), l) | ||
@@ -52,6 +53,6 @@ def test_delete_multiple_within_size(self): | ||
| l[i] = str(i) | ||
| for i in range(0,size,2): | ||
| for i in range(0, size, 2): | ||
| del l[i] | ||
| self._check_kvi(range(size-1,0,-2), l) | ||
| for i in range(0,size,2): | ||
| self._check_kvi(range(size - 1, 0, -2), l) | ||
| for i in range(0, size, 2): | ||
| with self.assertRaises(KeyError): | ||
@@ -63,12 +64,12 @@ l[i] | ||
| l = LRU(size) | ||
| n = size*2 | ||
| n = size * 2 | ||
| for i in range(n): | ||
| l[i] = str(i) | ||
| for i in range(size,n,2): | ||
| for i in range(size, n, 2): | ||
| del l[i] | ||
| self._check_kvi(range(n-1,size,-2), l) | ||
| for i in range(0,size): | ||
| self._check_kvi(range(n - 1, size, -2), l) | ||
| for i in range(0, size): | ||
| with self.assertRaises(KeyError): | ||
| l[i] | ||
| for i in range(size,n,2): | ||
| for i in range(size, n, 2): | ||
| with self.assertRaises(KeyError): | ||
@@ -83,3 +84,3 @@ l[i] | ||
| l[size] = str(size) | ||
| self._check_kvi(range(size,0,-1), l) | ||
| self._check_kvi(range(size, 0, -1), l) | ||
@@ -93,3 +94,3 @@ def test_access_within_size(self): | ||
| self.assertEqual(l[i], str(i)) | ||
| self.assertEqual(l.get(i,None), str(i)) | ||
| self.assertEqual(l.get(i, None), str(i)) | ||
@@ -110,8 +111,7 @@ def test_contains(self): | ||
| l[i] = str(i) | ||
| self._check_kvi(range(n-1,size-1,-1), l) | ||
| self._check_kvi(range(n - 1, size - 1, -1), l) | ||
| for i in range(size, n): | ||
| self.assertEqual(l[i], str(i)) | ||
| self.assertEqual(l.get(i,None), str(i)) | ||
| self.assertEqual(l.get(i, None), str(i)) | ||
| def test_update(self): | ||
@@ -129,3 +129,3 @@ l = LRU(2) | ||
| self.assertEqual(l['b'], 3) | ||
| l.update({'a':1, 'b':2}) | ||
| l.update({'a': 1, 'b': 2}) | ||
| self.assertEqual(('b', 2), l.peek_first_item()) | ||
@@ -139,3 +139,2 @@ self.assertEqual(l['a'], 1) | ||
| def test_peek_first_item(self): | ||
@@ -165,6 +164,6 @@ l = LRU(2) | ||
| l = LRU(size) | ||
| for i in range(2*size): | ||
| for i in range(2 * size): | ||
| l[i] = str(i) | ||
| self.assertTrue(l.has_key(i)) | ||
| for i in range(size, 2*size): | ||
| for i in range(size, 2 * size): | ||
| self.assertTrue(l.has_key(i)) | ||
@@ -182,12 +181,12 @@ for i in range(size): | ||
| l = LRU(size) | ||
| for i in range(size+5): | ||
| for i in range(size + 5): | ||
| l[i] = str(i) | ||
| l.set_size(size+10) | ||
| self.assertTrue(size+10 == l.get_size()) | ||
| l.set_size(size + 10) | ||
| self.assertTrue(size + 10 == l.get_size()) | ||
| self.assertTrue(len(l) == size) | ||
| for i in range(size+20): | ||
| for i in range(size + 20): | ||
| l[i] = str(i) | ||
| self.assertTrue(len(l) == size+10) | ||
| l.set_size(size+10-1) | ||
| self.assertTrue(len(l) == size+10-1) | ||
| self.assertTrue(len(l) == size + 10) | ||
| l.set_size(size + 10 - 1) | ||
| self.assertTrue(len(l) == size + 10 - 1) | ||
@@ -205,3 +204,3 @@ def test_unhashable(self): | ||
| l = LRU(size) | ||
| for i in range(size+5): | ||
| for i in range(size + 5): | ||
| l[i] = str(i) | ||
@@ -212,3 +211,3 @@ l.clear() | ||
| for i in range(size): | ||
| _ = l[random.randint(0, size-1)] | ||
| _ = l[random.randint(0, size - 1)] | ||
| l.clear() | ||
@@ -228,2 +227,59 @@ self.assertTrue(len(l) == 0) | ||
| def test_setdefault(self): | ||
| l = LRU(2) | ||
| l[1] = '1' | ||
| val = l.setdefault(1) | ||
| self.assertEqual('1', val) | ||
| self.assertEqual((1, 0), l.get_stats()) | ||
| val = l.setdefault(2, '2') | ||
| self.assertEqual('2', val) | ||
| self.assertEqual((1, 1), l.get_stats()) | ||
| self.assertEqual(val, l[2]) | ||
| l.clear() | ||
| val = 'long string' * 512 | ||
| l.setdefault(1, val) | ||
| l[2] = '2' | ||
| l[3] = '3' | ||
| self.assertTrue(val) | ||
| def test_pop(self): | ||
| l = LRU(2) | ||
| v = '2' * 4096 | ||
| l[1] = '1' | ||
| l[2] = v | ||
| val = l.pop(1) | ||
| self.assertEqual('1', val) | ||
| self.assertEqual((1, 0), l.get_stats()) | ||
| val = l.pop(2, 'not used') | ||
| self.assertEqual(v, val) | ||
| del val | ||
| self.assertTrue(v) | ||
| self.assertEqual((2, 0), l.get_stats()) | ||
| val = l.pop(3, '3' * 4096) | ||
| self.assertEqual('3' * 4096, val) | ||
| self.assertEqual((2, 1), l.get_stats()) | ||
| self.assertEqual(0, len(l)) | ||
| with self.assertRaises(KeyError) as ke: | ||
| l.pop(4) | ||
| self.assertEqual(4, ke.args[0]) | ||
| self.assertEqual((2, 2), l.get_stats()) | ||
| self.assertEqual(0, len(l)) | ||
| with self.assertRaises(TypeError): | ||
| l.pop() | ||
| def test_popitem(self): | ||
| l = LRU(3) | ||
| l[1] = '1' | ||
| l[2] = '2' | ||
| l[3] = '3' | ||
| k, v = l.popitem() | ||
| self.assertEqual((1, '1'), (k, v)) | ||
| k, v = l.popitem(least_recent=False) | ||
| self.assertEqual((3, '3'), (k, v)) | ||
| self.assertEqual((2, '2'), l.popitem(True)) | ||
| with self.assertRaises(KeyError) as ke: | ||
| l.popitem() | ||
| self.assertEqual('popitem(): LRU dict is empty', ke.args[0]) | ||
| self.assertEqual((0, 0), l.get_stats()) | ||
| def test_stats(self): | ||
@@ -312,3 +368,2 @@ for size in SIZES: | ||
| l = LRU(1, callback=callback) | ||
@@ -334,6 +389,7 @@ l[first_key] = first_value | ||
| l.set_size(1) | ||
| self.assertEqual(counter[0], 2) # callback invoked | ||
| self.assertEqual(counter[0], 2) # callback invoked | ||
| self.assertEqual(l.keys(), ['b']) | ||
| if __name__ == '__main__': | ||
| unittest.main() |
Alert delta unavailable
Currently unable to show alert delta for PyPI packages.
49885
11.95%350
18.24%