Skip to content

Commit 4f08613

Browse files
[Pygments] Complete stubs for filter and filters modules (#15616)
1 parent d3235e3 commit 4f08613

File tree

2 files changed

+81
-42
lines changed

2 files changed

+81
-42
lines changed

stubs/Pygments/pygments/filter.pyi

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,29 @@
1-
from _typeshed import Incomplete
21
from collections.abc import Iterable, Iterator
2+
from typing import Any, ClassVar, Protocol, type_check_only
33

44
from pygments.lexer import Lexer
55
from pygments.token import _TokenType
66

7-
def apply_filters(stream, filters, lexer=None): ...
8-
def simplefilter(f): ...
7+
@type_check_only
8+
class _SimpleFilterFunction(Protocol):
9+
# Function that can looked up as a method on a FunctionFilter subclass.
10+
def __call__(
11+
self, self_: FunctionFilter, lexer: Lexer | None, stream: Iterable[tuple[_TokenType, str]], options: dict[str, Any], /
12+
) -> Iterator[tuple[_TokenType, str]]: ...
13+
14+
def apply_filters(
15+
stream: Iterable[tuple[_TokenType, str]], filters: Iterable[Filter], lexer: Lexer | None = None
16+
) -> Iterator[tuple[_TokenType, str]]: ...
17+
def simplefilter(f: _SimpleFilterFunction) -> type[FunctionFilter]: ...
918

1019
class Filter:
11-
options: Incomplete
12-
def __init__(self, **options) -> None: ...
13-
def filter(self, lexer: Lexer, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
20+
options: dict[str, Any] # Arbitrary values used by subclasses.
21+
def __init__(self, **options: Any) -> None: ... # ditto.
22+
def filter(self, lexer: Lexer | None, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
1423

1524
class FunctionFilter(Filter):
16-
function: Incomplete
17-
def __init__(self, **options) -> None: ...
18-
def filter(self, lexer: Lexer, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
25+
# Set to None in class, but overridden with a non-None value in the subclasses created by @simplefilter.
26+
function: ClassVar[_SimpleFilterFunction]
27+
# 'options' gets passed as a dict to 'function'; valid types depends on the wrapped function's signature.
28+
def __init__(self, **options: Any) -> None: ...
29+
def filter(self, lexer: Lexer | None, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
Lines changed: 61 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,86 @@
1-
from _typeshed import Incomplete
2-
from collections.abc import Generator, Iterable, Iterator
1+
from _typeshed import ConvertibleToInt
2+
from collections.abc import Callable, Generator, Iterable, Iterator
3+
from re import Pattern
4+
from typing import Any, ClassVar, Final, Literal
35

46
from pygments.filter import Filter
57
from pygments.lexer import Lexer
68
from pygments.token import _TokenType
79

8-
def find_filter_class(filtername): ...
9-
def get_filter_by_name(filtername, **options): ...
10+
def find_filter_class(filtername: str) -> type[Filter] | None: ...
11+
12+
# Keyword arguments are forwarded to the filter class.
13+
def get_filter_by_name(filtername: str, **options: Any) -> Filter: ...
1014
def get_all_filters() -> Generator[str]: ...
1115

1216
class CodeTagFilter(Filter):
13-
tag_re: Incomplete
14-
def __init__(self, **options) -> None: ...
15-
def filter(self, lexer: Lexer, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
17+
tag_re: Pattern[str]
18+
# Arbitrary additional keyword arguments are permitted and are stored in self.options.
19+
def __init__(
20+
self, *, codetags: str | list[str] | tuple[str, ...] = ["XXX", "TODO", "FIXME", "BUG", "NOTE"], **options: Any
21+
) -> None: ...
22+
def filter(self, lexer: Lexer | None, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
1623

1724
class SymbolFilter(Filter):
18-
latex_symbols: Incomplete
19-
isabelle_symbols: Incomplete
20-
lang_map: Incomplete
21-
symbols: Incomplete
22-
def __init__(self, **options) -> None: ...
23-
def filter(self, lexer: Lexer, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
25+
latex_symbols: ClassVar[dict[str, str]]
26+
isabelle_symbols: ClassVar[dict[str, str]]
27+
lang_map: ClassVar[dict[Literal["isabelle", "latex"], dict[str, str]]]
28+
symbols: dict[str, str] # One of latex_symbols or isabelle_symbols.
29+
# Arbitrary additional keyword arguments are permitted and are stored in self.options.
30+
def __init__(self, *, lang: Literal["isabelle", "latex"] = "isabelle", **options: Any) -> None: ...
31+
def filter(self, lexer: Lexer | None, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
2432

2533
class KeywordCaseFilter(Filter):
26-
convert: Incomplete
27-
def __init__(self, **options) -> None: ...
28-
def filter(self, lexer: Lexer, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
34+
convert: Callable[[str], str]
35+
# Arbitrary additional keyword arguments are permitted and are stored in self.options.
36+
def __init__(self, *, case: Literal["lower", "upper", "capitalize"] = "lower", **options: Any) -> None: ...
37+
def filter(self, lexer: Lexer | None, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
2938

3039
class NameHighlightFilter(Filter):
31-
names: Incomplete
32-
tokentype: Incomplete
33-
def __init__(self, **options) -> None: ...
34-
def filter(self, lexer: Lexer, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
40+
names: set[str]
41+
tokentype: _TokenType
42+
# Arbitrary additional keyword arguments are permitted and are stored in self.options.
43+
def __init__(
44+
self, *, names: str | list[str] | tuple[str, ...] = [], tokentype: str | _TokenType | None = None, **options: Any
45+
) -> None: ...
46+
def filter(self, lexer: Lexer | None, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
3547

3648
class ErrorToken(Exception): ...
3749

3850
class RaiseOnErrorTokenFilter(Filter):
39-
exception: Incomplete
40-
def __init__(self, **options) -> None: ...
41-
def filter(self, lexer: Lexer, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
51+
exception: type[Exception]
52+
# Arbitrary additional keyword arguments are permitted and are stored in self.options.
53+
def __init__(self, *, excclass: type[Exception] = ..., **options: Any) -> None: ...
54+
def filter(self, lexer: Lexer | None, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
4255

4356
class VisibleWhitespaceFilter(Filter):
44-
wstt: Incomplete
45-
def __init__(self, **options) -> None: ...
46-
def filter(self, lexer: Lexer, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
57+
spaces: str
58+
tabs: str
59+
newlines: str
60+
wstt: bool
61+
def __init__(
62+
self,
63+
*,
64+
spaces: str | bool = False,
65+
tabs: str | bool = False,
66+
newlines: str | bool = False,
67+
tabsize: ConvertibleToInt = 8,
68+
wstokentype: bool | int | str = True, # Any value accepted by get_bool_opt.
69+
# Arbitrary additional keyword arguments are permitted and are stored in self.options.
70+
**options: Any,
71+
) -> None: ...
72+
def filter(self, lexer: Lexer | None, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
4773

4874
class GobbleFilter(Filter):
49-
n: Incomplete
50-
def __init__(self, **options) -> None: ...
51-
def gobble(self, value, left): ...
52-
def filter(self, lexer: Lexer, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
75+
n: int
76+
# Arbitrary additional keyword arguments are permitted and are stored in self.options.
77+
def __init__(self, *, n: ConvertibleToInt = 0, **options: Any) -> None: ...
78+
def gobble(self, value: str, left: int) -> tuple[str, int]: ...
79+
def filter(self, lexer: Lexer | None, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
5380

5481
class TokenMergeFilter(Filter):
55-
def __init__(self, **options) -> None: ...
56-
def filter(self, lexer: Lexer, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
82+
# Arbitrary additional keyword arguments are permitted and are stored in self.options.
83+
def __init__(self, **options: Any) -> None: ...
84+
def filter(self, lexer: Lexer | None, stream: Iterable[tuple[_TokenType, str]]) -> Iterator[tuple[_TokenType, str]]: ...
5785

58-
FILTERS: Incomplete
86+
FILTERS: Final[dict[str, type[Filter]]]

0 commit comments

Comments
 (0)