summaryrefslogtreecommitdiffstats
path: root/contrib/python/ipython/py3/IPython/utils/shimmodule.py
diff options
context:
space:
mode:
authorrobot-contrib <[email protected]>2022-05-18 00:43:36 +0300
committerrobot-contrib <[email protected]>2022-05-18 00:43:36 +0300
commit9e5f436a8b2a27bcc7802e443ea3ef3e41a82a75 (patch)
tree78b522cab9f76336e62064d4d8ff7c897659b20e /contrib/python/ipython/py3/IPython/utils/shimmodule.py
parent8113a823ffca6451bb5ff8f0334560885a939a24 (diff)
Update contrib/python/ipython/py3 to 8.3.0
ref:e84342d4d30476f9148137f37fd0c6405fd36f55
Diffstat (limited to 'contrib/python/ipython/py3/IPython/utils/shimmodule.py')
-rw-r--r--contrib/python/ipython/py3/IPython/utils/shimmodule.py47
1 files changed, 21 insertions, 26 deletions
diff --git a/contrib/python/ipython/py3/IPython/utils/shimmodule.py b/contrib/python/ipython/py3/IPython/utils/shimmodule.py
index b70ac135bf8..8af44caa98b 100644
--- a/contrib/python/ipython/py3/IPython/utils/shimmodule.py
+++ b/contrib/python/ipython/py3/IPython/utils/shimmodule.py
@@ -3,6 +3,8 @@
# Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.
+import importlib.abc
+import importlib.util
import sys
import types
from importlib import import_module
@@ -13,41 +15,26 @@ from .importstring import import_item
class ShimWarning(Warning):
"""A warning to show when a module has moved, and a shim is in its place."""
-class ShimImporter(object):
+
+class ShimImporter(importlib.abc.MetaPathFinder):
"""Import hook for a shim.
-
+
This ensures that submodule imports return the real target module,
not a clone that will confuse `is` and `isinstance` checks.
"""
def __init__(self, src, mirror):
self.src = src
self.mirror = mirror
-
+
def _mirror_name(self, fullname):
"""get the name of the mirrored module"""
-
- return self.mirror + fullname[len(self.src):]
- def find_module(self, fullname, path=None):
- """Return self if we should be used to import the module."""
- if fullname.startswith(self.src + '.'):
- mirror_name = self._mirror_name(fullname)
- try:
- mod = import_item(mirror_name)
- except ImportError:
- return
- else:
- if not isinstance(mod, types.ModuleType):
- # not a module
- return None
- return self
+ return self.mirror + fullname[len(self.src) :]
- def load_module(self, fullname):
- """Import the mirrored module, and insert it into sys.modules"""
- mirror_name = self._mirror_name(fullname)
- mod = import_item(mirror_name)
- sys.modules[fullname] = mod
- return mod
+ def find_spec(self, fullname, path, target=None):
+ if fullname.startswith(self.src + "."):
+ mirror_name = self._mirror_name(fullname)
+ return importlib.util.find_spec(mirror_name)
class ShimModule(types.ModuleType):
@@ -90,5 +77,13 @@ class ShimModule(types.ModuleType):
name = "%s.%s" % (self._mirror, key)
try:
return import_item(name)
- except ImportError:
- raise AttributeError(key)
+ except ImportError as e:
+ raise AttributeError(key) from e
+
+ def __repr__(self):
+ # repr on a module can be called during error handling; make sure
+ # it does not fail, even if the import fails
+ try:
+ return self.__getattr__("__repr__")()
+ except AttributeError:
+ return f"<ShimModule for {self._mirror!r}>"