mirror of
https://github.com/python/cpython.git
synced 2025-08-09 11:29:45 +00:00
[3.12] gh-123085: Fix issue in inferred caller when resources package has no source (GH-123102) (#124021)
gh-123085: Fix issue in inferred caller when resources package has no source.
From importlib_resources 6.4.3 (python/importlib_resourcesGH-314).
(cherry picked from commit a53812df12
)
This commit is contained in:
parent
09f7d88cad
commit
d712ece43f
3 changed files with 50 additions and 4 deletions
|
@ -1,4 +1,8 @@
|
|||
import typing
|
||||
import os
|
||||
import pathlib
|
||||
import py_compile
|
||||
import shutil
|
||||
import textwrap
|
||||
import unittest
|
||||
import warnings
|
||||
|
@ -10,8 +14,7 @@ from importlib.resources.abc import Traversable
|
|||
from . import data01
|
||||
from . import util
|
||||
from . import _path
|
||||
from test.support import os_helper
|
||||
from test.support import import_helper
|
||||
from test.support import os_helper, import_helper
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
|
@ -144,6 +147,45 @@ class ImplicitContextFilesTests(SiteDir, unittest.TestCase):
|
|||
self.fixtures.enter_context(import_helper.DirsOnSysPath(zip_file))
|
||||
assert importlib.import_module('somepkg.submod').val == 'resources are the best'
|
||||
|
||||
def _compile_importlib(self):
|
||||
"""
|
||||
Make a compiled-only copy of the importlib resources package.
|
||||
"""
|
||||
bin_site = self.fixtures.enter_context(os_helper.temp_dir())
|
||||
c_resources = pathlib.Path(bin_site, 'c_resources')
|
||||
sources = pathlib.Path(resources.__file__).parent
|
||||
shutil.copytree(sources, c_resources, ignore=lambda *_: ['__pycache__'])
|
||||
|
||||
for dirpath, _, filenames in os.walk(c_resources):
|
||||
for filename in filenames:
|
||||
source_path = pathlib.Path(dirpath) / filename
|
||||
cfile = source_path.with_suffix('.pyc')
|
||||
py_compile.compile(source_path, cfile)
|
||||
pathlib.Path.unlink(source_path)
|
||||
self.fixtures.enter_context(import_helper.DirsOnSysPath(bin_site))
|
||||
|
||||
def test_implicit_files_with_compiled_importlib(self):
|
||||
"""
|
||||
Caller detection works for compiled-only resources module.
|
||||
|
||||
python/cpython#123085
|
||||
"""
|
||||
set_val = textwrap.dedent(
|
||||
f"""
|
||||
import {resources.__name__} as res
|
||||
val = res.files().joinpath('res.txt').read_text(encoding='utf-8')
|
||||
"""
|
||||
)
|
||||
spec = {
|
||||
'frozenpkg': {
|
||||
'__init__.py': set_val.replace(resources.__name__, 'c_resources'),
|
||||
'res.txt': 'resources are the best',
|
||||
},
|
||||
}
|
||||
_path.build(spec, self.site_dir)
|
||||
self._compile_importlib()
|
||||
assert importlib.import_module('frozenpkg').val == 'resources are the best'
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue