3131
3232import pluggy
3333
34+ from _pytest import compat
3435from _pytest import nodes
3536from _pytest import timing
3637from _pytest ._code import ExceptionInfo
@@ -387,7 +388,9 @@ def __init__(self, config: Config, file: TextIO | None = None) -> None:
387388 self .reportchars = getreportopt (config )
388389 self .foldskipped = config .option .fold_skipped
389390 self .hasmarkup = self ._tw .hasmarkup
390- self .isatty = file .isatty ()
391+ # isatty should be a method but was wrongly implemented as a boolean.
392+ # We use CallableBool here to support both.
393+ self .isatty = compat .CallableBool (file .isatty ())
391394 self ._progress_nodeids_reported : set [str ] = set ()
392395 self ._timing_nodeids_reported : set [str ] = set ()
393396 self ._show_progress_info = self ._determine_show_progress_info ()
@@ -766,7 +769,7 @@ def _width_of_current_line(self) -> int:
766769 return self ._tw .width_of_current_line
767770
768771 def pytest_collection (self ) -> None :
769- if self .isatty :
772+ if self .isatty () :
770773 if self .config .option .verbose >= 0 :
771774 self .write ("collecting ... " , flush = True , bold = True )
772775 elif self .config .option .verbose >= 1 :
@@ -779,7 +782,7 @@ def pytest_collectreport(self, report: CollectReport) -> None:
779782 self ._add_stats ("skipped" , [report ])
780783 items = [x for x in report .result if isinstance (x , Item )]
781784 self ._numcollected += len (items )
782- if self .isatty :
785+ if self .isatty () :
783786 self .report_collect ()
784787
785788 def report_collect (self , final : bool = False ) -> None :
@@ -811,7 +814,7 @@ def report_collect(self, final: bool = False) -> None:
811814 line += f" / { skipped } skipped"
812815 if self ._numcollected > selected :
813816 line += f" / { selected } selected"
814- if self .isatty :
817+ if self .isatty () :
815818 self .rewrite (line , bold = True , erase = True )
816819 if final :
817820 self .write ("\n " )
0 commit comments