Skip to content

Commit bb27fbd

Browse files
committed
Add python stub
1 parent ec701a3 commit bb27fbd

File tree

6 files changed

+75
-6
lines changed

6 files changed

+75
-6
lines changed

MANIFEST.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
11
include LICENSE README.rst MANIFEST MANIFEST.in
2+
graft src
3+
global-exclude *.pyc
4+
global-exclude *.cache

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from setuptools import setup, Extension
22

33
extensions = [
4-
Extension("lru", ["src/lru.c"]),
4+
Extension("lru._lru", ["src/lru/_lru.c"]),
55
]
66

77
args = {

src/lru/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from ._lru import LRU as LRU # noqa: F401
2+
3+
__all__ = ["LRU"]

src/lru/__init__.pyi

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
from typing import (
2+
Any,
3+
Callable,
4+
Generic,
5+
Hashable,
6+
Iterable,
7+
TypeVar,
8+
overload,
9+
Protocol
10+
)
11+
12+
_KT = TypeVar("_KT", bound=Hashable)
13+
_VT = TypeVar("_VT")
14+
_VT_co = TypeVar("_VT_co", covariant=True)
15+
_T = TypeVar("_T")
16+
17+
18+
class __SupportsKeysAndGetItem(Protocol[_KT, _VT_co]):
19+
def keys(self) -> Iterable[_KT]: ...
20+
def __getitem__(self, __key: _KT) -> _VT_co: ...
21+
22+
23+
class LRU(Generic[_KT, _VT]):
24+
@overload
25+
def __init__(self, size: int) -> None: ...
26+
@overload
27+
def __init__(self, size: int, callback: Callable[[_KT, _VT], Any]) -> None: ...
28+
def clear(self) -> None: ...
29+
@overload
30+
def get(self, key: _KT) -> _VT | None: ...
31+
@overload
32+
def get(self, key: _KT, instead: _VT | _T) -> _VT | _T: ...
33+
def get_size(self) -> int: ...
34+
def has_key(self, key: _KT) -> bool: ...
35+
def keys(self) -> list[_KT]: ...
36+
def values(self) -> list[_VT]: ...
37+
def items(self) -> list[tuple[_KT, _VT]]: ...
38+
def peek_first_item(self) -> tuple[_KT, _VT] | None: ...
39+
def peek_last_item(self) -> tuple[_KT, _VT] | None: ...
40+
@overload
41+
def pop(self, key: _KT) -> _VT | None: ...
42+
@overload
43+
def pop(self, key: _KT, default: _VT | _T) -> _VT | _T: ...
44+
def popitem(self, least_recent: bool = ...) -> tuple[_KT, _VT]: ...
45+
@overload
46+
def setdefault(self: LRU[_KT, _T | None], key: _KT) -> _T | None: ...
47+
@overload
48+
def setdefault(self, key: _KT, default: _VT) -> _VT: ...
49+
def set_callback(self, callback: Callable[[_KT, _VT], Any] | None) -> None: ...
50+
def set_size(self, size: int) -> None: ...
51+
@overload
52+
def update(self, __m: __SupportsKeysAndGetItem[_KT, _VT], **kwargs: _VT) -> None: ...
53+
@overload
54+
def update(self, __m: Iterable[tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
55+
@overload
56+
def update(self, **kwargs: _VT) -> None: ...
57+
def get_stats(self) -> tuple[int, int]: ...
58+
def __contains__(self, __o: Any) -> bool: ...
59+
def __delitem__(self, key: _KT) -> None: ...
60+
def __getitem__(self, item: _KT) -> _VT: ...
61+
def __len__(self) -> int: ...
62+
def __repr__(self) -> str: ...
63+
def __setitem__(self, key: _KT, value: _VT) -> None: ...

src/lru.c renamed to src/lru/_lru.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ node_repr(Node* self)
8080

8181
static PyTypeObject NodeType = {
8282
PyVarObject_HEAD_INIT(NULL, 0)
83-
"lru.Node", /* tp_name */
83+
"_lru.Node", /* tp_name */
8484
sizeof(Node), /* tp_basicsize */
8585
0, /* tp_itemsize */
8686
(destructor)node_dealloc,/* tp_dealloc */
@@ -711,7 +711,7 @@ PyDoc_STRVAR(lru_doc,
711711

712712
static PyTypeObject LRUType = {
713713
PyVarObject_HEAD_INIT(NULL, 0)
714-
"lru.LRU", /* tp_name */
714+
"_lru.LRU", /* tp_name */
715715
sizeof(LRU), /* tp_basicsize */
716716
0, /* tp_itemsize */
717717
(destructor)LRU_dealloc, /* tp_dealloc */

test/test_lru.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,11 +247,11 @@ def test_pop(self):
247247
self.assertEqual(0, len(l))
248248
with self.assertRaises(KeyError) as ke:
249249
l.pop(4)
250-
self.assertEqual(4, ke.args[0])
250+
self.assertEqual(4, ke.args[0]) # type: ignore
251251
self.assertEqual((2, 2), l.get_stats())
252252
self.assertEqual(0, len(l))
253253
with self.assertRaises(TypeError):
254-
l.pop()
254+
l.pop() # type: ignore
255255

256256
def test_popitem(self):
257257
l = LRU(3)
@@ -265,7 +265,7 @@ def test_popitem(self):
265265
self.assertEqual((2, '2'), l.popitem(True))
266266
with self.assertRaises(KeyError) as ke:
267267
l.popitem()
268-
self.assertEqual('popitem(): LRU dict is empty', ke.args[0])
268+
self.assertEqual('popitem(): LRU dict is empty', ke.args[0]) # type: ignore
269269
self.assertEqual((0, 0), l.get_stats())
270270

271271
def test_stats(self):

0 commit comments

Comments
 (0)