Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP1:Update
python-pytest
importlib-metadata.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File importlib-metadata.patch of Package python-pytest
From 13f02af97d676bdf7143aa1834c8898fbf753d87 Mon Sep 17 00:00:00 2001 From: Anthony Sottile <asottile@umich.edu> Date: Sat, 6 Apr 2019 17:32:47 -0700 Subject: [PATCH] Switch to importlib-metadata --- changelog/5063.feature.rst | 1 + setup.py | 5 +- src/_pytest/assertion/rewrite.py | 19 ----- src/_pytest/config/__init__.py | 21 ++---- src/_pytest/outcomes.py | 12 +-- testing/acceptance_test.py | 31 +++----- testing/test_assertion.py | 56 +++++--------- testing/test_config.py | 121 ++++++++++++------------------- testing/test_entry_points.py | 14 +--- 9 files changed, 95 insertions(+), 185 deletions(-) create mode 100644 changelog/5063.feature.rst Index: pytest-3.10.1/setup.py =================================================================== --- pytest-3.10.1.orig/setup.py +++ pytest-3.10.1/setup.py @@ -8,20 +8,21 @@ from setuptools import setup INSTALL_REQUIRES = [ "py>=1.5.0", "six>=1.10.0", - "setuptools", + "packaging", "attrs>=17.4.0", "more-itertools>=4.0.0", "atomicwrites>=1.0", 'funcsigs;python_version<"3.0"', 'pathlib2>=2.2.0;python_version<"3.6"', 'colorama;sys_platform=="win32"', + 'importlib-metadata>=0.12', ] # if _PYTEST_SETUP_SKIP_PLUGGY_DEP is set, skip installing pluggy; # used by tox.ini to test with pluggy master if "_PYTEST_SETUP_SKIP_PLUGGY_DEP" not in os.environ: - INSTALL_REQUIRES.append("pluggy>=0.7") + INSTALL_REQUIRES.append("pluggy>=0.12") def main(): Index: pytest-3.10.1/src/_pytest/assertion/rewrite.py =================================================================== --- pytest-3.10.1.orig/src/_pytest/assertion/rewrite.py +++ pytest-3.10.1/src/_pytest/assertion/rewrite.py @@ -60,7 +60,6 @@ class AssertionRewritingHook(object): self.session = None self.modules = {} self._rewritten_names = set() - self._register_with_pkg_resources() self._must_rewrite = set() # flag to guard against trying to rewrite a pyc file while we are already writing another pyc file, # which might result in infinite recursion (#3506) @@ -308,24 +307,6 @@ class AssertionRewritingHook(object): tp = desc[2] return tp == imp.PKG_DIRECTORY - @classmethod - def _register_with_pkg_resources(cls): - """ - Ensure package resources can be loaded from this loader. May be called - multiple times, as the operation is idempotent. - """ - try: - import pkg_resources - - # access an attribute in case a deferred importer is present - pkg_resources.__name__ - except ImportError: - return - - # Since pytest tests are always located in the file system, the - # DefaultProvider is appropriate. - pkg_resources.register_loader_type(cls, pkg_resources.DefaultProvider) - def get_data(self, pathname): """Optional PEP302 get_data API. """ Index: pytest-3.10.1/src/_pytest/config/__init__.py =================================================================== --- pytest-3.10.1.orig/src/_pytest/config/__init__.py +++ pytest-3.10.1/src/_pytest/config/__init__.py @@ -11,10 +11,11 @@ import shlex import sys import types import warnings -from distutils.version import LooseVersion +import importlib_metadata import py import six +from packaging.version import Version from pluggy import HookimplMarker from pluggy import HookspecMarker from pluggy import PluginManager @@ -760,25 +761,17 @@ class Config(object): modules or packages in the distribution package for all pytest plugins. """ - import pkg_resources - self.pluginmanager.rewrite_hook = hook if os.environ.get("PYTEST_DISABLE_PLUGIN_AUTOLOAD"): # We don't autoload from setuptools entry points, no need to continue. return - # 'RECORD' available for plugins installed normally (pip install) - # 'SOURCES.txt' available for plugins installed in dev mode (pip install -e) - # for installed plugins 'SOURCES.txt' returns an empty list, and vice-versa - # so it shouldn't be an issue - metadata_files = "RECORD", "SOURCES.txt" - package_files = ( - entry.split(",")[0] - for entrypoint in pkg_resources.iter_entry_points("pytest11") - for metadata in metadata_files - for entry in entrypoint.dist._get_metadata(metadata) + str(file) + for dist in importlib_metadata.distributions() + if any(ep.group == "pytest11" for ep in dist.entry_points) + for file in dist.files ) for name in _iter_rewritable_modules(package_files): @@ -822,7 +815,7 @@ class Config(object): minver = self.inicfg.get("minversion", None) if minver: - if LooseVersion(minver) > LooseVersion(pytest.__version__): + if Version(minver) > Version(pytest.__version__): raise pytest.UsageError( "%s:%d: requires pytest-%s, actual pytest-%s'" % ( Index: pytest-3.10.1/src/_pytest/outcomes.py =================================================================== --- pytest-3.10.1.orig/src/_pytest/outcomes.py +++ pytest-3.10.1/src/_pytest/outcomes.py @@ -8,6 +8,8 @@ from __future__ import print_function import sys +from packaging.version import Version + class OutcomeException(BaseException): """ OutcomeException and its subclass instances indicate and @@ -165,15 +167,7 @@ def importorskip(modname, minversion=Non return mod verattr = getattr(mod, "__version__", None) if minversion is not None: - try: - from pkg_resources import parse_version as pv - except ImportError: - raise Skipped( - "we have a required version for %r but can not import " - "pkg_resources to parse version strings." % (modname,), - allow_module_level=True, - ) - if verattr is None or pv(verattr) < pv(minversion): + if verattr is None or Version(verattr) < Version(minversion): raise Skipped( "module %r has __version__ %r, required is: %r" % (modname, verattr, minversion), Index: pytest-3.10.1/testing/test_assertion.py =================================================================== --- pytest-3.10.1.orig/testing/test_assertion.py +++ pytest-3.10.1/testing/test_assertion.py @@ -136,12 +136,12 @@ class TestImportHookInstallation(object) def test_pytest_plugins_rewrite_module_names_correctly(self, testdir): """Test that we match files correctly when they are marked for rewriting (#2939).""" contents = { - "conftest.py": """ + "conftest.py": """\ pytest_plugins = "ham" """, "ham.py": "", "hamster.py": "", - "test_foo.py": """ + "test_foo.py": """\ def test_foo(pytestconfig): assert pytestconfig.pluginmanager.rewrite_hook.find_module('ham') is not None assert pytestconfig.pluginmanager.rewrite_hook.find_module('hamster') is None @@ -152,13 +152,13 @@ class TestImportHookInstallation(object) assert result.ret == 0 @pytest.mark.parametrize("mode", ["plain", "rewrite"]) - @pytest.mark.parametrize("plugin_state", ["development", "installed"]) - def test_installed_plugin_rewrite(self, testdir, mode, plugin_state): + def test_installed_plugin_rewrite(self, testdir, mode, monkeypatch): + monkeypatch.delenv("PYTEST_DISABLE_PLUGIN_AUTOLOAD", raising=False) # Make sure the hook is installed early enough so that plugins # installed via setuptools are rewritten. testdir.tmpdir.join("hampkg").ensure(dir=1) contents = { - "hampkg/__init__.py": """ + "hampkg/__init__.py": """\ import pytest @pytest.fixture @@ -167,7 +167,7 @@ class TestImportHookInstallation(object) assert values.pop(0) == value return check """, - "spamplugin.py": """ + "spamplugin.py": """\ import pytest from hampkg import check_first2 @@ -177,46 +177,31 @@ class TestImportHookInstallation(object) assert values.pop(0) == value return check """, - "mainwrapper.py": """ - import pytest, pkg_resources - - plugin_state = "{plugin_state}" - - class DummyDistInfo(object): - project_name = 'spam' - version = '1.0' - - def _get_metadata(self, name): - # 'RECORD' meta-data only available in installed plugins - if name == 'RECORD' and plugin_state == "installed": - return ['spamplugin.py,sha256=abc,123', - 'hampkg/__init__.py,sha256=abc,123'] - # 'SOURCES.txt' meta-data only available for plugins in development mode - elif name == 'SOURCES.txt' and plugin_state == "development": - return ['spamplugin.py', - 'hampkg/__init__.py'] - return [] + "mainwrapper.py": """\ + import pytest, importlib_metadata class DummyEntryPoint(object): name = 'spam' module_name = 'spam.py' - attrs = () - extras = None - dist = DummyDistInfo() + group = 'pytest11' - def load(self, require=True, *args, **kwargs): + def load(self): import spamplugin return spamplugin - def iter_entry_points(group, name=None): - yield DummyEntryPoint() + class DummyDistInfo(object): + version = '1.0' + files = ('spamplugin.py', 'hampkg/__init__.py') + entry_points = (DummyEntryPoint(),) + metadata = {'name': 'foo'} - pkg_resources.iter_entry_points = iter_entry_points + def distributions(): + return (DummyDistInfo(),) + + importlib_metadata.distributions = distributions pytest.main() - """.format( - plugin_state=plugin_state - ), - "test_foo.py": """ + """, + "test_foo.py": """\ def test(check_first): check_first([10, 30], 30) Index: pytest-3.10.1/testing/test_config.py =================================================================== --- pytest-3.10.1.orig/testing/test_config.py +++ pytest-3.10.1/testing/test_config.py @@ -5,6 +5,8 @@ from __future__ import print_function import sys import textwrap +import importlib_metadata + import _pytest._code import pytest from _pytest.config import _iter_rewritable_modules @@ -509,31 +511,25 @@ def test_options_on_small_file_do_not_bl def test_preparse_ordering_with_setuptools(testdir, monkeypatch): - pkg_resources = pytest.importorskip("pkg_resources") - - def my_iter(group, name=None): - assert group == "pytest11" - class Dist(object): - project_name = "spam" - version = "1.0" + class EntryPoint(object): + name = "mytestplugin" + group = "pytest11" - def _get_metadata(self, name): - return ["foo.txt,sha256=abc,123"] + def load(self): + class PseudoPlugin(object): + x = 42 - class EntryPoint(object): - name = "mytestplugin" - dist = Dist() + return PseudoPlugin() - def load(self): - class PseudoPlugin(object): - x = 42 + class Dist(object): + files = () + entry_points = (EntryPoint(),) - return PseudoPlugin() + def my_dists(): + return (Dist,) - return iter([EntryPoint()]) - - monkeypatch.setattr(pkg_resources, "iter_entry_points", my_iter) + monkeypatch.setattr(importlib_metadata, "distributions", my_dists) testdir.makeconftest( """ pytest_plugins = "mytestplugin", @@ -546,58 +542,45 @@ def test_preparse_ordering_with_setuptoo def test_setuptools_importerror_issue1479(testdir, monkeypatch): - pkg_resources = pytest.importorskip("pkg_resources") - - def my_iter(group, name=None): - assert group == "pytest11" - - class Dist(object): - project_name = "spam" - version = "1.0" - - def _get_metadata(self, name): - return ["foo.txt,sha256=abc,123"] - - class EntryPoint(object): - name = "mytestplugin" - dist = Dist() - - def load(self): - raise ImportError("Don't hide me!") + class DummyEntryPoint(object): + name = "mytestplugin" + group = "pytest11" + def load(self): + raise ImportError("Don't hide me!") + + class Distribution(object): + version = "1.0" + files = ("foo.txt",) + entry_points = (DummyEntryPoint(),) - return iter([EntryPoint()]) + def distributions(): + return (Distribution(),) - monkeypatch.setattr(pkg_resources, "iter_entry_points", my_iter) + monkeypatch.setattr(importlib_metadata, "distributions", distributions) with pytest.raises(ImportError): testdir.parseconfig() @pytest.mark.parametrize("block_it", [True, False]) def test_plugin_preparse_prevents_setuptools_loading(testdir, monkeypatch, block_it): - pkg_resources = pytest.importorskip("pkg_resources") - plugin_module_placeholder = object() - def my_iter(group, name=None): - assert group == "pytest11" - - class Dist(object): - project_name = "spam" - version = "1.0" - - def _get_metadata(self, name): - return ["foo.txt,sha256=abc,123"] - - class EntryPoint(object): - name = "mytestplugin" - dist = Dist() + class DummyEntryPoint(object): + name = "mytestplugin" + group = "pytest11" + + def load(self): + return plugin_module_placeholder + + class Distribution(object): + version = "1.0" + files = ("foo.txt",) + entry_points = (DummyEntryPoint(),) - def load(self): - return plugin_module_placeholder + def distributions(): + return (Distribution(),) - return iter([EntryPoint()]) - - monkeypatch.setattr(pkg_resources, "iter_entry_points", my_iter) + monkeypatch.setattr(importlib_metadata, "distributions", distributions) args = ("-p", "no:mytestplugin") if block_it else () config = testdir.parseconfig(*args) config.pluginmanager.import_plugin("mytestplugin") @@ -614,16 +597,21 @@ def test_plugin_preparse_prevents_setupt "parse_args,should_load", [(("-p", "mytestplugin"), True), ((), False)] ) def test_disable_plugin_autoload(testdir, monkeypatch, parse_args, should_load): - pkg_resources = pytest.importorskip("pkg_resources") - - def my_iter(group, name=None): - raise AssertionError("Should not be called") - + class DummyEntryPoint(object): + project_name = name = "mytestplugin" + group = "pytest11" + + class Distribution(object): + entry_points = (DummyEntryPoint(),) + files = () class PseudoPlugin(object): x = 42 + def distributions(): + return (Distribution(),) + monkeypatch.setenv("PYTEST_DISABLE_PLUGIN_AUTOLOAD", "1") - monkeypatch.setattr(pkg_resources, "iter_entry_points", my_iter) + monkeypatch.setattr(importlib_metadata, "distributions", distributions) monkeypatch.setitem(sys.modules, "mytestplugin", PseudoPlugin()) config = testdir.parseconfig(*parse_args) has_loaded = config.pluginmanager.get_plugin("mytestplugin") is not None Index: pytest-3.10.1/testing/test_entry_points.py =================================================================== --- pytest-3.10.1.orig/testing/test_entry_points.py +++ pytest-3.10.1/testing/test_entry_points.py @@ -2,16 +2,10 @@ from __future__ import absolute_import from __future__ import division from __future__ import print_function -import pkg_resources - -import pytest - - -@pytest.mark.parametrize("entrypoint", ["py.test", "pytest"]) -def test_entry_point_exist(entrypoint): - assert entrypoint in pkg_resources.get_entry_map("pytest")["console_scripts"] +import importlib_metadata def test_pytest_entry_points_are_identical(): - entryMap = pkg_resources.get_entry_map("pytest")["console_scripts"] - assert entryMap["pytest"].module_name == entryMap["py.test"].module_name + dist = importlib_metadata.distribution("pytest") + entry_map = {ep.name: ep for ep in dist.entry_points} + assert entry_map["pytest"].value == entry_map["py.test"].value
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor