# pluggy: what changed from 0 to 1 - Product: pluggy (https://whatsnew.fyi/product/pluggy) - Vendor: pluggy - Range: changelog entries numbered after 0.13.1 up to and including 1.6.0, stable releases only - Entries below: 6 releases (newest first) - Resolved: 0 is 0.13.1 and 1 is 1.6.0, the newest stable release of each major we track - Carrying security changes: 0 · CVEs mentioned: 0 · Mentioning breaking changes: 0 · Removing or deprecating something: 3 - Page: https://whatsnew.fyi/product/pluggy/compare/0...1 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## What changed (31 changes, grouped by kind) ### Added #### 1.5.0 (2024-04-20) - Add support for deprecating specific hook parameters, or more generally, for issuing a warning whenever a hook implementation requests certain parameters #### 1.4.0 (2024-01-24) - Issue a PluggyTeardownRaisedWarning when an old-style hookwrapper raises an exception during teardown - Add PluginManager.unblock method to unblock a plugin by plugin name #### 1.3.0 (2023-08-26) - Pluggy now exposes its typings to static type checkers - Exported HookImpl as pluggy.HookImpl #### 1.0.0 (2021-08-25) - Raise PluginValidationError when registering a hookimpl declared as hookwrapper=True whose function is not a generator function - Add official support for Python 3.9 - Add specname option to @hookimpl to match hook implementations to specifications using a different name ### Changed #### 1.3.0 (2023-08-26) - Renamed _Result to Result and exported as pluggy.Result - Renamed _HookRelay to HookRelay and exported as pluggy.HookRelay - Renamed _HookCaller to HookCaller and exported as pluggy.HookCaller - Renamed _HookImplOpts to HookimplOpts and exported as pluggy.HookimplOpts - Renamed _HookSpecOpts to HookspecOpts and exported as pluggy.HookspecOpts - Some fields and classes are marked Final and @final #### 1.2.0 (2023-06-21) - New-style hook wrappers now require an explicit wrapper=True designation in the @hookimpl() decorator ### Fixed #### 1.6.0 (2025-05-15) - Fix a regression in pluggy 1.1.0 where using result.get_result() on the same failed Result causes the exception's traceback to get longer and longer - Correctly pass StopIteration through hook wrappers by resuming with the StopIteration as a normal exception instead of failing with the RuntimeError - Fix python 3.14 SyntaxError by rearranging code #### 1.5.0 (2024-04-20) - PluginManager.get_plugins() no longer returns None for blocked plugins #### 1.4.0 (2024-01-24) - Fix HookCaller.call_extra() extra methods getting ordered before everything else in some circumstances - Fix plugins registering other plugins in a hook when the other plugins implement the same hook itself ### Removed #### 1.6.0 (2025-05-15) - Python 3.8 is no longer supported #### 1.3.0 (2023-08-26) - Python 3.7 is no longer supported #### 1.0.0 (2021-08-25) - Remove deprecated implprefix support; use HookimplMarker instead - Remove the deprecated proc argument to call_historic; use result_callback instead - Remove the _Result.result property; use _Result.get_result() instead - Remove official support for Python 3.4 - Drop support for Python 2 - Remove official support for Python 3.5 - Mark internal pluggy.callers, pluggy.manager, and pluggy.hooks as private with _ prefix - Remove legacy __multicall__ recursive hook calling system ## Release notes ### 1.6.0 - Date: 2025-05-15 - Version: 1.6.0 - Original notes: https://pypi.org/project/pluggy/1.6.0/ - Permalink: https://whatsnew.fyi/product/pluggy/releases/1.6.0 - **removed** — Python 3.8 is no longer supported - **fixed** — Fix a regression in pluggy 1.1.0 where using result.get_result() on the same failed Result causes the exception's traceback to get longer and longer - **fixed** — Correctly pass StopIteration through hook wrappers by resuming with the StopIteration as a normal exception instead of failing with the RuntimeError - **fixed** — Fix python 3.14 SyntaxError by rearranging code Deprecations and Removals ------------------------- - `#556 `_: Python 3.8 is no longer supported. Bug Fixes --------- - `#504 `_: Fix a regression in pluggy 1.1.0 where using :func:`result.get_result() ` on the same failed :class:`~pluggy.Result` causes the exception's traceback to get longer and longer. - `#544 `_: Correctly pass :class:`StopIteration` through hook wrappers. Raising a :class:`StopIteration` in a generator triggers a :class:`RuntimeError`. If the :class:`RuntimeError` of a generator has the passed in :class:`StopIteration` as cause resume with that :class:`StopIteration` as normal exception instead of failing with the :class:`RuntimeError`. - `#573 `_: Fix python 3.14 SyntaxError by rearranging code. ### 1.5.0 - Date: 2024-04-20 - Version: 1.5.0 - Original notes: https://pypi.org/project/pluggy/1.5.0/ - Permalink: https://whatsnew.fyi/product/pluggy/releases/1.5.0 - **added** — Add support for deprecating specific hook parameters, or more generally, for issuing a warning whenever a hook implementation requests certain parameters - **fixed** — PluginManager.get_plugins() no longer returns None for blocked plugins Features -------- - `#178 `_: Add support for deprecating specific hook parameters, or more generally, for issuing a warning whenever a hook implementation requests certain parameters. See :ref:`warn_on_impl` for details. Bug Fixes --------- - `#481 `_: ``PluginManager.get_plugins()`` no longer returns ``None`` for blocked plugins. ### 1.4.0 - Date: 2024-01-24 - Version: 1.4.0 - Original notes: https://pypi.org/project/pluggy/1.4.0/ - Permalink: https://whatsnew.fyi/product/pluggy/releases/1.4.0 - **added** — Issue a PluggyTeardownRaisedWarning when an old-style hookwrapper raises an exception during teardown - **added** — Add PluginManager.unblock method to unblock a plugin by plugin name - **fixed** — Fix HookCaller.call_extra() extra methods getting ordered before everything else in some circumstances - **fixed** — Fix plugins registering other plugins in a hook when the other plugins implement the same hook itself Features -------- - `#463 `_: A warning :class:`~pluggy.PluggyTeardownRaisedWarning` is now issued when an old-style hookwrapper raises an exception during teardown. See the warning documentation for more details. - `#471 `_: Add :func:`PluginManager.unblock ` method to unblock a plugin by plugin name. Bug Fixes --------- - `#441 `_: Fix :func:`~pluggy.HookCaller.call_extra()` extra methods getting ordered before everything else in some circumstances. Regressed in pluggy 1.1.0. - `#438 `_: Fix plugins registering other plugins in a hook when the other plugins implement the same hook itself. Regressed in pluggy 1.1.0. ### 1.3.0 - Date: 2023-08-26 - Version: 1.3.0 - Original notes: https://pypi.org/project/pluggy/1.3.0/ - Permalink: https://whatsnew.fyi/product/pluggy/releases/1.3.0 - **removed** — Python 3.7 is no longer supported - **added** — Pluggy now exposes its typings to static type checkers - **changed** — Renamed _Result to Result and exported as pluggy.Result - **changed** — Renamed _HookRelay to HookRelay and exported as pluggy.HookRelay - **changed** — Renamed _HookCaller to HookCaller and exported as pluggy.HookCaller - **added** — Exported HookImpl as pluggy.HookImpl - **changed** — Renamed _HookImplOpts to HookimplOpts and exported as pluggy.HookimplOpts - **changed** — Renamed _HookSpecOpts to HookspecOpts and exported as pluggy.HookspecOpts - **changed** — Some fields and classes are marked Final and @final Deprecations and Removals ------------------------- - `#426 `_: Python 3.7 is no longer supported. Features -------- - `#428 `_: Pluggy now exposes its typings to static type checkers. As part of this, the following changes are made: - Renamed ``_Result`` to ``Result``, and exported as :class:`pluggy.Result`. - Renamed ``_HookRelay`` to ``HookRelay``, and exported as :class:`pluggy.HookRelay`. - Renamed ``_HookCaller`` to ``HookCaller``, and exported as :class:`pluggy.HookCaller`. - Exported ``HookImpl`` as :class:`pluggy.HookImpl`. - Renamed ``_HookImplOpts`` to ``HookimplOpts``, and exported as :class:`pluggy.HookimplOpts`. - Renamed ``_HookSpecOpts`` to ``HookspecOpts``, and exported as :class:`pluggy.HookspecOpts`. - Some fields and classes are marked ``Final`` and ``@final``. - The :ref:`api-reference` is updated to clearly delineate pluggy's public API. Compatibility aliases are put in place for the renamed types. We do not plan to remove the aliases, but we strongly recommend to only import from ``pluggy.*`` to ensure future compatibility. Please note that pluggy is currently unable to provide strong typing for hook calls, e.g. ``pm.hook.my_hook(...)``, nor to statically check that a hook implementation matches the hook specification's type. ### 1.2.0 - Date: 2023-06-21 - Version: 1.2.0 - Original notes: https://pypi.org/project/pluggy/1.2.0/ - Permalink: https://whatsnew.fyi/product/pluggy/releases/1.2.0 - **changed** — New-style hook wrappers now require an explicit wrapper=True designation in the @hookimpl() decorator Features -------- - `#405 `_: The new-style hook wrappers, added in the yanked 1.1.0 release, now require an explicit ``wrapper=True`` designation in the ``@hookimpl()`` decorator. ### 1.0.0 - Date: 2021-08-25 - Version: 1.0.0 - Original notes: https://pypi.org/project/pluggy/1.0.0/ - Permalink: https://whatsnew.fyi/product/pluggy/releases/1.0.0 - **removed** — Remove deprecated implprefix support; use HookimplMarker instead - **removed** — Remove the deprecated proc argument to call_historic; use result_callback instead - **removed** — Remove the _Result.result property; use _Result.get_result() instead - **removed** — Remove official support for Python 3.4 - **removed** — Drop support for Python 2 - **removed** — Remove official support for Python 3.5 - **removed** — Mark internal pluggy.callers, pluggy.manager, and pluggy.hooks as private with _ prefix - **removed** — Remove legacy __multicall__ recursive hook calling system - **added** — Raise PluginValidationError when registering a hookimpl declared as hookwrapper=True whose function is not a generator function - **added** — Add official support for Python 3.9 - **added** — Add specname option to @hookimpl to match hook implementations to specifications using a different name Deprecations and Removals ------------------------- - `#116 `_: Remove deprecated ``implprefix`` support. Decorate hook implementations using an instance of HookimplMarker instead. The deprecation was announced in release ``0.7.0``. - `#120 `_: Remove the deprecated ``proc`` argument to ``call_historic``. Use ``result_callback`` instead, which has the same behavior. The deprecation was announced in release ``0.7.0``. - `#265 `_: Remove the ``_Result.result`` property. Use ``_Result.get_result()`` instead. Note that unlike ``result``, ``get_result()`` raises the exception if the hook raised. The deprecation was announced in release ``0.6.0``. - `#267 `_: Remove official support for Python 3.4. - `#272 `_: Dropped support for Python 2. Continue to use pluggy 0.13.x for Python 2 support. - `#308 `_: Remove official support for Python 3.5. - `#313 `_: The internal ``pluggy.callers``, ``pluggy.manager`` and ``pluggy.hooks`` are now explicitly marked private by a ``_`` prefix (e.g. ``pluggy._callers``). Only API exported by the top-level ``pluggy`` module is considered public. - `#59 `_: Remove legacy ``__multicall__`` recursive hook calling system. The deprecation was announced in release ``0.5.0``. Features -------- - `#282 `_: When registering a hookimpl which is declared as ``hookwrapper=True`` but whose function is not a generator function, a :class:`~pluggy.PluginValidationError` exception is now raised. Previously this problem would cause an error only later, when calling the hook. In the unlikely case that you have a hookwrapper that *returns* a generator instead of yielding directly, for example: .. code-block:: python def my_hook_implementation(arg): print("before") yield print("after") @hookimpl(hookwrapper=True) def my_hook(arg): return my_hook_implementation(arg) change it to use ``yield from`` instead: .. code-block:: python @hookimpl(hookwrapper=True) def my_hook(arg): yield from my_hook_implementation(arg) - `#309 `_: Add official support for Python 3.9. - `#251 `_: Add ``specname`` option to ``@hookimpl``. If ``specname`` is provided, it will be used instead of the function name when matching this hook implementation to a hook specification during registration (allowing a plugin to register a hook implementation that was not named the same thing as the corresponding ``@hookspec``).