From d24f07c9a620a331c025747ba9f7d5b87a0ddc78 Mon Sep 17 00:00:00 2001 From: Martin Fischer Date: Fri, 4 Mar 2022 08:20:52 +0100 Subject: [PATCH] pygments: Correct Formatter generics 933fec014c2410d9b1fb67926dbd832a87508d82 made pygments.formatter.Formatter generic to improve the type-safety of pygments.format() and pygments.highlight(). The actual pygments.formatter.Formatter however is not generic, meaning that pygments.formatter.Formatter[str] should not type check (since it leads to a runtime type error). Furthermore the pygments ImageFormatter always expects BinaryIO, no matter which constructor arguments are passed. This commit addresses both problems. --- stubs/Pygments/pygments/__init__.pyi | 10 ++++---- stubs/Pygments/pygments/formatter.pyi | 24 +++++++++++++------ .../Pygments/pygments/formatters/__init__.pyi | 4 ++-- stubs/Pygments/pygments/formatters/bbcode.pyi | 4 ++-- stubs/Pygments/pygments/formatters/html.pyi | 4 ++-- stubs/Pygments/pygments/formatters/img.pyi | 14 +++++------ stubs/Pygments/pygments/formatters/irc.pyi | 4 ++-- stubs/Pygments/pygments/formatters/latex.pyi | 4 ++-- stubs/Pygments/pygments/formatters/other.pyi | 8 +++---- .../pygments/formatters/pangomarkup.pyi | 4 ++-- stubs/Pygments/pygments/formatters/rtf.pyi | 4 ++-- stubs/Pygments/pygments/formatters/svg.pyi | 4 ++-- .../Pygments/pygments/formatters/terminal.pyi | 4 ++-- .../pygments/formatters/terminal256.pyi | 4 ++-- stubs/Pygments/pygments/plugin.pyi | 4 ++-- 15 files changed, 54 insertions(+), 46 deletions(-) diff --git a/stubs/Pygments/pygments/__init__.pyi b/stubs/Pygments/pygments/__init__.pyi index 7a9621cf9b7f..15a3fa3b61ee 100644 --- a/stubs/Pygments/pygments/__init__.pyi +++ b/stubs/Pygments/pygments/__init__.pyi @@ -1,16 +1,16 @@ from _typeshed import SupportsWrite from typing import TypeVar, overload -from pygments.formatter import Formatter +from pygments.formatter import _Formatter _T = TypeVar("_T", str, bytes) def lex(code, lexer): ... @overload -def format(tokens, formatter: Formatter[_T], outfile: SupportsWrite[_T]) -> None: ... +def format(tokens, formatter: _Formatter[_T], outfile: SupportsWrite[_T]) -> None: ... @overload -def format(tokens, formatter: Formatter[_T], outfile: None = ...) -> _T: ... +def format(tokens, formatter: _Formatter[_T], outfile: None = ...) -> _T: ... @overload -def highlight(code, lexer, formatter: Formatter[_T], outfile: SupportsWrite[_T]) -> None: ... +def highlight(code, lexer, formatter: _Formatter[_T], outfile: SupportsWrite[_T]) -> None: ... @overload -def highlight(code, lexer, formatter: Formatter[_T], outfile: None = ...) -> _T: ... +def highlight(code, lexer, formatter: _Formatter[_T], outfile: None = ...) -> _T: ... diff --git a/stubs/Pygments/pygments/formatter.pyi b/stubs/Pygments/pygments/formatter.pyi index f441d487cf6b..ad1ea39fa447 100644 --- a/stubs/Pygments/pygments/formatter.pyi +++ b/stubs/Pygments/pygments/formatter.pyi @@ -1,8 +1,8 @@ -from typing import Any, Generic, TypeVar, overload +from typing import Any, Generic, TypeVar, overload, type_check_only _T = TypeVar("_T", str, bytes) -class Formatter(Generic[_T]): +class Formatter: name: Any aliases: Any filenames: Any @@ -12,11 +12,21 @@ class Formatter(Generic[_T]): title: Any encoding: Any options: Any + def get_style_defs(self, arg: str = ...): ... + def format(self, tokensource, outfile): ... + +@type_check_only +class _Formatter(Generic[_T], Formatter): ... + +@type_check_only +class _BinaryFormatter(_Formatter[bytes]): + def __init__(self, **options) -> None: ... + +@type_check_only +class _TextFormatter(_Formatter[_T]): @overload - def __init__(self: Formatter[str], *, encoding: None = ..., outencoding: None = ..., **options) -> None: ... + def __init__(self: _Formatter[str], *, encoding: None = ..., outencoding: None = ..., **options) -> None: ... @overload - def __init__(self: Formatter[bytes], *, encoding: str, outencoding: None = ..., **options) -> None: ... + def __init__(self: _Formatter[bytes], *, encoding: str, outencoding: None = ..., **options) -> None: ... @overload - def __init__(self: Formatter[bytes], *, encoding: None = ..., outencoding: str, **options) -> None: ... - def get_style_defs(self, arg: str = ...): ... - def format(self, tokensource, outfile): ... + def __init__(self: _Formatter[bytes], *, encoding: None = ..., outencoding: str, **options) -> None: ... diff --git a/stubs/Pygments/pygments/formatters/__init__.pyi b/stubs/Pygments/pygments/formatters/__init__.pyi index 573b42de71e6..2f375d88162c 100644 --- a/stubs/Pygments/pygments/formatters/__init__.pyi +++ b/stubs/Pygments/pygments/formatters/__init__.pyi @@ -1,6 +1,6 @@ from typing import Any, Generator -from ..formatter import Formatter +from ..formatter import _Formatter from .bbcode import BBCodeFormatter as BBCodeFormatter from .html import HtmlFormatter as HtmlFormatter from .img import ( @@ -18,7 +18,7 @@ from .svg import SvgFormatter as SvgFormatter from .terminal import TerminalFormatter as TerminalFormatter from .terminal256 import Terminal256Formatter as Terminal256Formatter, TerminalTrueColorFormatter as TerminalTrueColorFormatter -def get_all_formatters() -> Generator[type[Formatter[Any]], None, None]: ... +def get_all_formatters() -> Generator[type[_Formatter[Any]], None, None]: ... def get_formatter_by_name(_alias, **options): ... def load_formatter_from_file(filename, formattername: str = ..., **options): ... def get_formatter_for_filename(fn, **options): ... diff --git a/stubs/Pygments/pygments/formatters/bbcode.pyi b/stubs/Pygments/pygments/formatters/bbcode.pyi index df1708bec27a..b08fe7ed58f6 100644 --- a/stubs/Pygments/pygments/formatters/bbcode.pyi +++ b/stubs/Pygments/pygments/formatters/bbcode.pyi @@ -1,10 +1,10 @@ from typing import Any, TypeVar -from pygments.formatter import Formatter +from pygments.formatter import _TextFormatter _T = TypeVar("_T", str, bytes) -class BBCodeFormatter(Formatter[_T]): +class BBCodeFormatter(_TextFormatter[_T]): name: str aliases: Any filenames: Any diff --git a/stubs/Pygments/pygments/formatters/html.pyi b/stubs/Pygments/pygments/formatters/html.pyi index 1822dec0efaa..22fadb5a3cb1 100644 --- a/stubs/Pygments/pygments/formatters/html.pyi +++ b/stubs/Pygments/pygments/formatters/html.pyi @@ -1,10 +1,10 @@ from typing import Any, TypeVar -from pygments.formatter import Formatter +from pygments.formatter import _TextFormatter _T = TypeVar("_T", str, bytes) -class HtmlFormatter(Formatter[_T]): +class HtmlFormatter(_TextFormatter[_T]): name: str aliases: Any filenames: Any diff --git a/stubs/Pygments/pygments/formatters/img.pyi b/stubs/Pygments/pygments/formatters/img.pyi index 255dc80fdf38..2a7a440f4413 100644 --- a/stubs/Pygments/pygments/formatters/img.pyi +++ b/stubs/Pygments/pygments/formatters/img.pyi @@ -1,8 +1,6 @@ -from typing import Any, TypeVar +from typing import Any -from pygments.formatter import Formatter - -_T = TypeVar("_T", str, bytes) +from pygments.formatter import _BinaryFormatter class PilNotAvailable(ImportError): ... class FontNotFound(Exception): ... @@ -17,7 +15,7 @@ class FontManager: def get_text_size(self, text): ... def get_font(self, bold, oblique): ... -class ImageFormatter(Formatter[_T]): +class ImageFormatter(_BinaryFormatter): name: str aliases: Any filenames: Any @@ -47,19 +45,19 @@ class ImageFormatter(Formatter[_T]): def get_style_defs(self, arg: str = ...) -> None: ... def format(self, tokensource, outfile) -> None: ... -class GifImageFormatter(ImageFormatter[_T]): +class GifImageFormatter(ImageFormatter): name: str aliases: Any filenames: Any default_image_format: str -class JpgImageFormatter(ImageFormatter[_T]): +class JpgImageFormatter(ImageFormatter): name: str aliases: Any filenames: Any default_image_format: str -class BmpImageFormatter(ImageFormatter[_T]): +class BmpImageFormatter(ImageFormatter): name: str aliases: Any filenames: Any diff --git a/stubs/Pygments/pygments/formatters/irc.pyi b/stubs/Pygments/pygments/formatters/irc.pyi index 7af728d1445c..b3b90e037561 100644 --- a/stubs/Pygments/pygments/formatters/irc.pyi +++ b/stubs/Pygments/pygments/formatters/irc.pyi @@ -1,10 +1,10 @@ from typing import Any, TypeVar -from pygments.formatter import Formatter +from pygments.formatter import _TextFormatter _T = TypeVar("_T", str, bytes) -class IRCFormatter(Formatter[_T]): +class IRCFormatter(_TextFormatter[_T]): name: str aliases: Any filenames: Any diff --git a/stubs/Pygments/pygments/formatters/latex.pyi b/stubs/Pygments/pygments/formatters/latex.pyi index 83147436e7e6..13f53c3bf2e2 100644 --- a/stubs/Pygments/pygments/formatters/latex.pyi +++ b/stubs/Pygments/pygments/formatters/latex.pyi @@ -1,11 +1,11 @@ from typing import Any, TypeVar -from pygments.formatter import Formatter +from pygments.formatter import _TextFormatter from pygments.lexer import Lexer _T = TypeVar("_T", str, bytes) -class LatexFormatter(Formatter[_T]): +class LatexFormatter(_TextFormatter[_T]): name: str aliases: Any filenames: Any diff --git a/stubs/Pygments/pygments/formatters/other.pyi b/stubs/Pygments/pygments/formatters/other.pyi index e02007b00c03..4158d26bb529 100644 --- a/stubs/Pygments/pygments/formatters/other.pyi +++ b/stubs/Pygments/pygments/formatters/other.pyi @@ -1,16 +1,16 @@ from typing import Any, TypeVar -from pygments.formatter import Formatter +from pygments.formatter import _TextFormatter _T = TypeVar("_T", str, bytes) -class NullFormatter(Formatter[_T]): +class NullFormatter(_TextFormatter[_T]): name: str aliases: Any filenames: Any def format(self, tokensource, outfile) -> None: ... -class RawTokenFormatter(Formatter[_T]): +class RawTokenFormatter(_TextFormatter[_T]): name: str aliases: Any filenames: Any @@ -20,7 +20,7 @@ class RawTokenFormatter(Formatter[_T]): error_color: Any def format(self, tokensource, outfile) -> None: ... -class TestcaseFormatter(Formatter[_T]): +class TestcaseFormatter(_TextFormatter[_T]): name: str aliases: Any def format(self, tokensource, outfile) -> None: ... diff --git a/stubs/Pygments/pygments/formatters/pangomarkup.pyi b/stubs/Pygments/pygments/formatters/pangomarkup.pyi index d266bbe3f295..a768976ea2e2 100644 --- a/stubs/Pygments/pygments/formatters/pangomarkup.pyi +++ b/stubs/Pygments/pygments/formatters/pangomarkup.pyi @@ -1,10 +1,10 @@ from typing import Any, TypeVar -from pygments.formatter import Formatter +from pygments.formatter import _TextFormatter _T = TypeVar("_T", str, bytes) -class PangoMarkupFormatter(Formatter[_T]): +class PangoMarkupFormatter(_TextFormatter[_T]): name: str aliases: Any filenames: Any diff --git a/stubs/Pygments/pygments/formatters/rtf.pyi b/stubs/Pygments/pygments/formatters/rtf.pyi index 900f43d6f38b..5756eb4ff71a 100644 --- a/stubs/Pygments/pygments/formatters/rtf.pyi +++ b/stubs/Pygments/pygments/formatters/rtf.pyi @@ -1,10 +1,10 @@ from typing import Any, TypeVar -from pygments.formatter import Formatter +from pygments.formatter import _TextFormatter _T = TypeVar("_T", str, bytes) -class RtfFormatter(Formatter[_T]): +class RtfFormatter(_TextFormatter[_T]): name: str aliases: Any filenames: Any diff --git a/stubs/Pygments/pygments/formatters/svg.pyi b/stubs/Pygments/pygments/formatters/svg.pyi index f349157c0cc5..96b1fa8aab8a 100644 --- a/stubs/Pygments/pygments/formatters/svg.pyi +++ b/stubs/Pygments/pygments/formatters/svg.pyi @@ -1,10 +1,10 @@ from typing import Any, TypeVar -from pygments.formatter import Formatter +from pygments.formatter import _TextFormatter _T = TypeVar("_T", str, bytes) -class SvgFormatter(Formatter[_T]): +class SvgFormatter(_TextFormatter[_T]): name: str aliases: Any filenames: Any diff --git a/stubs/Pygments/pygments/formatters/terminal.pyi b/stubs/Pygments/pygments/formatters/terminal.pyi index 7448f17a695d..5b777d01f364 100644 --- a/stubs/Pygments/pygments/formatters/terminal.pyi +++ b/stubs/Pygments/pygments/formatters/terminal.pyi @@ -1,10 +1,10 @@ from typing import Any, TypeVar -from pygments.formatter import Formatter +from pygments.formatter import _TextFormatter _T = TypeVar("_T", str, bytes) -class TerminalFormatter(Formatter[_T]): +class TerminalFormatter(_TextFormatter[_T]): name: str aliases: Any filenames: Any diff --git a/stubs/Pygments/pygments/formatters/terminal256.pyi b/stubs/Pygments/pygments/formatters/terminal256.pyi index 69f30cc1929a..95315b14c23e 100644 --- a/stubs/Pygments/pygments/formatters/terminal256.pyi +++ b/stubs/Pygments/pygments/formatters/terminal256.pyi @@ -1,6 +1,6 @@ from typing import Any, TypeVar -from pygments.formatter import Formatter +from pygments.formatter import _TextFormatter _T = TypeVar("_T", str, bytes) @@ -18,7 +18,7 @@ class EscapeSequence: def true_color_string(self): ... def reset_string(self): ... -class Terminal256Formatter(Formatter[_T]): +class Terminal256Formatter(_TextFormatter[_T]): name: str aliases: Any filenames: Any diff --git a/stubs/Pygments/pygments/plugin.pyi b/stubs/Pygments/pygments/plugin.pyi index 81e3554c082c..c014019c762a 100644 --- a/stubs/Pygments/pygments/plugin.pyi +++ b/stubs/Pygments/pygments/plugin.pyi @@ -2,7 +2,7 @@ from typing import Any, Generator, Iterable from pkg_resources import EntryPoint from pygments.filter import Filter -from pygments.formatter import Formatter +from pygments.formatter import _Formatter from pygments.lexer import Lexer from pygments.style import Style @@ -13,6 +13,6 @@ FILTER_ENTRY_POINT: str def iter_entry_points(group_name: str) -> Iterable[EntryPoint]: ... def find_plugin_lexers() -> Generator[type[Lexer], None, None]: ... -def find_plugin_formatters() -> Generator[tuple[str, type[Formatter[Any]]], None, None]: ... +def find_plugin_formatters() -> Generator[tuple[str, type[_Formatter[Any]]], None, None]: ... def find_plugin_styles() -> Generator[tuple[str, type[Style]], None, None]: ... def find_plugin_filters() -> Generator[tuple[str, type[Filter]], None, None]: ...