Skip to content

Commit ea574a8

Browse files
committed
Show time taken in GitHub annotation
1 parent 8baef0b commit ea574a8

File tree

3 files changed

+57
-7
lines changed

3 files changed

+57
-7
lines changed

src/sage/doctest/forker.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,7 +1235,7 @@ def compile_and_execute(self, example, compiler, globs):
12351235
example.total_state = self.running_global_digest.hexdigest()
12361236
example.doctest_state = self.running_doctest_digest.hexdigest()
12371237

1238-
def _failure_header(self, test, example, message='Failed example:'):
1238+
def _failure_header(self, test, example, message='Failed example:', extra=None):
12391239
"""
12401240
We strip out ``sage:`` prompts, so we override
12411241
:meth:`doctest.DocTestRunner._failure_header` for better
@@ -1247,6 +1247,14 @@ def _failure_header(self, test, example, message='Failed example:'):
12471247
12481248
- ``example`` -- a :class:`doctest.Example` instance in ``test``
12491249
1250+
- ``message`` -- a message to be shown. Must not have a newline
1251+
1252+
- ``extra`` -- an extra message to be shown in GitHub annotation
1253+
1254+
Note that ``message`` and ``extra`` are not accepted by
1255+
:meth:`doctest.DocTestRunner._failure_header`, as such by Liskov
1256+
substitution principle this method must be callable without passing those.
1257+
12501258
OUTPUT: string used for reporting that the given example failed
12511259
12521260
EXAMPLES::
@@ -1310,6 +1318,8 @@ def _failure_header(self, test, example, message='Failed example:'):
13101318
message += ' [failed in baseline]'
13111319
else:
13121320
command = f'::error title={message}'
1321+
if extra:
1322+
message += f': {extra}'
13131323
if extra := getattr(example, 'extra', None):
13141324
message += f': {extra}'
13151325
if test.filename:
@@ -1610,12 +1620,12 @@ def report_overtime(self, out, test, example, got, *, check_timer=None):
16101620
Test ran for 1.23s cpu, 2.50s wall
16111621
Check ran for 2.34s cpu, 3.12s wall
16121622
"""
1613-
out(self._failure_header(test, example, 'Warning: slow doctest:') +
1614-
('Test ran for %.2fs cpu, %.2fs wall\nCheck ran for %.2fs cpu, %.2fs wall\n'
1615-
% (example.cputime,
1616-
example.walltime,
1617-
check_timer.cputime,
1618-
check_timer.walltime)))
1623+
time_info = ('Test ran for %.2fs cpu, %.2fs wall\nCheck ran for %.2fs cpu, %.2fs wall\n'
1624+
% (example.cputime,
1625+
example.walltime,
1626+
check_timer.cputime,
1627+
check_timer.walltime))
1628+
out(self._failure_header(test, example, 'Warning: slow doctest:', time_info) + time_info)
16191629

16201630
def report_unexpected_exception(self, out, test, example, exc_info):
16211631
r"""

src/sage/doctest/test.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,42 @@
4747
...
4848
0
4949
50+
Check slow doctest warnings are correctly raised::
51+
52+
sage: subprocess.call(["sage", "-t", "--warn-long", # long time
53+
....: "--random-seed=0", "--optional=sage", "sleep2.rst"], **kwds)
54+
Running doctests...
55+
Doctesting 1 file.
56+
sage -t --warn-long --random-seed=0 sleep2.rst
57+
**********************************************************************
58+
File "sleep2.rst", line 4, in sage.doctest.tests.sleep2
59+
Warning: slow doctest:
60+
while walltime(t) < 2: pass
61+
Test ran for ...s cpu, ...s wall
62+
Check ran for ...s cpu, ...s wall
63+
[2 tests, ...s wall]
64+
----------------------------------------------------------------------
65+
All tests passed!
66+
----------------------------------------------------------------------
67+
...
68+
0
69+
sage: subprocess.call(["sage", "-t", "--format=github", "--warn-long", # long time
70+
....: "--random-seed=0", "--optional=sage", "sleep2.rst"], **kwds)
71+
Running doctests...
72+
Doctesting 1 file.
73+
sage -t --warn-long --random-seed=0 sleep2.rst
74+
**********************************************************************
75+
::warning title=Warning: slow doctest:,file=sleep2.rst,line=4::slow doctest:: Test ran for ...s cpu, ...s wall%0ACheck ran for ...s cpu, ...s wall%0A
76+
while walltime(t) < 2: pass
77+
Test ran for ...s cpu, ...s wall
78+
Check ran for ...s cpu, ...s wall
79+
[2 tests, ...s wall]
80+
----------------------------------------------------------------------
81+
All tests passed!
82+
----------------------------------------------------------------------
83+
...
84+
0
85+
5086
Check handling of tolerances::
5187
5288
sage: subprocess.call(["sage", "-t", "--warn-long", "0", # long time

src/sage/doctest/tests/sleep2.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Test raising slow doctest warning (cputime instead of walltime is checked so we need busy loop)::
2+
3+
sage: t = walltime()
4+
sage: while walltime(t) < 2: pass

0 commit comments

Comments
 (0)