From 5d74c1a43bd9679df8de319daa88d33079931216 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 19 Mar 2021 17:04:08 +0100 Subject: [PATCH 1/3] Fix required_plugins with prereleases Fixes #8456 --- src/_pytest/config/__init__.py | 8 +++++--- testing/test_config.py | 22 ++++++++++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/_pytest/config/__init__.py b/src/_pytest/config/__init__.py index 144f1c9d112..debba6ea298 100644 --- a/src/_pytest/config/__init__.py +++ b/src/_pytest/config/__init__.py @@ -1270,14 +1270,16 @@ def _validate_plugins(self) -> None: missing_plugins = [] for required_plugin in required_plugins: try: - spec = Requirement(required_plugin) + req = Requirement(required_plugin) except InvalidRequirement: missing_plugins.append(required_plugin) continue - if spec.name not in plugin_dist_info: + if req.name not in plugin_dist_info: missing_plugins.append(required_plugin) - elif Version(plugin_dist_info[spec.name]) not in spec.specifier: + elif not req.specifier.contains( + Version(plugin_dist_info[req.name]), prereleases=True + ): missing_plugins.append(required_plugin) if missing_plugins: diff --git a/testing/test_config.py b/testing/test_config.py index fbeabaff69f..f95ea8c47e9 100644 --- a/testing/test_config.py +++ b/testing/test_config.py @@ -309,13 +309,14 @@ def pytest_configure(config): result.stdout.no_fnmatch_line("*PytestConfigWarning*") @pytest.mark.parametrize( - "ini_file_text, exception_text", + "ini_file_text, plugin_version, exception_text", [ pytest.param( """ [pytest] required_plugins = a z """, + "1.5", "Missing required plugins: a, z", id="2-missing", ), @@ -324,6 +325,7 @@ def pytest_configure(config): [pytest] required_plugins = a z myplugin """, + "1.5", "Missing required plugins: a, z", id="2-missing-1-ok", ), @@ -332,6 +334,7 @@ def pytest_configure(config): [pytest] required_plugins = myplugin """, + "1.5", None, id="1-ok", ), @@ -340,6 +343,7 @@ def pytest_configure(config): [pytest] required_plugins = myplugin==1.5 """, + "1.5", None, id="1-ok-pin-exact", ), @@ -348,14 +352,25 @@ def pytest_configure(config): [pytest] required_plugins = myplugin>1.0,<2.0 """, + "1.5", None, id="1-ok-pin-loose", ), + pytest.param( + """ + [pytest] + required_plugins = myplugin + """, + "1.5a1", + None, + id="1-ok-prerelease", + ), pytest.param( """ [pytest] required_plugins = pyplugin==1.6 """, + "1.5", "Missing required plugins: pyplugin==1.6", id="missing-version", ), @@ -364,6 +379,7 @@ def pytest_configure(config): [pytest] required_plugins = pyplugin==1.6 other==1.0 """, + "1.5", "Missing required plugins: other==1.0, pyplugin==1.6", id="missing-versions", ), @@ -373,6 +389,7 @@ def pytest_configure(config): required_plugins = wont be triggered [pytest] """, + "1.5", None, id="invalid-header", ), @@ -383,6 +400,7 @@ def test_missing_required_plugins( pytester: Pytester, monkeypatch: MonkeyPatch, ini_file_text: str, + plugin_version: str, exception_text: str, ) -> None: """Check 'required_plugins' option with various settings. @@ -408,7 +426,7 @@ def load(self): class DummyDist: entry_points = attr.ib() files = () - version = "1.5" + version = plugin_version @property def metadata(self): From 57e69b5d9f43bea9620f7f51112110820862b1a8 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 19 Mar 2021 17:04:35 +0100 Subject: [PATCH 2/3] Fix existing tests --- changelog/8456.bugfix.rst | 1 + testing/test_config.py | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 changelog/8456.bugfix.rst diff --git a/changelog/8456.bugfix.rst b/changelog/8456.bugfix.rst new file mode 100644 index 00000000000..d51ccb1fb17 --- /dev/null +++ b/changelog/8456.bugfix.rst @@ -0,0 +1 @@ +The `required_plugins` config option now works correctly when pre-releases of plugins are installed, rather than falsely claiming that those plugins aren't installed at all. diff --git a/testing/test_config.py b/testing/test_config.py index f95ea8c47e9..61fea3643b9 100644 --- a/testing/test_config.py +++ b/testing/test_config.py @@ -368,19 +368,19 @@ def pytest_configure(config): pytest.param( """ [pytest] - required_plugins = pyplugin==1.6 + required_plugins = myplugin==1.6 """, "1.5", - "Missing required plugins: pyplugin==1.6", + "Missing required plugins: myplugin==1.6", id="missing-version", ), pytest.param( """ [pytest] - required_plugins = pyplugin==1.6 other==1.0 + required_plugins = myplugin==1.6 other==1.0 """, "1.5", - "Missing required plugins: other==1.0, pyplugin==1.6", + "Missing required plugins: myplugin==1.6, other==1.0", id="missing-versions", ), pytest.param( From 378ec8fb7bbcec2e35180a78a0a986db3a6eefb6 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 19 Mar 2021 23:02:28 +0100 Subject: [PATCH 3/3] Update changelog/8456.bugfix.rst Co-authored-by: Bruno Oliveira --- changelog/8456.bugfix.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/8456.bugfix.rst b/changelog/8456.bugfix.rst index d51ccb1fb17..da9370b7b1b 100644 --- a/changelog/8456.bugfix.rst +++ b/changelog/8456.bugfix.rst @@ -1 +1 @@ -The `required_plugins` config option now works correctly when pre-releases of plugins are installed, rather than falsely claiming that those plugins aren't installed at all. +The :confval:`required_plugins` config option now works correctly when pre-releases of plugins are installed, rather than falsely claiming that those plugins aren't installed at all.