From fb16d3e27ac6e5353cd71b9e61dc1c24a5136a88 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Thu, 20 Feb 2020 00:51:57 +0100 Subject: [PATCH] capture: revisit/fix __repr__, define _in_suspended (#6749) --- src/_pytest/capture.py | 27 ++++++++++++++++----------- testing/test_capture.py | 18 +++++++++++++++--- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/_pytest/capture.py b/src/_pytest/capture.py index d3f10da2f..54c084205 100644 --- a/src/_pytest/capture.py +++ b/src/_pytest/capture.py @@ -438,6 +438,7 @@ 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_: @@ -449,11 +450,7 @@ class MultiCapture: def __repr__(self): return "".format( - self.out, - self.err, - self.in_, - self._state, - getattr(self, "_in_suspended", ""), + self.out, self.err, self.in_, self._state, self._in_suspended, ) def start_capturing(self): @@ -490,9 +487,9 @@ class MultiCapture: self.out.resume() if self.err: self.err.resume() - if hasattr(self, "_in_suspended"): + if self._in_suspended: self.in_.resume() - del self._in_suspended + self._in_suspended = False def stop_capturing(self): """ stop capturing and reset capturing streams """ @@ -555,8 +552,12 @@ class FDCaptureBinary: self.tmpfile_fd = tmpfile.fileno() def __repr__(self): - return "".format( - self.targetfd, getattr(self, "targetfd_save", None), self._state + return "<{} {} oldfd={} _state={!r} tmpfile={}>".format( + self.__class__.__name__, + self.targetfd, + getattr(self, "targetfd_save", ""), + self._state, + hasattr(self, "tmpfile") and repr(self.tmpfile) or "", ) def _start(self): @@ -637,8 +638,12 @@ class SysCapture: self.tmpfile = tmpfile def __repr__(self): - return "".format( - self.name, self._old, self.tmpfile, self._state + return "<{} {} _old={} _state={!r} tmpfile={!r}>".format( + self.__class__.__name__, + self.name, + hasattr(self, "_old") and repr(self._old) or "", + self._state, + self.tmpfile, ) def start(self): diff --git a/testing/test_capture.py b/testing/test_capture.py index 7447d9742..e8e09ae73 100644 --- a/testing/test_capture.py +++ b/testing/test_capture.py @@ -1005,6 +1005,18 @@ class TestFDCapture: cap.done() pytest.raises(AttributeError, cap.suspend) + assert repr(cap) == ( + " _state='done' tmpfile={!r}>".format( + cap.tmpfile + ) + ) + # Should not crash with missing "_old". + assert repr(cap.syscapture) == ( + " _state='done' tmpfile={!r}>".format( + cap.syscapture.tmpfile + ) + ) + def test_capfd_sys_stdout_mode(self, capfd): assert "b" not in sys.stdout.mode @@ -1212,19 +1224,19 @@ class TestStdCaptureFDinvalidFD: def test_stdout(): os.close(1) cap = StdCaptureFD(out=True, err=False, in_=False) - assert repr(cap.out) == "" + assert repr(cap.out) == " _state=None tmpfile=>" cap.stop_capturing() def test_stderr(): os.close(2) cap = StdCaptureFD(out=False, err=True, in_=False) - assert repr(cap.err) == "" + assert repr(cap.err) == " _state=None tmpfile=>" cap.stop_capturing() def test_stdin(): os.close(0) cap = StdCaptureFD(out=False, err=False, in_=True) - assert repr(cap.in_) == "" + assert repr(cap.in_) == " _state=None tmpfile=>" cap.stop_capturing() """ )