Skip to content

Commit 49c0736

Browse files
Merge pull request #809 from SIBTAIN-ASAD/fix-entrypoint-declined-distributions
Fix distribution tracking for declined entry points
2 parents 0224f79 + 4d6b10d commit 49c0736

3 files changed

Lines changed: 43 additions & 2 deletions

File tree

‎changelog/807.bugfix.rst‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix :meth:`~pluggy.PluginManager.load_setuptools_entrypoints` crashing distribution listing when an entry point is declined during registration.

‎src/pluggy/_manager.py‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -517,8 +517,10 @@ def load_setuptools_entrypoints(self, group: str, name: str | None = None) -> in
517517
):
518518
continue
519519
plugin = ep.load()
520-
self.register(plugin, name=ep.name)
521-
self._name2dist[ep.name] = dist
520+
plugin_name = self.register(plugin, name=ep.name)
521+
if plugin_name is None:
522+
continue
523+
self._name2dist[plugin_name] = dist
522524
count += 1
523525
return count
524526

‎testing/test_pluginmanager.py‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -993,6 +993,44 @@ class Distribution:
993993
assert pm.list_plugin_distributions() == [(a, dist)]
994994

995995

996+
def test_load_setuptools_ignores_declined_plugins(
997+
monkeypatch: pytest.MonkeyPatch,
998+
) -> None:
999+
class EntryPoint:
1000+
group = "hello"
1001+
1002+
def __init__(self, name: str, plugin: object) -> None:
1003+
self.name = name
1004+
self.plugin = plugin
1005+
1006+
def load(self) -> object:
1007+
return self.plugin
1008+
1009+
accepted = object()
1010+
1011+
class Distribution:
1012+
entry_points = (
1013+
EntryPoint("none-plugin", None),
1014+
EntryPoint("declined", object()),
1015+
EntryPoint("renamed", accepted),
1016+
)
1017+
1018+
class DecliningPluginManager(PluginManager):
1019+
def register(self, plugin: object, name: str | None = None) -> str | None:
1020+
if name == "declined":
1021+
return None
1022+
if name == "renamed":
1023+
name = "accepted"
1024+
return super().register(plugin, name)
1025+
1026+
dist = cast(importlib.metadata.Distribution, Distribution())
1027+
monkeypatch.setattr(importlib.metadata, "distributions", lambda: (dist,))
1028+
pm = DecliningPluginManager("example")
1029+
1030+
assert pm.load_setuptools_entrypoints("hello") == 1
1031+
assert pm.list_plugin_distributions() == [(accepted, dist)]
1032+
1033+
9961034
def test_add_tracefuncs(he_pm: PluginManager) -> None:
9971035
out: list[Any] = []
9981036

0 commit comments

Comments
 (0)