-
Notifications
You must be signed in to change notification settings - Fork 124
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Avoid triggering @property methods on plugins when looking for hookimpls during registration #536
base: main
Are you sure you want to change the base?
Conversation
Codecov is complaining about whitespace lines and comment lines not being covered? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me, wondering if we should take static getattr from pytest for fetching declarations
updates: - [github.com/astral-sh/ruff-pre-commit: v0.6.7 → v0.6.8](astral-sh/ruff-pre-commit@v0.6.7...v0.6.8) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci
Ok I've updated the PR:
For a full demo of the exhaustive tests showing that it works in those cases ^ (including pydantic-specific tests that I did not put in the PR) see here: https://gist.github.com/pirate/66f12beac594c99c697cd5543a1cb77b |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this looks good to me, Thanks!
i'd like to get a final ok from @bluetech
@@ -181,7 +192,19 @@ def parse_hookimpl_opts(self, plugin: _Plugin, name: str) -> HookimplOpts | None | |||
customize how hook implementation are picked up. By default, returns the | |||
options for items decorated with :class:`HookimplMarker`. | |||
""" | |||
method: object = getattr(plugin, name) | |||
|
|||
if _attr_is_property(plugin, name): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i recently re-discovered inspect.getattr_static
i wonder if that one may be nice for a followup change
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When I last looked at it, the main downside of getattr_static
was that it was very slow. Though may this has improved (I think I saw mention of that).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for removing the pydantic bit. I still have a question on the AttributeError
case.
Co-authored-by: Ran Benita <ran@unusedvar.com>
Hey all, thanks for making pluggy! I'm loving using it so far. 🥳
Currently pluggy fairly aggressively inspects every plugin's attrs upon registration in order to look for potential
@hookimpl
-marked methods.Based on the existing implementation in
PluginManager.register() -> ... -> parse_hookimpl_opts()
, it's clear that the intention is to only look forCallable
methods marked with the@hookimpl
decorator (it skips over any non-methods / undecorated-methods it finds in the process).If a plugin is class-based, the current implementation using
inspect.isroutine(getattr(plugin, name))
has the unintended consequence of evaluating every single@property
method on the passed plugin object, which can have side effects because property methods can execute arbitrary code upon access!This PR corrects this by pre-checking if a given plugin attr is a
@property
(or pydantic field), before attempting togetattr(plugin, name)
to pass it toinspect.isroutine(...)
.