GH-90344: replace single-call io.IncrementalNewlineDecoder usage with non-incremental newline decoders (GH-30276)

Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Co-authored-by: Brett Cannon <brett@python.org>
This commit is contained in:
Guo Ci
2025-11-14 19:13:37 -05:00
committed by GitHub
parent f0a8bc737a
commit 453d886f85
4 changed files with 5 additions and 10 deletions

View File

@@ -104,7 +104,7 @@ import sys
import traceback import traceback
import types import types
import unittest import unittest
from io import StringIO, IncrementalNewlineDecoder from io import StringIO, TextIOWrapper, BytesIO
from collections import namedtuple from collections import namedtuple
import _colorize # Used in doctests import _colorize # Used in doctests
from _colorize import ANSIColors, can_colorize from _colorize import ANSIColors, can_colorize
@@ -237,10 +237,6 @@ def _normalize_module(module, depth=2):
else: else:
raise TypeError("Expected a module, string, or None") 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): def _load_testfile(filename, package, module_relative, encoding):
if module_relative: if module_relative:
package = _normalize_module(package, 3) package = _normalize_module(package, 3)
@@ -252,10 +248,9 @@ def _load_testfile(filename, package, module_relative, encoding):
pass pass
if hasattr(loader, 'get_data'): if hasattr(loader, 'get_data'):
file_contents = loader.get_data(filename) file_contents = loader.get_data(filename)
file_contents = file_contents.decode(encoding)
# get_data() opens files as 'rb', so one must do the equivalent # get_data() opens files as 'rb', so one must do the equivalent
# conversion as universal newlines would do. # conversion as universal newlines would do.
return _newline_convert(file_contents), filename return TextIOWrapper(BytesIO(file_contents), encoding=encoding, newline=None).read(), filename
with open(filename, encoding=encoding) as f: with open(filename, encoding=encoding) as f:
return f.read(), filename return f.read(), filename

View File

@@ -552,8 +552,7 @@ def decode_source(source_bytes):
import tokenize # To avoid bootstrap issues. import tokenize # To avoid bootstrap issues.
source_bytes_readline = _io.BytesIO(source_bytes).readline source_bytes_readline = _io.BytesIO(source_bytes).readline
encoding = tokenize.detect_encoding(source_bytes_readline) encoding = tokenize.detect_encoding(source_bytes_readline)
newline_decoder = _io.IncrementalNewlineDecoder(None, True) return _io.TextIOWrapper(_io.BytesIO(source_bytes), encoding=encoding[0], newline=None).read()
return newline_decoder.decode(source_bytes.decode(encoding[0]))
# Module specifications ####################################################### # Module specifications #######################################################

View File

@@ -904,7 +904,7 @@ class SourceLoaderGetSourceTests:
mock = self.SourceOnlyLoaderMock('mod.file') mock = self.SourceOnlyLoaderMock('mod.file')
source = "x = 42\r\ny = -13\r\n" source = "x = 42\r\ny = -13\r\n"
mock.source = source.encode('utf-8') mock.source = source.encode('utf-8')
expect = io.IncrementalNewlineDecoder(None, True).decode(source) expect = io.StringIO(source, newline=None).getvalue()
self.assertEqual(mock.get_source(name), expect) self.assertEqual(mock.get_source(name), expect)

View File

@@ -0,0 +1 @@
Replace :class:`io.IncrementalNewlineDecoder` with non incremental newline decoders in codebase where :meth:`!io.IncrementalNewlineDecoder.decode` was being called once.