@@ -387,7 +387,9 @@ def __init__(self, config: Config, file: TextIO | None = None) -> None:
387387 self .reportchars = getreportopt (config )
388388 self .foldskipped = config .option .fold_skipped
389389 self .hasmarkup = self ._tw .hasmarkup
390- self .isatty = file .isatty ()
390+ # isatty should be a method but was wrongly implemented as a boolean.
391+ # We use _CallableBool here to support both.
392+ self .isatty = _CallableBool (file .isatty ())
391393 self ._progress_nodeids_reported : set [str ] = set ()
392394 self ._timing_nodeids_reported : set [str ] = set ()
393395 self ._show_progress_info = self ._determine_show_progress_info ()
@@ -766,7 +768,7 @@ def _width_of_current_line(self) -> int:
766768 return self ._tw .width_of_current_line
767769
768770 def pytest_collection (self ) -> None :
769- if self .isatty :
771+ if self .isatty () :
770772 if self .config .option .verbose >= 0 :
771773 self .write ("collecting ... " , flush = True , bold = True )
772774 elif self .config .option .verbose >= 1 :
@@ -779,7 +781,7 @@ def pytest_collectreport(self, report: CollectReport) -> None:
779781 self ._add_stats ("skipped" , [report ])
780782 items = [x for x in report .result if isinstance (x , Item )]
781783 self ._numcollected += len (items )
782- if self .isatty :
784+ if self .isatty () :
783785 self .report_collect ()
784786
785787 def report_collect (self , final : bool = False ) -> None :
@@ -811,7 +813,7 @@ def report_collect(self, final: bool = False) -> None:
811813 line += f" / { skipped } skipped"
812814 if self ._numcollected > selected :
813815 line += f" / { selected } selected"
814- if self .isatty :
816+ if self .isatty () :
815817 self .rewrite (line , bold = True , erase = True )
816818 if final :
817819 self .write ("\n " )
@@ -1636,3 +1638,14 @@ def _get_raw_skip_reason(report: TestReport) -> str:
16361638 elif reason == "Skipped" :
16371639 reason = ""
16381640 return reason
1641+
1642+
1643+ class _CallableBool :
1644+ def __init__ (self , value : bool ):
1645+ self ._value = value
1646+
1647+ def __bool__ (self ):
1648+ return self ._value
1649+
1650+ def __call__ (self ):
1651+ return self ._value
0 commit comments