From 6083317add8f8e6ee46acdd5588bb56cc61b2cc9 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Tue, 14 Jan 2025 08:56:11 +0000 Subject: [PATCH 1/7] gh-128816: fix an import warning in test_doctest.py when importing readline in WASI --- Lib/test/test_doctest/test_doctest.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Lib/test/test_doctest/test_doctest.py b/Lib/test/test_doctest/test_doctest.py index b1e165fe16b54f..9c39255c24163c 100644 --- a/Lib/test/test_doctest/test_doctest.py +++ b/Lib/test/test_doctest/test_doctest.py @@ -2869,6 +2869,12 @@ def get_data(self, path): with open(path, mode='rb') as f: return f.read() + def exec_module(self, module): + raise ImportError + + def create_module(self, spec): + return None + class TestHook: def __init__(self, pathdir): From 7691ef3ee6e6ff9af1452240337764045f06baf0 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Tue, 14 Jan 2025 12:01:41 +0000 Subject: [PATCH 2/7] Apply suggestions from code review --- Lib/test/test_doctest/test_doctest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_doctest/test_doctest.py b/Lib/test/test_doctest/test_doctest.py index 9c39255c24163c..2bc5ce18112124 100644 --- a/Lib/test/test_doctest/test_doctest.py +++ b/Lib/test/test_doctest/test_doctest.py @@ -2870,10 +2870,10 @@ def get_data(self, path): return f.read() def exec_module(self, module): - raise ImportError + raise AssertionError("should never run") def create_module(self, spec): - return None + raise AssertionError("should never run") class TestHook: From f80983c703be0c55ee832476f71c4314a36e51c4 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Tue, 14 Jan 2025 13:06:18 +0000 Subject: [PATCH 3/7] Apply suggestions from code review --- Lib/test/test_doctest/test_doctest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_doctest/test_doctest.py b/Lib/test/test_doctest/test_doctest.py index 2bc5ce18112124..ede3f3345e772a 100644 --- a/Lib/test/test_doctest/test_doctest.py +++ b/Lib/test/test_doctest/test_doctest.py @@ -2873,7 +2873,7 @@ def exec_module(self, module): raise AssertionError("should never run") def create_module(self, spec): - raise AssertionError("should never run") + return None class TestHook: From 9604504f8bd51043f963226f69b05036435e71a8 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Tue, 14 Jan 2025 14:27:57 +0000 Subject: [PATCH 4/7] Update Lib/test/test_doctest/test_doctest.py --- Lib/test/test_doctest/test_doctest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_doctest/test_doctest.py b/Lib/test/test_doctest/test_doctest.py index ede3f3345e772a..9c39255c24163c 100644 --- a/Lib/test/test_doctest/test_doctest.py +++ b/Lib/test/test_doctest/test_doctest.py @@ -2870,7 +2870,7 @@ def get_data(self, path): return f.read() def exec_module(self, module): - raise AssertionError("should never run") + raise ImportError def create_module(self, spec): return None From 748a21c50de990d96fbdba9d87203f5a634fdc8c Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Wed, 15 Jan 2025 10:32:00 +0000 Subject: [PATCH 5/7] fix loader ABC warning by avoiding the abc --- Lib/test/test_doctest/test_doctest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_doctest/test_doctest.py b/Lib/test/test_doctest/test_doctest.py index 9c39255c24163c..a4a49298bab3be 100644 --- a/Lib/test/test_doctest/test_doctest.py +++ b/Lib/test/test_doctest/test_doctest.py @@ -2860,7 +2860,7 @@ def test_testfile(): r""" >>> _colorize.COLORIZE = save_colorize """ -class TestImporter(importlib.abc.MetaPathFinder, importlib.abc.ResourceLoader): +class TestImporter(importlib.abc.MetaPathFinder): def find_spec(self, fullname, path, target=None): return importlib.util.spec_from_file_location(fullname, path, loader=self) From 9b850e75a166355a923cd2de2311eebfca597dbc Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Wed, 15 Jan 2025 10:32:36 +0000 Subject: [PATCH 6/7] use importlib.resources to acquire doctest resources --- Lib/doctest.py | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/Lib/doctest.py b/Lib/doctest.py index bb281fc483c41c..3f995a1c41694b 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -102,7 +102,8 @@ def _test(): import sys import traceback import unittest -from io import StringIO, IncrementalNewlineDecoder +import importlib.resources +from io import StringIO from collections import namedtuple import _colorize # Used in doctests from _colorize import ANSIColors, can_colorize @@ -235,25 +236,31 @@ def _normalize_module(module, depth=2): else: raise TypeError("Expected a module, string, or None") -def _newline_convert(data): - # The IO module provides a handy decoder for universal newline conversion - return IncrementalNewlineDecoder(None, True).decode(data, True) - def _load_testfile(filename, package, module_relative, encoding): if module_relative: package = _normalize_module(package, 3) filename = _module_relative_path(package, filename) - if (loader := getattr(package, '__loader__', None)) is None: - try: - loader = package.__spec__.loader - except AttributeError: - pass - if hasattr(loader, 'get_data'): - file_contents = loader.get_data(filename) - file_contents = file_contents.decode(encoding) - # get_data() opens files as 'rb', so one must do the equivalent - # conversion as universal newlines would do. - return _newline_convert(file_contents), filename + try: + loader = package.__loader__ + except AttributeError: + pass + else: + if loader is not None: + return ( + importlib.resources.read_text(package, filename, encoding=encoding), + filename, + ) + + try: + package.__spec__.loader + except AttributeError: + pass + else: + return ( + importlib.resources.read_text(package, filename, encoding=encoding), + filename, + ) + with open(filename, encoding=encoding) as f: return f.read(), filename From abfd936ed5342b84c74c9c2be4f5fc82a3be245d Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Wed, 15 Jan 2025 10:41:23 +0000 Subject: [PATCH 7/7] Revert "use importlib.resources to acquire doctest resources" This reverts commit 9b850e75a166355a923cd2de2311eebfca597dbc. --- Lib/doctest.py | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/Lib/doctest.py b/Lib/doctest.py index 3f995a1c41694b..bb281fc483c41c 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -102,8 +102,7 @@ def _test(): import sys import traceback import unittest -import importlib.resources -from io import StringIO +from io import StringIO, IncrementalNewlineDecoder from collections import namedtuple import _colorize # Used in doctests from _colorize import ANSIColors, can_colorize @@ -236,31 +235,25 @@ def _normalize_module(module, depth=2): else: raise TypeError("Expected a module, string, or None") +def _newline_convert(data): + # The IO module provides a handy decoder for universal newline conversion + return IncrementalNewlineDecoder(None, True).decode(data, True) + def _load_testfile(filename, package, module_relative, encoding): if module_relative: package = _normalize_module(package, 3) filename = _module_relative_path(package, filename) - try: - loader = package.__loader__ - except AttributeError: - pass - else: - if loader is not None: - return ( - importlib.resources.read_text(package, filename, encoding=encoding), - filename, - ) - - try: - package.__spec__.loader - except AttributeError: - pass - else: - return ( - importlib.resources.read_text(package, filename, encoding=encoding), - filename, - ) - + if (loader := getattr(package, '__loader__', None)) is None: + try: + loader = package.__spec__.loader + except AttributeError: + pass + if hasattr(loader, 'get_data'): + file_contents = loader.get_data(filename) + file_contents = file_contents.decode(encoding) + # get_data() opens files as 'rb', so one must do the equivalent + # conversion as universal newlines would do. + return _newline_convert(file_contents), filename with open(filename, encoding=encoding) as f: return f.read(), filename