Merge pull request #1935 from nicoddemus/assert-rewrite-dev-plugins
Fixed assertion rewriting for plugins in development mode
This commit is contained in:
commit
40ec35767f
|
@ -7,7 +7,9 @@
|
||||||
|
|
||||||
*
|
*
|
||||||
|
|
||||||
*
|
* Assertions are now being rewritten for plugins in development mode
|
||||||
|
(``pip install -e``) (`#1934`_).
|
||||||
|
Thanks `@nicoddemus`_ for the PR.
|
||||||
|
|
||||||
*
|
*
|
||||||
|
|
||||||
|
@ -17,6 +19,7 @@
|
||||||
.. _@philpep: https://github.com/philpep
|
.. _@philpep: https://github.com/philpep
|
||||||
|
|
||||||
.. _#1905: https://github.com/pytest-dev/pytest/issues/1905
|
.. _#1905: https://github.com/pytest-dev/pytest/issues/1905
|
||||||
|
.. _#1934: https://github.com/pytest-dev/pytest/issues/1934
|
||||||
|
|
||||||
|
|
||||||
3.0.2
|
3.0.2
|
||||||
|
|
|
@ -954,16 +954,21 @@ class Config(object):
|
||||||
else:
|
else:
|
||||||
self.pluginmanager.rewrite_hook = hook
|
self.pluginmanager.rewrite_hook = hook
|
||||||
for entrypoint in pkg_resources.iter_entry_points('pytest11'):
|
for entrypoint in pkg_resources.iter_entry_points('pytest11'):
|
||||||
for entry in entrypoint.dist._get_metadata('RECORD'):
|
# 'RECORD' available for plugins installed normally (pip install)
|
||||||
fn = entry.split(',')[0]
|
# 'SOURCES.txt' available for plugins installed in dev mode (pip install -e)
|
||||||
is_simple_module = os.sep not in fn and fn.endswith('.py')
|
# for installed plugins 'SOURCES.txt' returns an empty list, and vice-versa
|
||||||
is_package = fn.count(os.sep) == 1 and fn.endswith('__init__.py')
|
# so it shouldn't be an issue
|
||||||
if is_simple_module:
|
for metadata in ('RECORD', 'SOURCES.txt'):
|
||||||
module_name, ext = os.path.splitext(fn)
|
for entry in entrypoint.dist._get_metadata(metadata):
|
||||||
hook.mark_rewrite(module_name)
|
fn = entry.split(',')[0]
|
||||||
elif is_package:
|
is_simple_module = os.sep not in fn and fn.endswith('.py')
|
||||||
package_name = os.path.dirname(fn)
|
is_package = fn.count(os.sep) == 1 and fn.endswith('__init__.py')
|
||||||
hook.mark_rewrite(package_name)
|
if is_simple_module:
|
||||||
|
module_name, ext = os.path.splitext(fn)
|
||||||
|
hook.mark_rewrite(module_name)
|
||||||
|
elif is_package:
|
||||||
|
package_name = os.path.dirname(fn)
|
||||||
|
hook.mark_rewrite(package_name)
|
||||||
self._warn_about_missing_assertion(mode)
|
self._warn_about_missing_assertion(mode)
|
||||||
|
|
||||||
def _warn_about_missing_assertion(self, mode):
|
def _warn_about_missing_assertion(self, mode):
|
||||||
|
|
|
@ -108,7 +108,8 @@ class TestImportHookInstallation:
|
||||||
assert result.ret == 0
|
assert result.ret == 0
|
||||||
|
|
||||||
@pytest.mark.parametrize('mode', ['plain', 'rewrite'])
|
@pytest.mark.parametrize('mode', ['plain', 'rewrite'])
|
||||||
def test_installed_plugin_rewrite(self, testdir, mode):
|
@pytest.mark.parametrize('plugin_state', ['development', 'installed'])
|
||||||
|
def test_installed_plugin_rewrite(self, testdir, mode, plugin_state):
|
||||||
# Make sure the hook is installed early enough so that plugins
|
# Make sure the hook is installed early enough so that plugins
|
||||||
# installed via setuptools are re-written.
|
# installed via setuptools are re-written.
|
||||||
testdir.tmpdir.join('hampkg').ensure(dir=1)
|
testdir.tmpdir.join('hampkg').ensure(dir=1)
|
||||||
|
@ -135,13 +136,22 @@ class TestImportHookInstallation:
|
||||||
'mainwrapper.py': """
|
'mainwrapper.py': """
|
||||||
import pytest, pkg_resources
|
import pytest, pkg_resources
|
||||||
|
|
||||||
|
plugin_state = "{plugin_state}"
|
||||||
|
|
||||||
class DummyDistInfo:
|
class DummyDistInfo:
|
||||||
project_name = 'spam'
|
project_name = 'spam'
|
||||||
version = '1.0'
|
version = '1.0'
|
||||||
|
|
||||||
def _get_metadata(self, name):
|
def _get_metadata(self, name):
|
||||||
return ['spamplugin.py,sha256=abc,123',
|
# 'RECORD' meta-data only available in installed plugins
|
||||||
'hampkg/__init__.py,sha256=abc,123']
|
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 []
|
||||||
|
|
||||||
class DummyEntryPoint:
|
class DummyEntryPoint:
|
||||||
name = 'spam'
|
name = 'spam'
|
||||||
|
@ -159,7 +169,7 @@ class TestImportHookInstallation:
|
||||||
|
|
||||||
pkg_resources.iter_entry_points = iter_entry_points
|
pkg_resources.iter_entry_points = iter_entry_points
|
||||||
pytest.main()
|
pytest.main()
|
||||||
""",
|
""".format(plugin_state=plugin_state),
|
||||||
'test_foo.py': """
|
'test_foo.py': """
|
||||||
def test(check_first):
|
def test(check_first):
|
||||||
check_first([10, 30], 30)
|
check_first([10, 30], 30)
|
||||||
|
|
Loading…
Reference in New Issue