77
88from .findtests import findtestdir
99from .result import TestResult
10- lazy from .results import TestResults
10+ from .results import TestResults
1111from .runtests import RunTests
1212from .utils import count
1313
@@ -31,20 +31,20 @@ def summary(self, results: TestResults, state: str) -> None:
3131 @staticmethod
3232 def parse_traceback (traceback : str ) -> tuple [str | None , str | None , str ]:
3333 """Return (filename, line, exception) of a failure."""
34- frames = re .findall (r'^ *File "(.*)", line (\d+)' , traceback ,
35- re .MULTILINE )
36- test_frames = [frame for frame in frames
37- if pathlib .Path (frame [0 ]).name .startswith ('test_' )]
34+ # A frame is its "File" line and its source lines
35+ frames = list (re .finditer (
36+ r'^ *File "(.*)", line (\d+).*\n(?: .*\n)*' , traceback ,
37+ re .MULTILINE ))
38+ filename = line = None
39+ exception = traceback
40+ if frames :
41+ filename , line = frames [0 ].groups ()
42+ exception = traceback [frames [- 1 ].end ():]
3843 # Prefer the last frame in a test file, the assertion
39- if test_frames :
40- filename , line = test_frames [- 1 ]
41- elif frames :
42- filename , line = frames [0 ]
43- else :
44- filename = line = None
45- exception = re .split (r'^ File .*\n(?: .*\n)*' , traceback ,
46- flags = re .MULTILINE )[- 1 ].strip ()
47- return filename , line , exception
44+ for frame in frames :
45+ if pathlib .Path (frame [1 ]).name .startswith ("test_" ):
46+ filename , line = frame .groups ()
47+ return filename , line , exception .strip ()
4848
4949
5050def get_reporter () -> Reporter :
@@ -93,7 +93,8 @@ def test_result(self, result: TestResult) -> None:
9393 self .annotate (result .test_name , decolor (message ), filename )
9494
9595 def annotate (self , title : str , message : str , filename : str | None ,
96- line : str | None = None , stream : TextIO | None = None ) -> None :
96+ line : str | None = None ,
97+ stream : TextIO | None = None ) -> None :
9798 if filename :
9899 # Make installed stdlib paths relative to the checkout
99100 path = pathlib .Path (filename )
@@ -120,8 +121,8 @@ def summary(self, results: TestResults, state: str) -> None:
120121 for result in failed :
121122 blocks .append (f"### { decolor (str (result ))} " )
122123 if result .env_changed_reasons :
123- blocks .append ("\n " .join (f"- { reason } "
124- for reason in result .env_changed_reasons ))
124+ blocks .append ("\n " .join (
125+ f"- { reason } " for reason in result .env_changed_reasons ))
125126 for name , traceback in result .failed_test_cases :
126127 # Expand short tracebacks if there are only a few
127128 if ncases <= 5 and traceback .count ("\n " ) < 30 :
0 commit comments