]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-44686 replace unittest.mock._importer with pkgutil.resolve_name (GH-18544)
authorThomas Grainger <tagrain@gmail.com>
Wed, 21 Jul 2021 11:47:44 +0000 (12:47 +0100)
committerGitHub <noreply@github.com>
Wed, 21 Jul 2021 11:47:44 +0000 (04:47 -0700)
Automerge-Triggered-By: GH:cjw296
Lib/unittest/mock.py
Misc/NEWS.d/next/Library/2021-07-20-19-35-49.bpo-44686.ucCGhu.rst [new file with mode: 0644]

index 5be91203ec7d7c8855a7c327d1d70c95625fd11d..ecf84d224fce37e5f947bea0caf29e85412762c0 100644 (file)
@@ -30,6 +30,7 @@ import inspect
 import pprint
 import sys
 import builtins
+import pkgutil
 from asyncio import iscoroutinefunction
 from types import CodeType, ModuleType, MethodType
 from unittest.util import safe_repr
@@ -1239,25 +1240,6 @@ class Mock(CallableMixin, NonCallableMock):
     """
 
 
-def _dot_lookup(thing, comp, import_path):
-    try:
-        return getattr(thing, comp)
-    except AttributeError:
-        __import__(import_path)
-        return getattr(thing, comp)
-
-
-def _importer(target):
-    components = target.split('.')
-    import_path = components.pop(0)
-    thing = __import__(import_path)
-
-    for comp in components:
-        import_path += ".%s" % comp
-        thing = _dot_lookup(thing, comp, import_path)
-    return thing
-
-
 # _check_spec_arg_typos takes kwargs from commands like patch and checks that
 # they don't contain common misspellings of arguments related to autospeccing.
 def _check_spec_arg_typos(kwargs_to_check):
@@ -1611,8 +1593,7 @@ def _get_target(target):
     except (TypeError, ValueError):
         raise TypeError("Need a valid target to patch. You supplied: %r" %
                         (target,))
-    getter = lambda: _importer(target)
-    return getter, attribute
+    return partial(pkgutil.resolve_name, target), attribute
 
 
 def _patch_object(
@@ -1667,7 +1648,7 @@ def _patch_multiple(target, spec=None, create=False, spec_set=None,
     for choosing which methods to wrap.
     """
     if type(target) is str:
-        getter = lambda: _importer(target)
+        getter = partial(pkgutil.resolve_name, target)
     else:
         getter = lambda: target
 
@@ -1847,7 +1828,7 @@ class _patch_dict(object):
     def _patch_dict(self):
         values = self.values
         if isinstance(self.in_dict, str):
-            self.in_dict = _importer(self.in_dict)
+            self.in_dict = pkgutil.resolve_name(self.in_dict)
         in_dict = self.in_dict
         clear = self.clear
 
diff --git a/Misc/NEWS.d/next/Library/2021-07-20-19-35-49.bpo-44686.ucCGhu.rst b/Misc/NEWS.d/next/Library/2021-07-20-19-35-49.bpo-44686.ucCGhu.rst
new file mode 100644 (file)
index 0000000..d9c7802
--- /dev/null
@@ -0,0 +1 @@
+Replace ``unittest.mock._importer`` with ``pkgutil.resolve_name``.