Skip to content

Commit 0332aa0

Browse files
committed
Make pygments dependency required
Closes #7683
1 parent afdf03b commit 0332aa0

File tree

3 files changed

+19
-38
lines changed

3 files changed

+19
-38
lines changed

changelog/7683.improvement.rst

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
The formerly optional ``pygments`` dependency is now required, causing output always to be source-highlighted (unless disabled via the ``--code-highlight=no`` CLI option).

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,14 @@ dependencies = [
5151
"iniconfig",
5252
"packaging",
5353
"pluggy>=1.5,<2",
54+
"pygments>=2.7.2",
5455
"tomli>=1; python_version<'3.11'",
5556
]
5657
optional-dependencies.dev = [
5758
"argcomplete",
5859
"attrs>=19.2",
5960
"hypothesis>=3.56",
6061
"mock",
61-
"pygments>=2.7.2",
6262
"requests",
6363
"setuptools",
6464
"xmlschema",

src/_pytest/_io/terminalwriter.py

+17-37
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,17 @@
99
from typing import final
1010
from typing import Literal
1111
from typing import TextIO
12-
from typing import TYPE_CHECKING
12+
13+
import pygments
14+
from pygments.formatters.terminal import TerminalFormatter
15+
from pygments.lexer import Lexer
16+
from pygments.lexers.diff import DiffLexer
17+
from pygments.lexers.python import PythonLexer
1318

1419
from ..compat import assert_never
1520
from .wcwidth import wcswidth
1621

1722

18-
if TYPE_CHECKING:
19-
from pygments.formatter import Formatter
20-
from pygments.lexer import Lexer
21-
22-
2323
# This code was initially copied from py 1.8.1, file _io/terminalwriter.py.
2424

2525

@@ -201,37 +201,22 @@ def _write_source(self, lines: Sequence[str], indents: Sequence[str] = ()) -> No
201201
for indent, new_line in zip(indents, new_lines):
202202
self.line(indent + new_line)
203203

204-
def _get_pygments_lexer(self, lexer: Literal["python", "diff"]) -> Lexer | None:
205-
try:
206-
if lexer == "python":
207-
from pygments.lexers.python import PythonLexer
208-
209-
return PythonLexer()
210-
elif lexer == "diff":
211-
from pygments.lexers.diff import DiffLexer
212-
213-
return DiffLexer()
214-
else:
215-
assert_never(lexer)
216-
except ModuleNotFoundError:
217-
return None
218-
219-
def _get_pygments_formatter(self) -> Formatter | None:
220-
try:
221-
import pygments.util
222-
except ModuleNotFoundError:
223-
return None
204+
def _get_pygments_lexer(self, lexer: Literal["python", "diff"]) -> Lexer:
205+
if lexer == "python":
206+
return PythonLexer()
207+
elif lexer == "diff":
208+
return DiffLexer()
209+
else:
210+
assert_never(lexer)
224211

212+
def _get_pygments_formatter(self) -> TerminalFormatter:
225213
from _pytest.config.exceptions import UsageError
226214

227215
theme = os.getenv("PYTEST_THEME")
228216
theme_mode = os.getenv("PYTEST_THEME_MODE", "dark")
229217

230218
try:
231-
from pygments.formatters.terminal import TerminalFormatter
232-
233219
return TerminalFormatter(bg=theme_mode, style=theme)
234-
235220
except pygments.util.ClassNotFound as e:
236221
raise UsageError(
237222
f"PYTEST_THEME environment variable has an invalid value: '{theme}'. "
@@ -251,16 +236,11 @@ def _highlight(
251236
return source
252237

253238
pygments_lexer = self._get_pygments_lexer(lexer)
254-
if pygments_lexer is None:
255-
return source
256-
257239
pygments_formatter = self._get_pygments_formatter()
258-
if pygments_formatter is None:
259-
return source
260-
261-
from pygments import highlight
262240

263-
highlighted: str = highlight(source, pygments_lexer, pygments_formatter)
241+
highlighted: str = pygments.highlight(
242+
source, pygments_lexer, pygments_formatter
243+
)
264244
# pygments terminal formatter may add a newline when there wasn't one.
265245
# We don't want this, remove.
266246
if highlighted[-1] == "\n" and source[-1] != "\n":

0 commit comments

Comments
 (0)