diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e296dba0..9305ac6f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,7 +25,6 @@ repos: files: ^(CHANGELOG.rst|HOWTORELEASE.rst|README.rst|changelog/.*)$ language: python additional_dependencies: [pygments, restructuredtext_lint] - python_version: python3.6 - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.0.0 hooks: diff --git a/docs/conf.py b/docs/conf.py index e752b101..550071d7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -import pkg_resources +import importlib_metadata extensions = [ @@ -20,14 +20,13 @@ # General information about the project. -dist = pkg_resources.get_distribution("pluggy") -project = dist.project_name +project = "pluggy" copyright = u"2016, Holger Krekel" author = "Holger Krekel" -release = dist.version +release = importlib_metadata.version(project) # The short X.Y version. -version = u".".join(dist.version.split(".")[:2]) +version = u".".join(release.split(".")[:2]) language = None diff --git a/pluggy/manager.py b/pluggy/manager.py index dc3dfa9b..3a871496 100644 --- a/pluggy/manager.py +++ b/pluggy/manager.py @@ -1,4 +1,5 @@ import inspect +import importlib_metadata from . import _tracing from .hooks import HookImpl, _HookRelay, _HookCaller, normalize_hookimpl_opts import warnings @@ -254,25 +255,14 @@ def check_pending(self): def load_setuptools_entrypoints(self, entrypoint_name): """ Load modules from querying the specified setuptools entrypoint name. Return the number of loaded plugins. """ - from pkg_resources import ( - iter_entry_points, - DistributionNotFound, - VersionConflict, - ) - - for ep in iter_entry_points(entrypoint_name): + for ep in importlib_metadata.entry_points().get(entrypoint_name, ()): # is the plugin registered or blocked? if self.get_plugin(ep.name) or self.is_blocked(ep.name): continue try: plugin = ep.load() - except DistributionNotFound: + except (ImportError, AttributeError): continue - except VersionConflict as e: - raise PluginValidationError( - plugin=None, - message="Plugin %r could not be loaded: %s!" % (ep.name, e), - ) self.register(plugin, name=ep.name) self._plugin_distinfo.append((plugin, ep.dist)) return len(self._plugin_distinfo) diff --git a/setup.py b/setup.py index d60e5fd9..d23874f3 100644 --- a/setup.py +++ b/setup.py @@ -36,6 +36,7 @@ def main(): author_email="holger@merlinux.eu", url="https://github.com/pytest-dev/pluggy", python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", + install_requires=["importlib-metadata>=0.8"], extras_require={"dev": ["pre-commit", "tox"]}, classifiers=classifiers, packages=["pluggy"], diff --git a/testing/test_pluginmanager.py b/testing/test_pluginmanager.py index fc9cf32b..0e1663c4 100644 --- a/testing/test_pluginmanager.py +++ b/testing/test_pluginmanager.py @@ -3,7 +3,7 @@ """ import pytest import types -import sys +import importlib_metadata from pluggy import ( PluginManager, PluginValidationError, @@ -447,24 +447,20 @@ def example_hook(): def test_load_setuptools_instantiation(monkeypatch, pm): - pkg_resources = pytest.importorskip("pkg_resources") + class EntryPoint(object): + name = "myname" + dist = None - def my_iter(name): - assert name == "hello" + def load(self): + class PseudoPlugin(object): + x = 42 - class EntryPoint(object): - name = "myname" - dist = None + return PseudoPlugin() - def load(self): - class PseudoPlugin(object): - x = 42 + def eps(): + return {"hello": (EntryPoint(),)} - return PseudoPlugin() - - return iter([EntryPoint()]) - - monkeypatch.setattr(pkg_resources, "iter_entry_points", my_iter) + monkeypatch.setattr(importlib_metadata, "entry_points", eps) num = pm.load_setuptools_entrypoints("hello") assert num == 1 plugin = pm.get_plugin("myname") @@ -472,37 +468,6 @@ class PseudoPlugin(object): assert pm.list_plugin_distinfo() == [(plugin, None)] -def test_load_setuptools_version_conflict(monkeypatch, pm): - """Check that we properly handle a VersionConflict problem when loading entry points""" - pkg_resources = pytest.importorskip("pkg_resources") - - def my_iter(name): - assert name == "hello" - - class EntryPoint(object): - name = "myname" - dist = None - - def load(self): - raise pkg_resources.VersionConflict("Some conflict") - - return iter([EntryPoint()]) - - monkeypatch.setattr(pkg_resources, "iter_entry_points", my_iter) - with pytest.raises( - PluginValidationError, - match="Plugin 'myname' could not be loaded: Some conflict!", - ): - pm.load_setuptools_entrypoints("hello") - - -def test_load_setuptools_not_installed(monkeypatch, pm): - monkeypatch.setitem(sys.modules, "pkg_resources", types.ModuleType("pkg_resources")) - - with pytest.raises(ImportError): - pm.load_setuptools_entrypoints("qwe") - - def test_add_tracefuncs(he_pm): out = []