diff --git a/Lib/doctest.py b/Lib/doctest.py index e02e73ed722f7e..33252d77e6f88c 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -94,6 +94,7 @@ def _test(): import __future__ import difflib +import importlib.resources import inspect import linecache import os @@ -102,8 +103,8 @@ def _test(): import sys import traceback import unittest -from io import StringIO, IncrementalNewlineDecoder from collections import namedtuple +from io import StringIO import _colorize # Used in doctests from _colorize import ANSIColors, can_colorize @@ -235,27 +236,21 @@ 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): + text = None 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 - with open(filename, encoding=encoding) as f: - return f.read(), filename + package = _normalize_module(package, depth=3) + try: + file = importlib.resources.files(package) / filename + text = file.read_text(encoding=encoding) + except AttributeError: + filename = _module_relative_path(package, filename) + + if text is None: + with open(filename, encoding=encoding) as f: + text = f.read() + + return text, filename def _indent(s, indent=4): """ diff --git a/Misc/NEWS.d/next/Library/2025-01-15-11-57-42.gh-issue-128862.TDHQdR.rst b/Misc/NEWS.d/next/Library/2025-01-15-11-57-42.gh-issue-128862.TDHQdR.rst new file mode 100644 index 00000000000000..930f6e075f3c9c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-01-15-11-57-42.gh-issue-128862.TDHQdR.rst @@ -0,0 +1 @@ +Use ``importlib.resources`` to acquire test files in ``doctest``