Skip to content

Commit c5277e4

Browse files
committed
Detailed error message on hook registration conflict
1 parent 5c0e5aa commit c5277e4

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/pluggy/_hooks.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,11 @@ def set_specification(
337337
specmodule_or_class: _Namespace,
338338
spec_opts: "_HookSpecOpts",
339339
) -> None:
340-
assert not self.has_spec()
340+
if self.has_spec():
341+
raise RuntimeError(
342+
f"Hook {self.spec.name!r} is already registered "
343+
f"within namespace {self.spec.namespace}"
344+
)
341345
self.spec = HookSpec(specmodule_or_class, self.name, spec_opts)
342346
if spec_opts.get("historic"):
343347
self._call_history = []

testing/test_hookcaller.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,3 +405,19 @@ def hello(self, arg: int) -> int:
405405
pm.register(Plugin2())
406406
with pytest.raises(PluginValidationError):
407407
pm.check_pending()
408+
409+
410+
def test_hook_conflict(pm: PluginManager) -> None:
411+
class Api1:
412+
@hookspec
413+
def conflict(self) -> None:
414+
pass
415+
416+
class Api2:
417+
@hookspec
418+
def conflict(self) -> None:
419+
pass
420+
421+
pm.add_hookspecs(Api1)
422+
with pytest.raises(RuntimeError):
423+
pm.add_hookspecs(Api2)

0 commit comments

Comments
 (0)