1+ import os
2+ import pathlib
3+ import py_compile
4+ import shutil
15import textwrap
26import unittest
37import warnings
711from importlib import resources
812from importlib .resources .abc import Traversable
913from . import util
14+ from .compat .py39 import os_helper , import_helper
1015
1116
1217@contextlib .contextmanager
@@ -97,8 +102,8 @@ class ModuleFilesZipTests(DirectSpec, util.ZipSetup, ModulesFiles, unittest.Test
97102
98103class 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
126161class ImplicitContextFilesDiskTests (
127162 DirectSpec , util .DiskSetup , ImplicitContextFiles , unittest .TestCase
0 commit comments