Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 097b06c

Browse filesBrowse files
committed
gh-123085: Fix issue in inferred caller when resources package has no source.
From importlib_resources 6.4.3 (python/importlib_resources#314).
1 parent ac918cc commit 097b06c
Copy full SHA for 097b06c

File tree

3 files changed

+43
-4
lines changed
Filter options

3 files changed

+43
-4
lines changed

‎Lib/importlib/resources/_common.py

Copy file name to clipboardExpand all lines: Lib/importlib/resources/_common.py
+3-2Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,13 @@ def _infer_caller():
9393
"""
9494

9595
def is_this_file(frame_info):
96-
return frame_info.filename == __file__
96+
return frame_info.filename == stack[0].filename
9797

9898
def is_wrapper(frame_info):
9999
return frame_info.function == 'wrapper'
100100

101-
not_this_file = itertools.filterfalse(is_this_file, inspect.stack())
101+
stack = inspect.stack()
102+
not_this_file = itertools.filterfalse(is_this_file, stack)
102103
# also exclude 'wrapper' due to singledispatch in the call stack
103104
callers = itertools.filterfalse(is_wrapper, not_this_file)
104105
return next(callers).frame

‎Lib/test/test_importlib/resources/test_files.py

Copy file name to clipboardExpand all lines: Lib/test/test_importlib/resources/test_files.py
+37-2Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import os
2+
import pathlib
3+
import py_compile
4+
import shutil
15
import textwrap
26
import unittest
37
import warnings
@@ -7,6 +11,7 @@
711
from importlib import resources
812
from importlib.resources.abc import Traversable
913
from . import util
14+
from test.support import os_helper, import_helper
1015

1116

1217
@contextlib.contextmanager
@@ -97,8 +102,8 @@ class ModuleFilesZipTests(DirectSpec, util.ZipSetup, ModulesFiles, unittest.Test
97102

98103
class ImplicitContextFiles:
99104
set_val = textwrap.dedent(
100-
"""
101-
import importlib.resources as res
105+
f"""
106+
import {resources.__name__} as res
102107
val = res.files().joinpath('res.txt').read_text(encoding='utf-8')
103108
"""
104109
)
@@ -108,6 +113,10 @@ class ImplicitContextFiles:
108113
'submod.py': set_val,
109114
'res.txt': 'resources are the best',
110115
},
116+
'frozenpkg': {
117+
'__init__.py': set_val.replace(resources.__name__, 'c_resources'),
118+
'res.txt': 'resources are the best',
119+
},
111120
}
112121

113122
def test_implicit_files_package(self):
@@ -122,6 +131,32 @@ def test_implicit_files_submodule(self):
122131
"""
123132
assert importlib.import_module('somepkg.submod').val == 'resources are the best'
124133

134+
def _compile_importlib(self):
135+
"""
136+
Make a compiled-only copy of the importlib resources package.
137+
"""
138+
bin_site = self.fixtures.enter_context(os_helper.temp_dir())
139+
c_resources = pathlib.Path(bin_site, 'c_resources')
140+
sources = pathlib.Path(resources.__file__).parent
141+
shutil.copytree(sources, c_resources, ignore=lambda *_: ['__pycache__'])
142+
143+
for dirpath, _, filenames in os.walk(c_resources):
144+
for filename in filenames:
145+
source_path = pathlib.Path(dirpath) / filename
146+
cfile = source_path.with_suffix('.pyc')
147+
py_compile.compile(source_path, cfile)
148+
pathlib.Path.unlink(source_path)
149+
self.fixtures.enter_context(import_helper.DirsOnSysPath(bin_site))
150+
151+
def test_implicit_files_with_compiled_importlib(self):
152+
"""
153+
Caller detection works for compiled-only resources module.
154+
155+
python/cpython#123085
156+
"""
157+
self._compile_importlib()
158+
assert importlib.import_module('frozenpkg').val == 'resources are the best'
159+
125160

126161
class ImplicitContextFilesDiskTests(
127162
DirectSpec, util.DiskSetup, ImplicitContextFiles, unittest.TestCase
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
In a bare call to :func:`importlib.resources.files`, ensure the caller's
2+
frame is properly detected when ``importlib.resources`` is itself available
3+
as a compiled module only (no source).

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.