https://github.com/python/cpython/commit/d712ece43feeed7f930954d40b046cdaeed7c414
commit: d712ece43feeed7f930954d40b046cdaeed7c414
branch: 3.12
author: Jason R. Coombs <[email protected]>
committer: jaraco <[email protected]>
date: 2025-01-05T16:53:55-05:00
summary:

[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 a53812df126b99bca25187441a123c7785ee82a0)

files:
A Misc/NEWS.d/next/Library/2024-08-17-08-17-20.gh-issue-123085.7Io2yH.rst
M Lib/importlib/resources/_common.py
M Lib/test/test_importlib/resources/test_files.py

diff --git a/Lib/importlib/resources/_common.py 
b/Lib/importlib/resources/_common.py
index a3902535342612..a85df4b399fe61 100644
--- a/Lib/importlib/resources/_common.py
+++ b/Lib/importlib/resources/_common.py
@@ -93,12 +93,13 @@ def _infer_caller():
     """
 
     def is_this_file(frame_info):
-        return frame_info.filename == __file__
+        return frame_info.filename == stack[0].filename
 
     def is_wrapper(frame_info):
         return frame_info.function == 'wrapper'
 
-    not_this_file = itertools.filterfalse(is_this_file, inspect.stack())
+    stack = inspect.stack()
+    not_this_file = itertools.filterfalse(is_this_file, stack)
     # also exclude 'wrapper' due to singledispatch in the call stack
     callers = itertools.filterfalse(is_wrapper, not_this_file)
     return next(callers).frame
diff --git a/Lib/test/test_importlib/resources/test_files.py 
b/Lib/test/test_importlib/resources/test_files.py
index 038aac0a3fe773..d34ea51b150f1e 100644
--- a/Lib/test/test_importlib/resources/test_files.py
+++ b/Lib/test/test_importlib/resources/test_files.py
@@ -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 . 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 @@ def create_zip_from_directory(source_dir, zip_filename):
         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()
diff --git 
a/Misc/NEWS.d/next/Library/2024-08-17-08-17-20.gh-issue-123085.7Io2yH.rst 
b/Misc/NEWS.d/next/Library/2024-08-17-08-17-20.gh-issue-123085.7Io2yH.rst
new file mode 100644
index 00000000000000..2e09401ceb5b56
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-08-17-08-17-20.gh-issue-123085.7Io2yH.rst
@@ -0,0 +1,3 @@
+In a bare call to :func:`importlib.resources.files`, ensure the caller's
+frame is properly detected when ``importlib.resources`` is itself available
+as a compiled module only (no source).

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to