From ab7fcc8fbdc11091370deeb000a787fb02f9b13d Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Wed, 21 Jul 2021 12:47:44 +0100 Subject: bpo-44686 replace unittest.mock._importer with pkgutil.resolve_name (GH-18544) Automerge-Triggered-By: GH:cjw296 --- Lib/unittest/mock.py | 27 ++++------------------ .../2021-07-20-19-35-49.bpo-44686.ucCGhu.rst | 1 + 2 files changed, 5 insertions(+), 23 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-07-20-19-35-49.bpo-44686.ucCGhu.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 5be9120..ecf84d2 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -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 index 0000000..d9c7802 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-07-20-19-35-49.bpo-44686.ucCGhu.rst @@ -0,0 +1 @@ +Replace ``unittest.mock._importer`` with ``pkgutil.resolve_name``. -- cgit v0.12