config: typing for create_terminal_writer, re-export TerminalWriter

This also imports `TerminalWriter` explicitly via `_pytest._io`,
allowing for easier extending / replacing it.
This commit is contained in:
Daniel Hahler
2020-01-23 12:45:38 +01:00
parent 6b13379f37
commit 03bc8aba4e
10 changed files with 37 additions and 28 deletions

View File

@@ -29,6 +29,7 @@ import pluggy
import py
import _pytest
from _pytest._io import TerminalWriter
from _pytest._io.saferepr import safeformat
from _pytest._io.saferepr import saferepr
from _pytest.compat import overload
@@ -915,14 +916,14 @@ class TerminalRepr:
# FYI this is called from pytest-xdist's serialization of exception
# information.
io = StringIO()
tw = py.io.TerminalWriter(file=io)
tw = TerminalWriter(file=io)
self.toterminal(tw)
return io.getvalue().strip()
def __repr__(self) -> str:
return "<{} instance at {:0x}>".format(self.__class__, id(self))
def toterminal(self, tw: py.io.TerminalWriter) -> None:
def toterminal(self, tw: TerminalWriter) -> None:
raise NotImplementedError()
@@ -933,7 +934,7 @@ class ExceptionRepr(TerminalRepr):
def addsection(self, name: str, content: str, sep: str = "-") -> None:
self.sections.append((name, content, sep))
def toterminal(self, tw: py.io.TerminalWriter) -> None:
def toterminal(self, tw: TerminalWriter) -> None:
for name, content, sep in self.sections:
tw.sep(sep, name)
tw.line(content)
@@ -953,7 +954,7 @@ class ExceptionChainRepr(ExceptionRepr):
self.reprtraceback = chain[-1][0]
self.reprcrash = chain[-1][1]
def toterminal(self, tw: py.io.TerminalWriter) -> None:
def toterminal(self, tw: TerminalWriter) -> None:
for element in self.chain:
element[0].toterminal(tw)
if element[2] is not None:
@@ -970,7 +971,7 @@ class ReprExceptionInfo(ExceptionRepr):
self.reprtraceback = reprtraceback
self.reprcrash = reprcrash
def toterminal(self, tw: py.io.TerminalWriter) -> None:
def toterminal(self, tw: TerminalWriter) -> None:
self.reprtraceback.toterminal(tw)
super().toterminal(tw)
@@ -988,7 +989,7 @@ class ReprTraceback(TerminalRepr):
self.extraline = extraline
self.style = style
def toterminal(self, tw: py.io.TerminalWriter) -> None:
def toterminal(self, tw: TerminalWriter) -> None:
# the entries might have different styles
for i, entry in enumerate(self.reprentries):
if entry.style == "long":
@@ -1020,7 +1021,7 @@ class ReprEntryNative(TerminalRepr):
def __init__(self, tblines: Sequence[str]) -> None:
self.lines = tblines
def toterminal(self, tw: py.io.TerminalWriter) -> None:
def toterminal(self, tw: TerminalWriter) -> None:
tw.write("".join(self.lines))
@@ -1039,7 +1040,7 @@ class ReprEntry(TerminalRepr):
self.reprfileloc = filelocrepr
self.style = style
def toterminal(self, tw: py.io.TerminalWriter) -> None:
def toterminal(self, tw: TerminalWriter) -> None:
if self.style == "short":
assert self.reprfileloc is not None
self.reprfileloc.toterminal(tw)
@@ -1072,7 +1073,7 @@ class ReprFileLocation(TerminalRepr):
self.lineno = lineno
self.message = message
def toterminal(self, tw: py.io.TerminalWriter) -> None:
def toterminal(self, tw: TerminalWriter) -> None:
# filename and lineno output for each entry,
# using an output format that most editors understand
msg = self.message
@@ -1087,7 +1088,7 @@ class ReprLocals(TerminalRepr):
def __init__(self, lines: Sequence[str]) -> None:
self.lines = lines
def toterminal(self, tw: py.io.TerminalWriter) -> None:
def toterminal(self, tw: TerminalWriter) -> None:
for line in self.lines:
tw.line(line)
@@ -1096,7 +1097,7 @@ class ReprFuncArgs(TerminalRepr):
def __init__(self, args: Sequence[Tuple[str, object]]) -> None:
self.args = args
def toterminal(self, tw: py.io.TerminalWriter) -> None:
def toterminal(self, tw: TerminalWriter) -> None:
if self.args:
linesofar = ""
for name, value in self.args: