Metadata-Version: 2.1 Name: pluggy Version: 0.13.1 Summary: plugin and hook calling mechanisms for python Home-page: https://github.com/pytest-dev/pluggy Author: Holger Krekel Author-email: holger@merlinux.eu License: MIT license Platform: unix Platform: linux Platform: osx Platform: win32 Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: POSIX Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: MacOS :: MacOS X Classifier: Topic :: Software Development :: Testing Classifier: Topic :: Software Development :: Libraries Classifier: Topic :: Utilities Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* Requires-Dist: importlib-metadata (>=0.12) ; python_version < "3.8" Provides-Extra: dev Requires-Dist: pre-commit ; extra == 'dev' Requires-Dist: tox ; extra == 'dev' ==================================================== pluggy - A minimalist production ready plugin system ==================================================== |pypi| |conda-forge| |versions| |travis| |appveyor| |gitter| |black| |codecov| This is the core framework used by the `pytest`_, `tox`_, and `devpi`_ projects. Please `read the docs`_ to learn more! A definitive example ==================== .. code-block:: python import pluggy hookspec = pluggy.HookspecMarker("myproject") hookimpl = pluggy.HookimplMarker("myproject") class MySpec(object): """A hook specification namespace. """ @hookspec def myhook(self, arg1, arg2): """My special little hook that you can customize. """ class Plugin_1(object): """A hook implementation namespace. """ @hookimpl def myhook(self, arg1, arg2): print("inside Plugin_1.myhook()") return arg1 + arg2 class Plugin_2(object): """A 2nd hook implementation namespace. """ @hookimpl def myhook(self, arg1, arg2): print("inside Plugin_2.myhook()") return arg1 - arg2 # create a manager and add the spec pm = pluggy.PluginManager("myproject") pm.add_hookspecs(MySpec) # register plugins pm.register(Plugin_1()) pm.register(Plugin_2()) # call our ``myhook`` hook results = pm.hook.myhook(arg1=1, arg2=2) print(results) Running this directly gets us:: $ python docs/examples/toy-example.py inside Plugin_2.myhook() inside Plugin_1.myhook() [-1, 3] .. badges .. |pypi| image:: https://img.shields.io/pypi/v/pluggy.svg :target: https://pypi.org/pypi/pluggy .. |versions| image:: https://img.shields.io/pypi/pyversions/pluggy.svg :target: https://pypi.org/pypi/pluggy .. |travis| image:: https://img.shields.io/travis/pytest-dev/pluggy/master.svg :target: https://travis-ci.org/pytest-dev/pluggy .. |appveyor| image:: https://img.shields.io/appveyor/ci/pytestbot/pluggy/master.svg :target: https://ci.appveyor.com/project/pytestbot/pluggy .. |conda-forge| image:: https://img.shields.io/conda/vn/conda-forge/pluggy.svg :target: https://anaconda.org/conda-forge/pytest .. |gitter| image:: https://badges.gitter.im/pytest-dev/pluggy.svg :alt: Join the chat at https://gitter.im/pytest-dev/pluggy :target: https://gitter.im/pytest-dev/pluggy?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge .. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg :target: https://github.com/ambv/black .. |codecov| image:: https://codecov.io/gh/pytest-dev/pluggy/branch/master/graph/badge.svg :target: https://codecov.io/gh/pytest-dev/pluggy :alt: Code coverage Status .. links .. _pytest: http://pytest.org .. _tox: https://tox.readthedocs.org .. _devpi: http://doc.devpi.net .. _read the docs: https://pluggy.readthedocs.io/en/latest/ ========= Changelog ========= .. towncrier release notes start pluggy 0.13.1 (2019-11-21) ========================== Trivial/Internal Changes ------------------------ - `#236 `_: Improved documentation, especially with regard to references. pluggy 0.13.0 (2019-09-10) ========================== Trivial/Internal Changes ------------------------ - `#222 `_: Replace ``importlib_metadata`` backport with ``importlib.metadata`` from the standard library on Python 3.8+. pluggy 0.12.0 (2019-05-27) ========================== Features -------- - `#215 `_: Switch from ``pkg_resources`` to ``importlib-metadata`` for entrypoint detection for improved performance and import time. This time with ``.egg`` support. pluggy 0.11.0 (2019-05-07) ========================== Bug Fixes --------- - `#205 `_: Revert changes made in 0.10.0 release breaking ``.egg`` installs. pluggy 0.10.0 (2019-05-07) ========================== Features -------- - `#199 `_: Switch from ``pkg_resources`` to ``importlib-metadata`` for entrypoint detection for improved performance and import time. pluggy 0.9.0 (2019-02-21) ========================= Features -------- - `#189 `_: ``PluginManager.load_setuptools_entrypoints`` now accepts a ``name`` parameter that when given will load only entry points with that name. ``PluginManager.load_setuptools_entrypoints`` also now returns the number of plugins loaded by the call, as opposed to the number of all plugins loaded by all calls to this method. Bug Fixes --------- - `#187 `_: Fix internal ``varnames`` function for PyPy3. pluggy 0.8.1 (2018-11-09) ========================= Trivial/Internal Changes ------------------------ - `#166 `_: Add ``stacklevel=2`` to implprefix warning so that the reported location of warning is the caller of PluginManager. pluggy 0.8.0 (2018-10-15) ========================= Features -------- - `#177 `_: Add ``get_hookimpls()`` method to hook callers. Trivial/Internal Changes ------------------------ - `#165 `_: Add changelog in long package description and documentation. - `#172 `_: Add a test exemplifying the opt-in nature of spec defined args. - `#57 `_: Encapsulate hook specifications in a type for easier introspection. pluggy 0.7.1 (2018-07-28) ========================= Deprecations and Removals ------------------------- - `#116 `_: Deprecate the ``implprefix`` kwarg to ``PluginManager`` and instead expect users to start using explicit ``HookimplMarker`` everywhere. Features -------- - `#122 `_: Add ``.plugin`` member to ``PluginValidationError`` to access failing plugin during post-mortem. - `#138 `_: Add per implementation warnings support for hookspecs allowing for both deprecation and future warnings of legacy and (future) experimental hooks respectively. Bug Fixes --------- - `#110 `_: Fix a bug where ``_HookCaller.call_historic()`` would call the ``proc`` arg even when the default is ``None`` resulting in a ``TypeError``. - `#160 `_: Fix problem when handling ``VersionConflict`` errors when loading setuptools plugins. Improved Documentation ---------------------- - `#123 `_: Document how exceptions are handled and how the hook call loop terminates immediately on the first error which is then delivered to any surrounding wrappers. - `#136 `_: Docs rework including a much better introduction and comprehensive example set for new users. A big thanks goes out to @obestwalter for the great work! Trivial/Internal Changes ------------------------ - `#117 `_: Break up the main monolithic package modules into separate modules by concern - `#131 `_: Automate ``setuptools`` wheels building and PyPi upload using TravisCI. - `#153 `_: Reorganize tests more appropriately by modules relating to each internal component/feature. This is in an effort to avoid (future) duplication and better separation of concerns in the test set. - `#156 `_: Add ``HookImpl.__repr__()`` for better debugging. - `#66 `_: Start using ``towncrier`` and a custom ``tox`` environment to prepare releases! pluggy 0.7.0 (Unreleased) ========================= * `#160 `_: We discovered a deployment issue so this version was never released to PyPI, only the tag exists. pluggy 0.6.0 (2017-11-24) ========================= - Add CI testing for the features, release, and master branches of ``pytest`` (PR `#79`_). - Document public API for ``_Result`` objects passed to wrappers (PR `#85`_). - Document and test hook LIFO ordering (PR `#85`_). - Turn warnings into errors in test suite (PR `#89`_). - Deprecate ``_Result.result`` (PR `#88`_). - Convert ``_Multicall`` to a simple function distinguishing it from the legacy version (PR `#90`_). - Resolve E741 errors (PR `#96`_). - Test and bug fix for unmarked hook collection (PRs `#97`_ and `#102`_). - Drop support for EOL Python 2.6 and 3.3 (PR `#103`_). - Fix ``inspect`` based arg introspection on py3.6 (PR `#94`_). .. _#79: https://github.com/pytest-dev/pluggy/pull/79 .. _#85: https://github.com/pytest-dev/pluggy/pull/85 .. _#88: https://github.com/pytest-dev/pluggy/pull/88 .. _#89: https://github.com/pytest-dev/pluggy/pull/89 .. _#90: https://github.com/pytest-dev/pluggy/pull/90 .. _#94: https://github.com/pytest-dev/pluggy/pull/94 .. _#96: https://github.com/pytest-dev/pluggy/pull/96 .. _#97: https://github.com/pytest-dev/pluggy/pull/97 .. _#102: https://github.com/pytest-dev/pluggy/pull/102 .. _#103: https://github.com/pytest-dev/pluggy/pull/103 pluggy 0.5.2 (2017-09-06) ========================= - fix bug where ``firstresult`` wrappers were being sent an incorrectly configured ``_Result`` (a list was set instead of a single value). Add tests to check for this as well as ``_Result.force_result()`` behaviour. Thanks to `@tgoodlet`_ for the PR `#72`_. - fix incorrect ``getattr`` of ``DeprecationWarning`` from the ``warnings`` module. Thanks to `@nicoddemus`_ for the PR `#77`_. - hide ``pytest`` tracebacks in certain core routines. Thanks to `@nicoddemus`_ for the PR `#80`_. .. _#72: https://github.com/pytest-dev/pluggy/pull/72 .. _#77: https://github.com/pytest-dev/pluggy/pull/77 .. _#80: https://github.com/pytest-dev/pluggy/pull/80 pluggy 0.5.1 (2017-08-29) ========================= - fix a bug and add tests for case where ``firstresult`` hooks return ``None`` results. Thanks to `@RonnyPfannschmidt`_ and `@tgoodlet`_ for the issue (`#68`_) and PR (`#69`_) respectively. .. _#69: https://github.com/pytest-dev/pluggy/pull/69 .. _#68: https://github.com/pytest-dev/pluggy/issues/68 pluggy 0.5.0 (2017-08-28) ========================= - fix bug where callbacks for historic hooks would not be called for already registered plugins. Thanks `@vodik`_ for the PR and `@hpk42`_ for further fixes. - fix `#17`_ by considering only actual functions for hooks this removes the ability to register arbitrary callable objects which at first glance is a reasonable simplification, thanks `@RonnyPfannschmidt`_ for report and pr. - fix `#19`_: allow registering hookspecs from instances. The PR from `@tgoodlet`_ also modernized the varnames implementation. - resolve `#32`_: split up the test set into multiple modules. Thanks to `@RonnyPfannschmidt`_ for the PR and `@tgoodlet`_ for the initial request. - resolve `#14`_: add full sphinx docs. Thanks to `@tgoodlet`_ for PR `#39`_. - add hook call mismatch warnings. Thanks to `@tgoodlet`_ for the PR `#42`_. - resolve `#44`_: move to new-style classes. Thanks to `@MichalTHEDUDE`_ for PR `#46`_. - add baseline benchmarking/speed tests using ``pytest-benchmark`` in PR `#54`_. Thanks to `@tgoodlet`_. - update the README to showcase the API. Thanks to `@tgoodlet`_ for the issue and PR `#55`_. - deprecate ``__multicall__`` and add a faster call loop implementation. Thanks to `@tgoodlet`_ for PR `#58`_. - raise a comprehensible error when a ``hookimpl`` is called with positional args. Thanks to `@RonnyPfannschmidt`_ for the issue and `@tgoodlet`_ for PR `#60`_. - fix the ``firstresult`` test making it more complete and remove a duplicate of that test. Thanks to `@tgoodlet`_ for PR `#62`_. .. _#62: https://github.com/pytest-dev/pluggy/pull/62 .. _#60: https://github.com/pytest-dev/pluggy/pull/60 .. _#58: https://github.com/pytest-dev/pluggy/pull/58 .. _#55: https://github.com/pytest-dev/pluggy/pull/55 .. _#54: https://github.com/pytest-dev/pluggy/pull/54 .. _#46: https://github.com/pytest-dev/pluggy/pull/46 .. _#44: https://github.com/pytest-dev/pluggy/issues/44 .. _#42: https://github.com/pytest-dev/pluggy/pull/42 .. _#39: https://github.com/pytest-dev/pluggy/pull/39 .. _#32: https://github.com/pytest-dev/pluggy/pull/32 .. _#19: https://github.com/pytest-dev/pluggy/issues/19 .. _#17: https://github.com/pytest-dev/pluggy/issues/17 .. _#14: https://github.com/pytest-dev/pluggy/issues/14 pluggy 0.4.0 (2016-09-25) ========================= - add ``has_plugin(name)`` method to pluginmanager. thanks `@nicoddemus`_. - fix `#11`_: make plugin parsing more resilient against exceptions from ``__getattr__`` functions. Thanks `@nicoddemus`_. - fix issue `#4`_: specific ``HookCallError`` exception for when a hook call provides not enough arguments. - better error message when loading setuptools entrypoints fails due to a ``VersionConflict``. Thanks `@blueyed`_. .. _#11: https://github.com/pytest-dev/pluggy/issues/11 .. _#4: https://github.com/pytest-dev/pluggy/issues/4 pluggy 0.3.1 (2015-09-17) ========================= - avoid using deprecated-in-python3.5 getargspec method. Thanks `@mdboom`_. pluggy 0.3.0 (2015-05-07) ========================= initial release .. contributors .. _@hpk42: https://github.com/hpk42 .. _@tgoodlet: https://github.com/goodboy .. _@MichalTHEDUDE: https://github.com/MichalTHEDUDE .. _@vodik: https://github.com/vodik .. _@RonnyPfannschmidt: https://github.com/RonnyPfannschmidt .. _@blueyed: https://github.com/blueyed .. _@nicoddemus: https://github.com/nicoddemus .. _@mdboom: https://github.com/mdboom