From d68d5eb343c0f41c04b0da04b073fcf011a241d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Wed, 3 Jul 2019 01:46:44 +0200 Subject: [PATCH] Replace importlib_metadata with importlib.metadata on Python 3.8+ Fixes https://github.com/pytest-dev/pytest/issues/5537 --- changelog/5537.bugfix.rst | 2 ++ setup.py | 2 +- src/_pytest/config/__init__.py | 8 ++++++-- testing/acceptance_test.py | 8 ++++++-- testing/test_assertion.py | 8 ++++++-- testing/test_config.py | 17 ++++++++++------- testing/test_entry_points.py | 9 +++++++-- 7 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 changelog/5537.bugfix.rst diff --git a/changelog/5537.bugfix.rst b/changelog/5537.bugfix.rst new file mode 100644 index 00000000000..0263e8cdf4c --- /dev/null +++ b/changelog/5537.bugfix.rst @@ -0,0 +1,2 @@ +Replace ``importlib_metadata`` backport with ``importlib.metadata`` from the +standard library on Python 3.8+. diff --git a/setup.py b/setup.py index 4c87c6429bb..e8bc8e895ca 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ 'pathlib2>=2.2.0;python_version<"3.6"', 'colorama;sys_platform=="win32"', "pluggy>=0.12,<1.0", - "importlib-metadata>=0.12", + 'importlib-metadata>=0.12;python_version<"3.8"', "wcwidth", ] diff --git a/src/_pytest/config/__init__.py b/src/_pytest/config/__init__.py index c1bd2e7ebd9..b408e391e52 100644 --- a/src/_pytest/config/__init__.py +++ b/src/_pytest/config/__init__.py @@ -9,7 +9,6 @@ import warnings from functools import lru_cache -import importlib_metadata import py from packaging.version import Version from pluggy import HookimplMarker @@ -29,6 +28,11 @@ from _pytest.outcomes import Skipped from _pytest.warning_types import PytestConfigWarning +if sys.version_info >= (3, 8): + from importlib import metadata +else: + import importlib_metadata as metadata + hookimpl = HookimplMarker("pytest") hookspec = HookspecMarker("pytest") @@ -772,7 +776,7 @@ def _mark_plugins_for_rewrite(self, hook): package_files = ( str(file) - for dist in importlib_metadata.distributions() + for dist in metadata.distributions() if any(ep.group == "pytest11" for ep in dist.entry_points) for file in dist.files or [] ) diff --git a/testing/acceptance_test.py b/testing/acceptance_test.py index d2a348f40a9..cf1b8ac9191 100644 --- a/testing/acceptance_test.py +++ b/testing/acceptance_test.py @@ -4,13 +4,17 @@ import types import attr -import importlib_metadata import py import pytest from _pytest.main import ExitCode from _pytest.warnings import SHOW_PYTEST_WARNINGS_ARG +if sys.version_info >= (3, 8): + from importlib import metadata +else: + import importlib_metadata as metadata + def prepend_pythonpath(*dirs): cur = os.getenv("PYTHONPATH") @@ -137,7 +141,7 @@ class DummyDist: def my_dists(): return (DummyDist(entry_points),) - monkeypatch.setattr(importlib_metadata, "distributions", my_dists) + monkeypatch.setattr(metadata, "distributions", my_dists) params = ("-p", "mycov") if load_cov_early else () testdir.runpytest_inprocess(*params) if load_cov_early: diff --git a/testing/test_assertion.py b/testing/test_assertion.py index f58d240a57f..7e95ed5b396 100644 --- a/testing/test_assertion.py +++ b/testing/test_assertion.py @@ -172,7 +172,11 @@ def check(values, value): return check """, "mainwrapper.py": """\ - import pytest, importlib_metadata + import pytest, sys + if sys.version_info >= (3, 8): + from importlib import metadata + else: + import importlib_metadata as metadata class DummyEntryPoint(object): name = 'spam' @@ -192,7 +196,7 @@ class DummyDistInfo(object): def distributions(): return (DummyDistInfo(),) - importlib_metadata.distributions = distributions + metadata.distributions = distributions pytest.main() """, "test_foo.py": """\ diff --git a/testing/test_config.py b/testing/test_config.py index ff993e401c4..9fd753333c9 100644 --- a/testing/test_config.py +++ b/testing/test_config.py @@ -1,8 +1,6 @@ import sys import textwrap -import importlib_metadata - import _pytest._code import pytest from _pytest.config import _iter_rewritable_modules @@ -12,6 +10,11 @@ from _pytest.config.findpaths import getcfg from _pytest.main import ExitCode +if sys.version_info >= (3, 8): + from importlib import metadata +else: + import importlib_metadata as metadata + class TestParseIni: @pytest.mark.parametrize( @@ -540,7 +543,7 @@ class Dist: def my_dists(): return (Dist,) - monkeypatch.setattr(importlib_metadata, "distributions", my_dists) + monkeypatch.setattr(metadata, "distributions", my_dists) testdir.makeconftest( """ pytest_plugins = "mytestplugin", @@ -570,7 +573,7 @@ class Distribution: def distributions(): return (Distribution(),) - monkeypatch.setattr(importlib_metadata, "distributions", distributions) + monkeypatch.setattr(metadata, "distributions", distributions) with pytest.raises(ImportError): testdir.parseconfig() @@ -594,7 +597,7 @@ class Distribution: def distributions(): return (Distribution(),) - monkeypatch.setattr(importlib_metadata, "distributions", distributions) + monkeypatch.setattr(metadata, "distributions", distributions) testdir.parseconfig() @@ -619,7 +622,7 @@ class Distribution: def distributions(): return (Distribution(),) - monkeypatch.setattr(importlib_metadata, "distributions", distributions) + monkeypatch.setattr(metadata, "distributions", distributions) args = ("-p", "no:mytestplugin") if block_it else () config = testdir.parseconfig(*args) config.pluginmanager.import_plugin("mytestplugin") @@ -655,7 +658,7 @@ def distributions(): return (Distribution(),) monkeypatch.setenv("PYTEST_DISABLE_PLUGIN_AUTOLOAD", "1") - monkeypatch.setattr(importlib_metadata, "distributions", distributions) + monkeypatch.setattr(metadata, "distributions", distributions) monkeypatch.setitem(sys.modules, "mytestplugin", PseudoPlugin()) config = testdir.parseconfig(*parse_args) has_loaded = config.pluginmanager.get_plugin("mytestplugin") is not None diff --git a/testing/test_entry_points.py b/testing/test_entry_points.py index 9812ce998d9..fea0bd36807 100644 --- a/testing/test_entry_points.py +++ b/testing/test_entry_points.py @@ -1,7 +1,12 @@ -import importlib_metadata +import sys + +if sys.version_info >= (3, 8): + from importlib import metadata +else: + import importlib_metadata as metadata def test_pytest_entry_points_are_identical(): - dist = importlib_metadata.distribution("pytest") + dist = metadata.distribution("pytest") entry_map = {ep.name: ep for ep in dist.entry_points} assert entry_map["pytest"].value == entry_map["py.test"].value