Skip to content

Commit fb16d3e

Browse files
authored
capture: revisit/fix __repr__, define _in_suspended (pytest-dev#6749)
1 parent 2b13a9b commit fb16d3e

2 files changed

Lines changed: 31 additions & 14 deletions

File tree

src/_pytest/capture.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@ def __getattr__(self, name):
438438
class MultiCapture:
439439
out = err = in_ = None
440440
_state = None
441+
_in_suspended = False
441442

442443
def __init__(self, out=True, err=True, in_=True, Capture=None):
443444
if in_:
@@ -449,11 +450,7 @@ def __init__(self, out=True, err=True, in_=True, Capture=None):
449450

450451
def __repr__(self):
451452
return "<MultiCapture out={!r} err={!r} in_={!r} _state={!r} _in_suspended={!r}>".format(
452-
self.out,
453-
self.err,
454-
self.in_,
455-
self._state,
456-
getattr(self, "_in_suspended", "<UNSET>"),
453+
self.out, self.err, self.in_, self._state, self._in_suspended,
457454
)
458455

459456
def start_capturing(self):
@@ -490,9 +487,9 @@ def resume_capturing(self):
490487
self.out.resume()
491488
if self.err:
492489
self.err.resume()
493-
if hasattr(self, "_in_suspended"):
490+
if self._in_suspended:
494491
self.in_.resume()
495-
del self._in_suspended
492+
self._in_suspended = False
496493

497494
def stop_capturing(self):
498495
""" stop capturing and reset capturing streams """
@@ -555,8 +552,12 @@ def __init__(self, targetfd, tmpfile=None):
555552
self.tmpfile_fd = tmpfile.fileno()
556553

557554
def __repr__(self):
558-
return "<FDCapture {} oldfd={} _state={!r}>".format(
559-
self.targetfd, getattr(self, "targetfd_save", None), self._state
555+
return "<{} {} oldfd={} _state={!r} tmpfile={}>".format(
556+
self.__class__.__name__,
557+
self.targetfd,
558+
getattr(self, "targetfd_save", "<UNSET>"),
559+
self._state,
560+
hasattr(self, "tmpfile") and repr(self.tmpfile) or "<UNSET>",
560561
)
561562

562563
def _start(self):
@@ -637,8 +638,12 @@ def __init__(self, fd, tmpfile=None):
637638
self.tmpfile = tmpfile
638639

639640
def __repr__(self):
640-
return "<SysCapture {} _old={!r}, tmpfile={!r} _state={!r}>".format(
641-
self.name, self._old, self.tmpfile, self._state
641+
return "<{} {} _old={} _state={!r} tmpfile={!r}>".format(
642+
self.__class__.__name__,
643+
self.name,
644+
hasattr(self, "_old") and repr(self._old) or "<UNSET>",
645+
self._state,
646+
self.tmpfile,
642647
)
643648

644649
def start(self):

testing/test_capture.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,6 +1005,18 @@ def test_simple_resume_suspend(self):
10051005
cap.done()
10061006
pytest.raises(AttributeError, cap.suspend)
10071007

1008+
assert repr(cap) == (
1009+
"<FDCapture 1 oldfd=<UNSET> _state='done' tmpfile={!r}>".format(
1010+
cap.tmpfile
1011+
)
1012+
)
1013+
# Should not crash with missing "_old".
1014+
assert repr(cap.syscapture) == (
1015+
"<SysCapture stdout _old=<UNSET> _state='done' tmpfile={!r}>".format(
1016+
cap.syscapture.tmpfile
1017+
)
1018+
)
1019+
10081020
def test_capfd_sys_stdout_mode(self, capfd):
10091021
assert "b" not in sys.stdout.mode
10101022

@@ -1212,19 +1224,19 @@ def StdCaptureFD(out=True, err=True, in_=True):
12121224
def test_stdout():
12131225
os.close(1)
12141226
cap = StdCaptureFD(out=True, err=False, in_=False)
1215-
assert repr(cap.out) == "<FDCapture 1 oldfd=None _state=None>"
1227+
assert repr(cap.out) == "<FDCapture 1 oldfd=<UNSET> _state=None tmpfile=<UNSET>>"
12161228
cap.stop_capturing()
12171229
12181230
def test_stderr():
12191231
os.close(2)
12201232
cap = StdCaptureFD(out=False, err=True, in_=False)
1221-
assert repr(cap.err) == "<FDCapture 2 oldfd=None _state=None>"
1233+
assert repr(cap.err) == "<FDCapture 2 oldfd=<UNSET> _state=None tmpfile=<UNSET>>"
12221234
cap.stop_capturing()
12231235
12241236
def test_stdin():
12251237
os.close(0)
12261238
cap = StdCaptureFD(out=False, err=False, in_=True)
1227-
assert repr(cap.in_) == "<FDCapture 0 oldfd=None _state=None>"
1239+
assert repr(cap.in_) == "<FDCapture 0 oldfd=<UNSET> _state=None tmpfile=<UNSET>>"
12281240
cap.stop_capturing()
12291241
"""
12301242
)

0 commit comments

Comments
 (0)