@@ -102,8 +102,7 @@ def _test():
102102import sys
103103import traceback
104104import unittest
105- import importlib .resources
106- from io import StringIO
105+ from io import StringIO , IncrementalNewlineDecoder
107106from collections import namedtuple
108107import _colorize # Used in doctests
109108from _colorize import ANSIColors , can_colorize
@@ -236,31 +235,25 @@ def _normalize_module(module, depth=2):
236235 else :
237236 raise TypeError ("Expected a module, string, or None" )
238237
238+ def _newline_convert (data ):
239+ # The IO module provides a handy decoder for universal newline conversion
240+ return IncrementalNewlineDecoder (None , True ).decode (data , True )
241+
239242def _load_testfile (filename , package , module_relative , encoding ):
240243 if module_relative :
241244 package = _normalize_module (package , 3 )
242245 filename = _module_relative_path (package , filename )
243- try :
244- loader = package .__loader__
245- except AttributeError :
246- pass
247- else :
248- if loader is not None :
249- return (
250- importlib .resources .read_text (package , filename , encoding = encoding ),
251- filename ,
252- )
253-
254- try :
255- package .__spec__ .loader
256- except AttributeError :
257- pass
258- else :
259- return (
260- importlib .resources .read_text (package , filename , encoding = encoding ),
261- filename ,
262- )
263-
246+ if (loader := getattr (package , '__loader__' , None )) is None :
247+ try :
248+ loader = package .__spec__ .loader
249+ except AttributeError :
250+ pass
251+ if hasattr (loader , 'get_data' ):
252+ file_contents = loader .get_data (filename )
253+ file_contents = file_contents .decode (encoding )
254+ # get_data() opens files as 'rb', so one must do the equivalent
255+ # conversion as universal newlines would do.
256+ return _newline_convert (file_contents ), filename
264257 with open (filename , encoding = encoding ) as f :
265258 return f .read (), filename
266259
0 commit comments