Skip to content

Improve PluginValidationErrors #5102

Closed
Closed
@blueyed

Description

@blueyed

PluginValidationErrors should be turned into a friendlier error message, and especially stating the reason in a more useful way.

pluggy.manager.PluginValidationError: Plugin 'xdist' could not be loaded: (pytest 4.1.1 (/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages), Requirement.parse('pytest>=4.4.0'))!

This should say instead:

The plugin "xdist" could not be loaded (requires pytest>=4.4.0, but has pytest 4.1.1)

The best might be to check/handle PluginValidationError in main().

Currently it looks like this:

Traceback (most recent call last):
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/pluggy/manager.py", line 274, in load_setuptools_entrypoints
    plugin = ep.load()
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2433, in load
    self.require(*args, **kwargs)
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2456, in require
    items = working_set.resolve(reqs, env, installer, extras=self.extras)
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/pkg_resources/__init__.py", line 791, in resolve
    raise VersionConflict(dist, req).with_context(dependent_req)
pkg_resources.VersionConflict: (pytest 4.1.1 (/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages), Requirement.parse('pytest>=4.4.0'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/bin/py.test", line 10, in <module>
    sys.exit(main())
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/_pytest/config/__init__.py", line 61, in main
    config = _prepareconfig(args, plugins)
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/_pytest/config/__init__.py", line 196, in _prepareconfig
    pluginmanager=pluginmanager, args=args
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/pluggy/hooks.py", line 289, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/pluggy/manager.py", line 68, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/pluggy/manager.py", line 62, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/pluggy/callers.py", line 203, in _multicall
    gen.send(outcome)
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/_pytest/helpconfig.py", line 93, in pytest_cmdline_parse
    config = outcome.get_result()
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/pluggy/callers.py", line 80, in get_result
    raise ex[1].with_traceback(ex[2])
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/_pytest/config/__init__.py", line 652, in pytest_cmdline_parse
    self.parse(args)
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/_pytest/config/__init__.py", line 838, in parse
    self._preparse(args, addopts=addopts)
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/_pytest/config/__init__.py", line 784, in _preparse
    self.pluginmanager.load_setuptools_entrypoints("pytest11")
  File "/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages/pluggy/manager.py", line 280, in load_setuptools_entrypoints
    message="Plugin %r could not be loaded: %s!" % (ep.name, e),
pluggy.manager.PluginValidationError: Plugin 'xdist' could not be loaded: (pytest 4.1.1 (/tmp/tox…/Vcs/pytest-testmon/py36-pytest41-xdist/lib/python3.6/site-packages), Requirement.parse('pytest>=4.4.0'))!

Somehow related PR for inspiration: #4077.

Metadata

Metadata

Assignees

No one assigned

    Labels

    type: enhancementnew feature or API change, should be merged into features branch

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions