From c7f78a8305fd7c08705cc0125e0f6e99dbaa0d10 Mon Sep 17 00:00:00 2001 From: Andrey Rakhmatullin Date: Wed, 14 Jun 2023 20:43:18 +0400 Subject: [PATCH] Revert "Remove load_module_or_object." This reverts commit 815af431209686018b1bc2cbb80fd946cfe93614. --- scrapy/addons.py | 6 +++--- scrapy/utils/misc.py | 16 ++++++++++++++++ tests/test_utils_misc/__init__.py | 13 +++++++------ 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/scrapy/addons.py b/scrapy/addons.py index 153de66d2..43a36e5e5 100644 --- a/scrapy/addons.py +++ b/scrapy/addons.py @@ -11,7 +11,7 @@ from zope.interface.verify import verifyObject from scrapy.interfaces import IAddon from scrapy.utils.conf import build_component_list -from scrapy.utils.misc import load_object +from scrapy.utils.misc import load_module_or_object @zope.interface.implementer(IAddon) @@ -252,8 +252,8 @@ class AddonManager(Mapping): """ if isinstance(path, str): try: - obj = load_object(path) - except (ValueError, NameError, ImportError): + obj = load_module_or_object(path) + except NameError: raise NameError(f"Could not find add-on '{path}'") else: obj = path diff --git a/scrapy/utils/misc.py b/scrapy/utils/misc.py index d861c9ab6..8577cce02 100644 --- a/scrapy/utils/misc.py +++ b/scrapy/utils/misc.py @@ -72,6 +72,22 @@ def load_object(path: Union[str, Callable]) -> Any: return obj +def load_module_or_object(path): + """Load python module or (non-module) object from given path. + + Path can be both a Python or a file path. + """ + try: + return import_module(path) + except ImportError: + pass + try: + return load_object(path) + except (ValueError, NameError, ImportError): + pass + raise NameError(f"Could not load '{path}'") + + def walk_modules(path): """Loads a module and all its submodules from the given module path and returns them. If *any* module throws an exception while importing, that diff --git a/tests/test_utils_misc/__init__.py b/tests/test_utils_misc/__init__.py index 4f6e0d02c..7932ca04c 100644 --- a/tests/test_utils_misc/__init__.py +++ b/tests/test_utils_misc/__init__.py @@ -8,6 +8,7 @@ from scrapy.item import Field, Item from scrapy.utils.misc import ( arg_to_iter, create_instance, + load_module_or_object, load_object, rel_has_nofollow, set_environ, @@ -30,17 +31,17 @@ class UtilsMiscTestCase(unittest.TestCase): obj = load_object("scrapy.utils.misc.load_object") self.assertIs(obj, load_object) - def test_load_object_module(self): - testmod = load_object(__name__ + ".testmod") - self.assertTrue(hasattr(testmod, "TESTVAR")) - obj = load_object("scrapy.utils.misc.load_object") - self.assertIs(obj, load_object) - def test_load_object_exceptions(self): self.assertRaises(ImportError, load_object, "nomodule999.mod.function") self.assertRaises(NameError, load_object, "scrapy.utils.misc.load_object999") self.assertRaises(TypeError, load_object, {}) + def test_load_module_or_object(self): + testmod = load_module_or_object(__name__ + ".testmod") + self.assertTrue(hasattr(testmod, "TESTVAR")) + obj = load_object("scrapy.utils.misc.load_object") + self.assertIs(obj, load_object) + def test_walk_modules(self): mods = walk_modules("tests.test_utils_misc.test_walk_modules") expected = [