Skip to content

Commit bc055e8

Browse files
Fix required_plugins with prereleases (#8469)
* Fix required_plugins with prereleases Fixes #8456 * Fix existing tests * Update changelog/8456.bugfix.rst Co-authored-by: Bruno Oliveira <[email protected]> Co-authored-by: Bruno Oliveira <[email protected]>
1 parent 35df3e6 commit bc055e8

File tree

3 files changed

+30
-9
lines changed

3 files changed

+30
-9
lines changed

changelog/8456.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
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.

src/_pytest/config/__init__.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,14 +1270,16 @@ def _validate_plugins(self) -> None:
12701270
missing_plugins = []
12711271
for required_plugin in required_plugins:
12721272
try:
1273-
spec = Requirement(required_plugin)
1273+
req = Requirement(required_plugin)
12741274
except InvalidRequirement:
12751275
missing_plugins.append(required_plugin)
12761276
continue
12771277

1278-
if spec.name not in plugin_dist_info:
1278+
if req.name not in plugin_dist_info:
12791279
missing_plugins.append(required_plugin)
1280-
elif Version(plugin_dist_info[spec.name]) not in spec.specifier:
1280+
elif not req.specifier.contains(
1281+
Version(plugin_dist_info[req.name]), prereleases=True
1282+
):
12811283
missing_plugins.append(required_plugin)
12821284

12831285
if missing_plugins:

testing/test_config.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -309,13 +309,14 @@ def pytest_configure(config):
309309
result.stdout.no_fnmatch_line("*PytestConfigWarning*")
310310

311311
@pytest.mark.parametrize(
312-
"ini_file_text, exception_text",
312+
"ini_file_text, plugin_version, exception_text",
313313
[
314314
pytest.param(
315315
"""
316316
[pytest]
317317
required_plugins = a z
318318
""",
319+
"1.5",
319320
"Missing required plugins: a, z",
320321
id="2-missing",
321322
),
@@ -324,6 +325,7 @@ def pytest_configure(config):
324325
[pytest]
325326
required_plugins = a z myplugin
326327
""",
328+
"1.5",
327329
"Missing required plugins: a, z",
328330
id="2-missing-1-ok",
329331
),
@@ -332,6 +334,7 @@ def pytest_configure(config):
332334
[pytest]
333335
required_plugins = myplugin
334336
""",
337+
"1.5",
335338
None,
336339
id="1-ok",
337340
),
@@ -340,6 +343,7 @@ def pytest_configure(config):
340343
[pytest]
341344
required_plugins = myplugin==1.5
342345
""",
346+
"1.5",
343347
None,
344348
id="1-ok-pin-exact",
345349
),
@@ -348,23 +352,35 @@ def pytest_configure(config):
348352
[pytest]
349353
required_plugins = myplugin>1.0,<2.0
350354
""",
355+
"1.5",
351356
None,
352357
id="1-ok-pin-loose",
353358
),
354359
pytest.param(
355360
"""
356361
[pytest]
357-
required_plugins = pyplugin==1.6
362+
required_plugins = myplugin
363+
""",
364+
"1.5a1",
365+
None,
366+
id="1-ok-prerelease",
367+
),
368+
pytest.param(
369+
"""
370+
[pytest]
371+
required_plugins = myplugin==1.6
358372
""",
359-
"Missing required plugins: pyplugin==1.6",
373+
"1.5",
374+
"Missing required plugins: myplugin==1.6",
360375
id="missing-version",
361376
),
362377
pytest.param(
363378
"""
364379
[pytest]
365-
required_plugins = pyplugin==1.6 other==1.0
380+
required_plugins = myplugin==1.6 other==1.0
366381
""",
367-
"Missing required plugins: other==1.0, pyplugin==1.6",
382+
"1.5",
383+
"Missing required plugins: myplugin==1.6, other==1.0",
368384
id="missing-versions",
369385
),
370386
pytest.param(
@@ -373,6 +389,7 @@ def pytest_configure(config):
373389
required_plugins = wont be triggered
374390
[pytest]
375391
""",
392+
"1.5",
376393
None,
377394
id="invalid-header",
378395
),
@@ -383,6 +400,7 @@ def test_missing_required_plugins(
383400
pytester: Pytester,
384401
monkeypatch: MonkeyPatch,
385402
ini_file_text: str,
403+
plugin_version: str,
386404
exception_text: str,
387405
) -> None:
388406
"""Check 'required_plugins' option with various settings.
@@ -408,7 +426,7 @@ def load(self):
408426
class DummyDist:
409427
entry_points = attr.ib()
410428
files = ()
411-
version = "1.5"
429+
version = plugin_version
412430

413431
@property
414432
def metadata(self):

0 commit comments

Comments
 (0)