From 2234210e3497a7a0631ba60267bb42f3f86fc748 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Mon, 16 Dec 2024 22:00:46 +0100 Subject: [PATCH 1/3] Fix doctesting with Python 3.13 Adapt to upstream changes in doctest [1]: - _name2ft was renamed to _stats - it now records the number of skipped tests [1] https://github.com/python/cpython/commit/4f9b706c6f5d4422a398146bfd011daedaef1851 --- src/sage/doctest/forker.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/sage/doctest/forker.py b/src/sage/doctest/forker.py index bf6d49906de..697bd09c615 100644 --- a/src/sage/doctest/forker.py +++ b/src/sage/doctest/forker.py @@ -553,6 +553,8 @@ def __init__(self, *args, **kwds): self.total_walltime_skips = 0 self.total_performed_tests = 0 self.total_walltime = 0 + if not hasattr(self, "_stats"): + self._stats = self._name2ft def _run(self, test, compileflags, out): """ @@ -830,7 +832,10 @@ def compiler(example): self.optionflags = original_optionflags # Record and return the number of failures and tries. - self._DocTestRunner__record_outcome(test, failures, tries) + try: + self._DocTestRunner__record_outcome(test, failures, tries, walltime_skips) + except TypeError: + self._DocTestRunner__record_outcome(test, failures, tries) self.total_walltime_skips += walltime_skips self.total_performed_tests += tries return TestResults(failures, tries) @@ -931,7 +936,7 @@ def summarize(self, verbose=None): sage: from sage.doctest.control import DocTestDefaults; DD = DocTestDefaults() sage: import doctest, sys, os sage: DTR = SageDocTestRunner(SageOutputChecker(), verbose=False, sage_options=DD, optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS) - sage: DTR._name2ft['sage.doctest.forker'] = (1,120) + sage: DTR._stats['sage.doctest.forker'] = (1,120) sage: results = DTR.summarize() ********************************************************************** 1 item had failures: @@ -946,15 +951,15 @@ def summarize(self, verbose=None): passed = [] failed = [] totalt = totalf = 0 - for x in self._name2ft.items(): - name, (f, t) = x - assert f <= t - totalt += t - totalf += f - if not t: + for x in self._stats.items(): + name, f = x + assert f[0] <= f[1] + totalt += f[1] + totalf += f[0] + if not f[1]: notests.append(name) - elif not f: - passed.append((name, t)) + elif not f[0]: + passed.append((name, f[1])) else: failed.append(x) if verbose: @@ -972,10 +977,10 @@ def summarize(self, verbose=None): print(self.DIVIDER, file=m) print(count_noun(len(failed), "item"), "had failures:", file=m) failed.sort() - for thing, (f, t) in failed: - print(" %3d of %3d in %s" % (f, t, thing), file=m) + for thing, f in failed: + print(" %3d of %3d in %s" % (f[0], f[1], thing), file=m) if verbose: - print(count_noun(totalt, "test") + " in " + count_noun(len(self._name2ft), "item") + ".", file=m) + print(count_noun(totalt, "test") + " in " + count_noun(len(self._stats), "item") + ".", file=m) print("%s passed and %s failed." % (totalt - totalf, totalf), file=m) if totalf: print("***Test Failed***", file=m) From acfe0c2de6e0a9bd12843f36ebb63b15366cf230 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Fri, 20 Dec 2024 22:11:20 +0100 Subject: [PATCH 2/3] Use sys.version_info --- src/sage/doctest/forker.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/sage/doctest/forker.py b/src/sage/doctest/forker.py index 697bd09c615..a52485d3d91 100644 --- a/src/sage/doctest/forker.py +++ b/src/sage/doctest/forker.py @@ -553,7 +553,7 @@ def __init__(self, *args, **kwds): self.total_walltime_skips = 0 self.total_performed_tests = 0 self.total_walltime = 0 - if not hasattr(self, "_stats"): + if sys.version_info.minor < 13: self._stats = self._name2ft def _run(self, test, compileflags, out): @@ -832,10 +832,10 @@ def compiler(example): self.optionflags = original_optionflags # Record and return the number of failures and tries. - try: - self._DocTestRunner__record_outcome(test, failures, tries, walltime_skips) - except TypeError: + if sys.version_info.minor < 13: self._DocTestRunner__record_outcome(test, failures, tries) + else: + self._DocTestRunner__record_outcome(test, failures, tries, walltime_skips) self.total_walltime_skips += walltime_skips self.total_performed_tests += tries return TestResults(failures, tries) @@ -952,14 +952,14 @@ def summarize(self, verbose=None): failed = [] totalt = totalf = 0 for x in self._stats.items(): - name, f = x - assert f[0] <= f[1] - totalt += f[1] - totalf += f[0] - if not f[1]: + name, (f, t, *_) = x + assert f <= t + totalt += t + totalf += f + if not t: notests.append(name) - elif not f[0]: - passed.append((name, f[1])) + elif not f: + passed.append((name, t)) else: failed.append(x) if verbose: @@ -977,8 +977,8 @@ def summarize(self, verbose=None): print(self.DIVIDER, file=m) print(count_noun(len(failed), "item"), "had failures:", file=m) failed.sort() - for thing, f in failed: - print(" %3d of %3d in %s" % (f[0], f[1], thing), file=m) + for thing, (f, t, *_) in failed: + print(" %3d of %3d in %s" % (f, t, thing), file=m) if verbose: print(count_noun(totalt, "test") + " in " + count_noun(len(self._stats), "item") + ".", file=m) print("%s passed and %s failed." % (totalt - totalf, totalf), file=m) From 15b14ca8eb51acb4bdbd7c6faeb8abab89e88bc7 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Sun, 22 Dec 2024 20:12:49 +0100 Subject: [PATCH 3/3] Use full version_info instead of just version_info_minor --- src/sage/doctest/forker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sage/doctest/forker.py b/src/sage/doctest/forker.py index a52485d3d91..6c36ab47baf 100644 --- a/src/sage/doctest/forker.py +++ b/src/sage/doctest/forker.py @@ -553,7 +553,7 @@ def __init__(self, *args, **kwds): self.total_walltime_skips = 0 self.total_performed_tests = 0 self.total_walltime = 0 - if sys.version_info.minor < 13: + if sys.version_info < (3,13): self._stats = self._name2ft def _run(self, test, compileflags, out): @@ -832,7 +832,7 @@ def compiler(example): self.optionflags = original_optionflags # Record and return the number of failures and tries. - if sys.version_info.minor < 13: + if sys.version_info < (3,13): self._DocTestRunner__record_outcome(test, failures, tries) else: self._DocTestRunner__record_outcome(test, failures, tries, walltime_skips)