Skip to content

Commit 46de19d

Browse files
AABuramaslennAlexWaygoodJelleZijlstra
authored
add boltons (#8892)
Co-authored-by: Andrey Maslennikov <[email protected]> Co-authored-by: Alex Waygood <[email protected]> Co-authored-by: Jelle Zijlstra <[email protected]>
1 parent 89a22f9 commit 46de19d

34 files changed

+1365
-0
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,6 @@ analyze.py
6868

6969
# Mypy cache
7070
.mypy_cache/
71+
72+
# pyenv local python version
73+
.python-version

pyrightconfig.stricter.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"stubs/bleach",
2929
"stubs/boto",
3030
"stubs/beautifulsoup4",
31+
"stubs/boltons",
3132
"stubs/braintree",
3233
"stubs/caldav",
3334
"stubs/cffi",
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# These names exist in __all__, but have no definition:
2+
boltons.strutils.int_list_complement
3+
boltons.strutils.int_list_to_int_tuples
4+
5+
# Internal compatibility aliases
6+
boltons.cacheutils.basestring
7+
boltons.funcutils.basestring
8+
boltons.funcutils.inspect_formatargspec
9+
boltons.funcutils.make_method
10+
boltons.iterutils.basestring

stubs/boltons/METADATA.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
version = "23.0.*"
2+
3+
[tool.stubtest]
4+
ignore_missing_stub = false

stubs/boltons/boltons/__init__.pyi

Whitespace-only changes.

stubs/boltons/boltons/cacheutils.pyi

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import weakref
2+
from _typeshed import Incomplete, Self, SupportsItems, SupportsKeysAndGetItem
3+
from collections.abc import Callable, Generator, Hashable, Iterable, Iterator, Mapping
4+
from typing import Any, Generic, TypeVar, overload
5+
6+
_KT = TypeVar("_KT")
7+
_VT = TypeVar("_VT")
8+
_T = TypeVar("_T")
9+
10+
PREV: int
11+
NEXT: int
12+
KEY: int
13+
VALUE: int
14+
DEFAULT_MAX_SIZE: int
15+
16+
class LRI(dict[_KT, _VT]):
17+
hit_count: int
18+
miss_count: int
19+
soft_miss_count: int
20+
max_size: int
21+
on_miss: Callable[[_KT], _VT]
22+
def __init__(self, max_size: int = 128, values: Incomplete | None = None, on_miss: Incomplete | None = None) -> None: ...
23+
def __setitem__(self, key: _KT, value: _VT) -> None: ...
24+
def __getitem__(self, key: _KT) -> _VT: ...
25+
@overload
26+
def get(self, key: _KT, default: None = None) -> _VT | None: ...
27+
@overload
28+
def get(self, key: _KT, default: _T) -> _T | _VT: ...
29+
def __delitem__(self, key: _KT) -> None: ...
30+
@overload
31+
def pop(self, key: _KT) -> _VT: ...
32+
@overload
33+
def pop(self, key: _KT, default: _T) -> _T | _VT: ...
34+
def popitem(self) -> tuple[_KT, _VT]: ...
35+
def clear(self) -> None: ...
36+
def copy(self: Self) -> Self: ...
37+
@overload
38+
def setdefault(self, key: _KT, default: None = None) -> _VT: ...
39+
@overload
40+
def setdefault(self, key: _KT, default: _VT) -> _VT: ...
41+
def update(self, E: SupportsKeysAndGetItem[_KT, _VT] | Iterable[tuple[_KT, _VT]], **F: _VT) -> None: ... # type: ignore[override]
42+
43+
class LRU(LRI[_KT, _VT]):
44+
def __getitem__(self, key: _KT) -> _VT: ...
45+
46+
def make_cache_key(
47+
args: Iterable[Hashable],
48+
kwargs: SupportsItems[Hashable, Hashable],
49+
typed: bool = False,
50+
kwarg_mark: object = ...,
51+
fasttypes: frozenset[type] = ...,
52+
): ...
53+
54+
class CachedFunction:
55+
func: Incomplete
56+
get_cache: Incomplete
57+
scoped: Incomplete
58+
typed: Incomplete
59+
key_func: Incomplete
60+
def __init__(self, func, cache, scoped: bool = True, typed: bool = False, key: Incomplete | None = None): ...
61+
def __call__(self, *args, **kwargs): ...
62+
63+
class CachedMethod:
64+
func: Incomplete
65+
get_cache: Incomplete
66+
scoped: Incomplete
67+
typed: Incomplete
68+
key_func: Incomplete
69+
bound_to: Incomplete
70+
def __init__(self, func, cache, scoped: bool = True, typed: bool = False, key: Incomplete | None = None): ...
71+
def __get__(self, obj, objtype: Incomplete | None = None): ...
72+
def __call__(self, *args, **kwargs): ...
73+
74+
def cached(cache: Mapping[Any, Any], scoped: bool = True, typed: bool = False, key: Incomplete | None = None): ...
75+
def cachedmethod(cache, scoped: bool = True, typed: bool = False, key: Incomplete | None = None): ...
76+
77+
class cachedproperty(Generic[_T]):
78+
func: Callable[[Incomplete], _T]
79+
def __init__(self, func: Callable[[Incomplete], _T]) -> None: ...
80+
def __get__(self, obj: _T, objtype: type | None = None): ...
81+
82+
class ThresholdCounter(Generic[_T]):
83+
total: int
84+
def __init__(self, threshold: float = 0.001) -> None: ...
85+
@property
86+
def threshold(self) -> float: ...
87+
def add(self, key: _T) -> None: ...
88+
def elements(self) -> Iterator[_T]: ...
89+
def most_common(self, n: int | None = None) -> list[tuple[_T, int]]: ...
90+
def get_common_count(self) -> int: ...
91+
def get_uncommon_count(self) -> int: ...
92+
def get_commonality(self) -> float: ...
93+
def __getitem__(self, key: _T) -> int: ...
94+
def __len__(self) -> int: ...
95+
def __contains__(self, key: _T) -> bool: ...
96+
def iterkeys(self) -> Iterator[_T]: ...
97+
def keys(self) -> list[_T]: ...
98+
def itervalues(self) -> Generator[int, None, None]: ...
99+
def values(self) -> list[int]: ...
100+
def iteritems(self) -> Generator[tuple[_T, int], None, None]: ...
101+
def items(self) -> list[tuple[_T, int]]: ...
102+
def get(self, key: _T, default: int = 0) -> int: ...
103+
def update(self, iterable: Iterable[_T] | Mapping[_T, int], **kwargs: Iterable[_T] | Mapping[_T, int]) -> None: ...
104+
105+
class MinIDMap(Generic[_T]):
106+
mapping: weakref.WeakKeyDictionary[_T, int]
107+
ref_map: dict[_T, int]
108+
free: list[int]
109+
def __init__(self) -> None: ...
110+
def get(self, a: _T) -> int: ...
111+
def drop(self, a: _T) -> None: ...
112+
def __contains__(self, a: _T) -> bool: ...
113+
def __iter__(self) -> Iterator[_T]: ...
114+
def __len__(self) -> int: ...
115+
def iteritems(self) -> Iterator[tuple[_T, int]]: ...

stubs/boltons/boltons/debugutils.pyi

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from _typeshed import Incomplete
2+
from collections.abc import Callable
3+
from typing import Any
4+
5+
def pdb_on_signal(signalnum: int | None = None) -> None: ...
6+
def pdb_on_exception(limit: int = 100) -> None: ...
7+
def wrap_trace(
8+
obj: Incomplete, hook: Callable[..., Any] = ..., which: str | None = None, events: str | None = None, label: str | None = None
9+
) -> Incomplete: ...

stubs/boltons/boltons/deprutils.pyi

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from types import ModuleType
2+
from typing import Any
3+
4+
class DeprecatableModule(ModuleType):
5+
def __init__(self, module: ModuleType) -> None: ...
6+
def __getattribute__(self, name: str) -> Any: ...
7+
8+
def deprecate_module_member(mod_name: str, name: str, message: str) -> None: ...

stubs/boltons/boltons/dictutils.pyi

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
from _typeshed import SupportsKeysAndGetItem
2+
from binascii import Incomplete
3+
from collections.abc import Generator, ItemsView, Iterable, KeysView, ValuesView
4+
from typing import NoReturn, TypeVar
5+
from typing_extensions import Self, TypeAlias
6+
7+
_KT = TypeVar("_KT")
8+
_VT = TypeVar("_VT")
9+
_T = TypeVar("_T")
10+
11+
class OrderedMultiDict(dict[_KT, _VT]):
12+
def add(self, k: _KT, v: _VT) -> None: ...
13+
def addlist(self, k: _KT, v: Iterable[_VT]) -> None: ...
14+
def clear(self) -> None: ...
15+
def copy(self) -> Self: ...
16+
def counts(self) -> OrderedMultiDict[_KT, _VT]: ...
17+
@classmethod
18+
def fromkeys(cls, keys: _KT, default: _VT | None = None) -> OrderedMultiDict[_KT, _VT]: ... # type: ignore[override]
19+
def get(self, k: _KT, default: _VT | None = None) -> OrderedMultiDict[_KT, _VT]: ... # type: ignore[override]
20+
def getlist(self, k: _KT, default: _VT | None = ...) -> list[object]: ...
21+
def inverted(self) -> OrderedMultiDict[_KT, _VT]: ...
22+
def items(self, multi: bool = False) -> list[tuple[_KT, _VT]]: ... # type: ignore[override]
23+
def iteritems(self, multi: bool = False) -> Generator[tuple[_KT, _VT], None, None]: ...
24+
def iterkeys(self, multi: bool = False) -> Generator[_KT, None, None]: ...
25+
def itervalues(self, multi: bool = False) -> Generator[_VT, None, None]: ...
26+
def keys(self, multi: bool = False) -> list[_KT]: ... # type: ignore[override]
27+
def pop(self, k: _KT, default: _VT | None = ...) -> _VT: ... # type: ignore[override]
28+
def popall(self, k: _KT, default: _VT | None = ...) -> list[_VT]: ...
29+
def poplast(self, k: _KT | None = ..., default: _VT | None = ...) -> _VT: ...
30+
def setdefault(self, k: _KT, default: _VT | None = ...) -> _VT: ...
31+
def sorted(self, key: _KT | None = None, reverse: bool = False) -> OrderedMultiDict[_KT, _VT]: ...
32+
def sortedvalues(self, key: _KT | None = None, reverse: bool = False) -> OrderedMultiDict[_KT, _VT]: ...
33+
def todict(self, multi: bool = False) -> dict[_KT, _VT]: ...
34+
def update(self, E: dict[_KT, _VT] | Iterable[object], **F) -> None: ... # type: ignore[override]
35+
def update_extend(self, E: dict[_KT, _VT] | Iterable[object], **F) -> None: ...
36+
def values(self, multi: bool = False) -> list[_VT]: ... # type: ignore[override]
37+
def viewitems(self) -> ItemsView[_KT, _VT]: ...
38+
def viewkeys(self) -> KeysView[_KT]: ...
39+
def viewvalues(self) -> ValuesView[_VT]: ...
40+
41+
OMD: TypeAlias = OrderedMultiDict[_KT, _VT]
42+
MultiDict: TypeAlias = OrderedMultiDict[_KT, _VT]
43+
44+
class FastIterOrderedMultiDict(OrderedMultiDict[_KT, _VT]): # undocumented
45+
def iteritems(self, multi: bool = False) -> Generator[tuple[_KT, _VT], None, None]: ...
46+
def iterkeys(self, multi: bool = False) -> Generator[_KT, None, None]: ...
47+
48+
class OneToOne(dict[_KT, _VT]):
49+
inv: dict[_VT, _KT]
50+
def clear(self) -> None: ...
51+
def copy(self) -> Self: ...
52+
def pop(self, key: _KT, default: _VT | _T = ...) -> _VT | _T: ...
53+
def popitem(self) -> tuple[_KT, _VT]: ...
54+
def setdefault(self, key: _KT, default: _VT | None = None) -> _VT: ...
55+
@classmethod
56+
def unique(cls, *a, **kw) -> Self: ...
57+
def update(self, dict_or_iterable, **kw) -> None: ... # type: ignore[override]
58+
59+
class ManyToMany(dict[_KT, frozenset[_VT]]):
60+
data: dict[_KT, set[_VT]]
61+
inv: dict[_VT, set[_KT]]
62+
# def __contains__(self, key: _KT): ...
63+
def __delitem__(self, key: _KT) -> None: ...
64+
def __eq__(self, other): ...
65+
def __getitem__(self, key: _KT): ...
66+
def __init__(self, items: Iterable[Incomplete] | None = None) -> None: ...
67+
def __iter__(self): ...
68+
def __len__(self): ...
69+
def __setitem__(self, key: _KT, vals: Iterable[_VT]) -> None: ...
70+
def add(self, key: _KT, val: _VT) -> None: ...
71+
def get(self, key: _KT, default: frozenset[_VT] = ...) -> frozenset[_VT]: ... # type: ignore[override]
72+
def iteritems(self) -> Generator[tuple[_KT, _VT], None, None]: ...
73+
def keys(self): ...
74+
def remove(self, key: _KT, val: _VT) -> None: ...
75+
def replace(self, key: _KT, newkey: _KT) -> None: ...
76+
def update(self, iterable: ManyToMany[_KT, _VT] | SupportsKeysAndGetItem[_KT, _VT] | tuple[_KT, _VT]) -> None: ... # type: ignore[override]
77+
78+
def subdict(d: dict[_KT, _VT], keep: Iterable[_KT] | None = None, drop: Iterable[_KT] | None = None) -> dict[_KT, _VT]: ...
79+
80+
class FrozenHashError(TypeError): ... # undocumented
81+
82+
class FrozenDict(dict[_KT, _VT]):
83+
def __copy__(self) -> Self: ...
84+
def clear(self, *a, **kw) -> None: ...
85+
@classmethod
86+
def fromkeys(cls, keys: Iterable[_KT], value: _VT | None = None) -> FrozenDict[_KT, _VT]: ... # type: ignore[override]
87+
def pop(self, *a, **kw) -> NoReturn: ...
88+
def popitem(self, *a, **kw) -> NoReturn: ...
89+
def setdefault(self, *a, **kw) -> NoReturn: ...
90+
def updated(self, *a, **kw) -> Self: ...

stubs/boltons/boltons/easterutils.pyi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from typing import NoReturn
2+
3+
def gobs_program() -> NoReturn: ...

stubs/boltons/boltons/ecoutils.pyi

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from typing import Any
2+
3+
ECO_VERSION: str
4+
PY_GT_2: bool
5+
HAVE_URANDOM: bool
6+
INSTANCE_ID: str
7+
IS_64BIT: bool
8+
HAVE_UCS4: bool
9+
HAVE_READLINE: bool
10+
SQLITE_VERSION: str
11+
OPENSSL_VERSION: str
12+
TKINTER_VERSION: str
13+
ZLIB_VERSION: str
14+
EXPAT_VERSION: str
15+
CPU_COUNT: int
16+
HAVE_THREADING: bool
17+
HAVE_IPV6: bool
18+
RLIMIT_NOFILE: int
19+
RLIMIT_FDS_SOFT: int
20+
RLIMIT_FDS_HARD: int
21+
START_TIME_INFO: dict[str, str | float]
22+
23+
def getrandbits(k: int) -> int: ...
24+
def get_python_info() -> dict[str, Any]: ...
25+
def get_profile(**kwargs) -> dict[str, Any]: ...
26+
def get_profile_json(indent: bool = False) -> str: ...
27+
def main() -> None: ...
28+
def dumps(val: Any, indent: int) -> str: ...

stubs/boltons/boltons/excutils.pyi

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from typing import Any
2+
from typing_extensions import Self
3+
4+
class ExceptionCauseMixin(Exception):
5+
cause: Any
6+
def __new__(cls, *args, **kw) -> Self: ...
7+
def get_str(self) -> str: ...
8+
9+
class MathError(ExceptionCauseMixin, ValueError): ...

stubs/boltons/boltons/fileutils.pyi

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
from _typeshed import StrOrBytesPath
2+
from collections.abc import Callable, Generator, Iterable
3+
from types import TracebackType
4+
from typing import IO, Any, NoReturn
5+
from typing_extensions import Self
6+
7+
def mkdir_p(path: StrOrBytesPath) -> None: ...
8+
9+
class FilePerms:
10+
user: str
11+
group: str
12+
other: str
13+
def __init__(self, user: str = "", group: str = "", other: str = "") -> None: ...
14+
@classmethod
15+
def from_int(cls, i: int) -> Self: ...
16+
@classmethod
17+
def from_path(cls, path: StrOrBytesPath) -> Self: ...
18+
def __int__(self) -> int: ...
19+
20+
def atomic_save(dest_path: str, **kwargs) -> AtomicSaver: ...
21+
22+
class AtomicSaver:
23+
dest_path: str
24+
overwrite: bool
25+
file_perms: int
26+
overwrite_part: bool
27+
part_filename: str
28+
rm_part_on_exc: bool
29+
text_mode: bool
30+
buffering: int
31+
dest_dir: str
32+
part_path: str
33+
mode: str
34+
open_flags: int
35+
part_file: str | None
36+
def __init__(self, dest_path: str, **kwargs) -> None: ...
37+
def setup(self) -> None: ...
38+
def __enter__(self) -> IO[Any] | None: ...
39+
def __exit__(
40+
self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None
41+
) -> None: ...
42+
43+
def iter_find_files(
44+
directory: str, patterns: str | Iterable[str], ignored: str | Iterable[str] | None = None, include_dirs: bool = False
45+
) -> Generator[str, None, None]: ...
46+
def copy_tree(
47+
src: StrOrBytesPath,
48+
dst: StrOrBytesPath,
49+
symlinks: bool = False,
50+
ignore: None | Callable[[str, list[str]], Iterable[str]] | Callable[[StrOrBytesPath, list[str]], Iterable[str]] = None,
51+
) -> None: ...
52+
53+
copytree = copy_tree
54+
55+
class DummyFile:
56+
name: str
57+
mode: str
58+
closed: bool
59+
errors: None
60+
isatty: bool
61+
encoding: None
62+
newlines: None
63+
softspace: int
64+
def __init__(self, path: StrOrBytesPath, mode: str = "r", buffering: int | None = None) -> None: ...
65+
def close(self) -> None: ...
66+
def fileno(self) -> int: ...
67+
def flush(self) -> None: ...
68+
def next(self) -> NoReturn: ...
69+
def read(self, size: int = 0) -> str: ...
70+
def readline(self, size: int = 0) -> str: ...
71+
def readlines(self, size: int = 0) -> list[str]: ...
72+
def seek(self) -> None: ...
73+
def tell(self) -> int: ...
74+
def truncate(self) -> None: ...
75+
def write(self, string: str) -> None: ...
76+
def writelines(self, list_of_strings: list[str]) -> None: ...
77+
def __next__(self) -> NoReturn: ...
78+
def __enter__(self) -> None: ...
79+
def __exit__(self, exc_type, exc_val, exc_tb) -> None: ...

0 commit comments

Comments
 (0)