From 491239d9b27670d55cee21f9141a2bc91cf44f16 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Sun, 12 Apr 2020 20:47:28 +0300 Subject: [PATCH] capture: remove some indirection in MultiCapture Removing this indirection enables some further clean ups. --- src/_pytest/capture.py | 22 +++++++++------------- src/_pytest/pytester.py | 5 ++--- testing/test_capture.py | 37 ++++++++++++++++++++++++++++--------- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/_pytest/capture.py b/src/_pytest/capture.py index 323881151..201bcd962 100644 --- a/src/_pytest/capture.py +++ b/src/_pytest/capture.py @@ -71,13 +71,13 @@ def pytest_load_initial_conftests(early_config: Config): def _get_multicapture(method: "_CaptureMethod") -> "MultiCapture": if method == "fd": - return MultiCapture(out=True, err=True, Capture=FDCapture) + return MultiCapture(in_=FDCapture(0), out=FDCapture(1), err=FDCapture(2)) elif method == "sys": - return MultiCapture(out=True, err=True, Capture=SysCapture) + return MultiCapture(in_=SysCapture(0), out=SysCapture(1), err=SysCapture(2)) elif method == "no": - return MultiCapture(out=False, err=False, in_=False) + return MultiCapture(in_=None, out=None, err=None) elif method == "tee-sys": - return MultiCapture(out=True, err=True, in_=False, Capture=TeeSysCapture) + return MultiCapture(in_=None, out=TeeSysCapture(1), err=TeeSysCapture(2)) raise ValueError("unknown capturing method: {!r}".format(method)) @@ -354,7 +354,7 @@ class CaptureFixture: def _start(self): if self._capture is None: self._capture = MultiCapture( - out=True, err=True, in_=False, Capture=self.captureclass + in_=None, out=self.captureclass(1), err=self.captureclass(2), ) self._capture.start_capturing() @@ -418,17 +418,13 @@ CaptureResult = collections.namedtuple("CaptureResult", ["out", "err"]) class MultiCapture: - out = err = in_ = None _state = None _in_suspended = False - def __init__(self, out=True, err=True, in_=True, Capture=None): - if in_: - self.in_ = Capture(0) - if out: - self.out = Capture(1) - if err: - self.err = Capture(2) + def __init__(self, in_, out, err) -> None: + self.in_ = in_ + self.out = out + self.err = err def __repr__(self): return "".format( diff --git a/src/_pytest/pytester.py b/src/_pytest/pytester.py index 1da478736..9df86a22f 100644 --- a/src/_pytest/pytester.py +++ b/src/_pytest/pytester.py @@ -25,8 +25,7 @@ import py import pytest from _pytest._code import Source -from _pytest.capture import MultiCapture -from _pytest.capture import SysCapture +from _pytest.capture import _get_multicapture from _pytest.compat import TYPE_CHECKING from _pytest.config import _PluggyPlugin from _pytest.config import Config @@ -972,7 +971,7 @@ class Testdir: if syspathinsert: self.syspathinsert() now = time.time() - capture = MultiCapture(Capture=SysCapture) + capture = _get_multicapture("sys") capture.start_capturing() try: try: diff --git a/testing/test_capture.py b/testing/test_capture.py index 177d72ebc..fa4f523d9 100644 --- a/testing/test_capture.py +++ b/testing/test_capture.py @@ -19,16 +19,28 @@ from _pytest.config import ExitCode # pylib 1.4.20.dev2 (rev 13d9af95547e) -def StdCaptureFD(out=True, err=True, in_=True): - return capture.MultiCapture(out, err, in_, Capture=capture.FDCapture) +def StdCaptureFD(out: bool = True, err: bool = True, in_: bool = True) -> MultiCapture: + return capture.MultiCapture( + in_=capture.FDCapture(0) if in_ else None, + out=capture.FDCapture(1) if out else None, + err=capture.FDCapture(2) if err else None, + ) -def StdCapture(out=True, err=True, in_=True): - return capture.MultiCapture(out, err, in_, Capture=capture.SysCapture) +def StdCapture(out: bool = True, err: bool = True, in_: bool = True) -> MultiCapture: + return capture.MultiCapture( + in_=capture.SysCapture(0) if in_ else None, + out=capture.SysCapture(1) if out else None, + err=capture.SysCapture(2) if err else None, + ) -def TeeStdCapture(out=True, err=True, in_=True): - return capture.MultiCapture(out, err, in_, Capture=capture.TeeSysCapture) +def TeeStdCapture(out: bool = True, err: bool = True, in_: bool = True) -> MultiCapture: + return capture.MultiCapture( + in_=capture.TeeSysCapture(0) if in_ else None, + out=capture.TeeSysCapture(1) if out else None, + err=capture.TeeSysCapture(2) if err else None, + ) class TestCaptureManager: @@ -1154,7 +1166,11 @@ class TestStdCaptureFDinvalidFD: from _pytest import capture def StdCaptureFD(out=True, err=True, in_=True): - return capture.MultiCapture(out, err, in_, Capture=capture.FDCapture) + return capture.MultiCapture( + in_=capture.FDCapture(0) if in_ else None, + out=capture.FDCapture(1) if out else None, + err=capture.FDCapture(2) if err else None, + ) def test_stdout(): os.close(1) @@ -1284,8 +1300,11 @@ def test_capturing_and_logging_fundamentals(testdir, method): import sys, os import py, logging from _pytest import capture - cap = capture.MultiCapture(out=False, in_=False, - Capture=capture.%s) + cap = capture.MultiCapture( + in_=None, + out=None, + err=capture.%s(2), + ) cap.start_capturing() logging.warning("hello1")