Skip to content

Commit

Permalink
Support ModuleSpec in Python 3 importer
Browse files Browse the repository at this point in the history
https://www.python.org/dev/peps/pep-0451/

ISSUE: DEVTOOLS-4923

ref:4deef3b2a73c6f02b06b8bb2e1f578fbe8f0869e
  • Loading branch information
mityada committed Nov 29, 2018
1 parent db06a70 commit 65171a5
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 44 deletions.
2 changes: 2 additions & 0 deletions library/python/runtime_py3/__res.pyx
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# cython: language_level=3

from _codecs import utf_8_decode, utf_8_encode

from libcpp cimport bool
Expand Down
55 changes: 11 additions & 44 deletions library/python/runtime_py3/importer.pxi
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import marshal
import sys
from _codecs import utf_8_decode, utf_8_encode
from _frozen_importlib import _new_module, BuiltinImporter
from _frozen_importlib import _call_with_frames_removed, spec_from_loader, BuiltinImporter
from _frozen_importlib_external import _os, _path_isfile, path_sep
from _io import FileIO

Expand Down Expand Up @@ -137,13 +137,19 @@ class ResourceImporter(object):
if k not in self.memory:
self.memory.add(k)

# PEP-302 finder.
def find_module(self, fullname, path=None):
def find_spec(self, fullname, path, target=None):
try:
self.is_package(fullname)
is_package = self.is_package(fullname)
except ImportError:
return None
return self
return spec_from_loader(fullname, self, is_package=is_package)

def create_module(self, spec):
"""Use default semantics for module creation."""

def exec_module(self, module):
code = self.get_code(module.__name__)
_call_with_frames_removed(exec, code, module.__dict__)

# PEP-302 extension 1 of 3: data loader.
def get_data(self, path):
Expand Down Expand Up @@ -222,45 +228,6 @@ class ResourceImporter(object):

return self.source_map.get(filename, '')

# PEP-302 loader.
def load_module(self, mod_name, fix_name=None):
code = self.get_code(mod_name)
is_package = self.is_package(mod_name)
source_name = self._source_name

mod = _new_module(mod_name)
mod.__loader__ = self
mod.__file__ = code.co_filename

if is_package:
mod.__path__ = [executable]
mod.__package__ = mod_name
else:
mod.__package__ = mod_name.rpartition('.')[0]

sys.modules[mod_name] = mod

try:
if fix_name:
mod.__name__ = fix_name
self._source_name = dict(source_name, **{fix_name: mod_name})

exec code in mod.__dict__

if fix_name:
mod.__name__ = mod_name
self._source_name = source_name
except Exception:
try:
del sys.modules[mod_name]
except KeyError:
pass
raise

# Some hacky modules (e.g. pygments.lexers) replace themselves in
# `sys.modules` with proxies.
return sys.modules[mod_name]


class BuiltinSubmoduleImporter(BuiltinImporter):
@classmethod
Expand Down

0 comments on commit 65171a5

Please sign in to comment.