summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Pierre <benoit.pierre@gmail.com>2017-08-30 02:44:02 +0200
committerBenoit Pierre <benoit.pierre@gmail.com>2017-08-30 03:06:24 +0200
commitc63158a93f072e7d2ea3de70b24e583133111541 (patch)
treed7130098c9680b051c7c6b4dd965bf259c33fe20
parent228cbcb5672579f21601707ba0b23169fb4f423f (diff)
downloadpytest-runner-c63158a93f072e7d2ea3de70b24e583133111541.tar.gz
fix support for --extras
Correctly install extras with no markers.
-rw-r--r--ptr.py6
-rw-r--r--tests/requirements.txt2
-rw-r--r--tests/test_ptr.py157
3 files changed, 162 insertions, 3 deletions
diff --git a/ptr.py b/ptr.py
index 8a2da90..06612b2 100644
--- a/ptr.py
+++ b/ptr.py
@@ -104,10 +104,10 @@ class PyTest(orig.test):
matching_extras = (
reqs
for (name, sep, marker), reqs in spec_extras
- # never include extras that fail to pass marker eval
- if self.marker_passes(marker)
# include unnamed extras or all if self.extras indicated
- and (not name or self.extras)
+ if (not name or self.extras)
+ # never include extras that fail to pass marker eval
+ and (not marker or self.marker_passes(marker))
)
results = list(map(dist.fetch_build_eggs, matching_extras))
return _itertools.chain.from_iterable(results)
diff --git a/tests/requirements.txt b/tests/requirements.txt
index ab48405..fd5c965 100644
--- a/tests/requirements.txt
+++ b/tests/requirements.txt
@@ -1,2 +1,4 @@
pytest >= 2.8
+pytest-virtualenv
+importlib; python_version=="2.6"
subprocess32; python_version=="2.6"
diff --git a/tests/test_ptr.py b/tests/test_ptr.py
new file mode 100644
index 0000000..aeb0f8d
--- /dev/null
+++ b/tests/test_ptr.py
@@ -0,0 +1,157 @@
+from __future__ import unicode_literals
+
+import contextlib
+import io
+import os
+import sys
+import tarfile
+import textwrap
+import time
+
+import pytest
+
+
+def DALS(s):
+ "dedent and left-strip"
+ return textwrap.dedent(s).lstrip()
+
+
+def _tarfile_open_ex(*args, **kwargs):
+ """
+ Extend result as a context manager.
+ """
+ return contextlib.closing(tarfile.open(*args, **kwargs))
+
+
+if sys.version_info[:2] < (2, 7) or (3, 0) <= sys.version_info[:2] < (3, 2):
+ tarfile_open = _tarfile_open_ex
+else:
+ tarfile_open = tarfile.open
+
+
+def make_sdist(dist_path, files):
+ """
+ Create a simple sdist tarball at dist_path, containing the files
+ listed in ``files`` as ``(filename, content)`` tuples.
+ """
+
+ with tarfile_open(dist_path, 'w:gz') as dist:
+ for filename, content in files:
+ file_bytes = io.BytesIO(content.encode('utf-8'))
+ file_info = tarfile.TarInfo(name=filename)
+ file_info.size = len(file_bytes.getvalue())
+ file_info.mtime = int(time.time())
+ dist.addfile(file_info, fileobj=file_bytes)
+
+
+@pytest.fixture
+def venv(virtualenv):
+ yield virtualenv
+ # Workaround virtualenv not cleaning itself as it should...
+ virtualenv.delete = True
+ virtualenv.teardown()
+
+
+@pytest.mark.parametrize('setuptools_req, test_args', (
+ ('setuptools==27.2.0', ''),
+ ('setuptools==27.2.0', '--extras'),
+ ('setuptools==27.3.0', ''),
+ ('setuptools==27.3.0', '--extras'),
+ ('setuptools==32.3.1', ''),
+ ('setuptools==32.3.1', '--extras'),
+ ('setuptools==36.3.0', ''),
+ ('setuptools==36.3.0', '--extras'),
+ ('setuptools' , ''),
+ ('setuptools' , '--extras'),
+))
+def test_egg_fetcher(venv, setuptools_req, test_args):
+ test_args = test_args.split()
+ # Install pytest & pytest-runner.
+ venv.run('python setup.py develop', cwd=os.getcwd())
+ venv.run('pip install pytest')
+ # Install setuptools version.
+ venv.run('pip install -U'.split() + [setuptools_req])
+ # For debugging purposes.
+ venv.run('pip freeze --all')
+ # Prepare fake index.
+ index_dir = (venv.workspace / 'index').mkdir()
+ for n in range(5):
+ dist_name = 'barbazquux' + str(n + 1)
+ dist_version = '0.1'
+ dist_sdist = '%s-%s.tar.gz' % (dist_name, dist_version)
+ dist_dir = (index_dir / dist_name).mkdir()
+ make_sdist(dist_dir / dist_sdist, (
+ ('setup.py', textwrap.dedent(
+ '''
+ from setuptools import setup
+ setup(
+ name={dist_name!r},
+ version={dist_version!r},
+ py_modules=[{dist_name!r}],
+ )
+ '''
+ ).format(dist_name=dist_name, dist_version=dist_version)),
+ (dist_name + '.py', ''),
+ ))
+ with (dist_dir / 'index.html').open('w') as fp:
+ fp.write(DALS(
+ '''
+ <!DOCTYPE html><html><body>
+ <a href="{dist_sdist}" rel="internal">{dist_sdist}</a><br/>
+ </body></html>
+ '''
+ ).format(dist_sdist=dist_sdist))
+ # Prepare fake project.
+ project_dir = (venv.workspace / 'project-0.1').mkdir()
+ with open(project_dir / 'setup.py', 'w') as fp:
+ fp.write(DALS(
+ '''
+ from setuptools import setup
+ setup(
+ name='project',
+ version='0.1',
+ setup_requires=[
+ 'pytest-runner',
+ ],
+ install_requires=[
+ 'barbazquux1',
+ ],
+ tests_require=[
+ 'pytest',
+ 'barbazquux2',
+ ],
+ extras_require={{
+ ':"{sys_platform}" in sys_platform': 'barbazquux3',
+ ':"barbazquux" in sys_platform': 'barbazquux4',
+ 'extra': 'barbazquux5',
+ }}
+ )
+ ''').format(sys_platform=sys.platform))
+ with open(project_dir / 'setup.cfg', 'w') as fp:
+ fp.write(DALS(
+ '''
+ [easy_install]
+ index_url = .
+ '''))
+ with open(project_dir / 'test_stuff.py', 'w') as fp:
+ fp.write(DALS(
+ '''
+ import pytest
+
+ def test_stuff():
+ import barbazquux1
+ import barbazquux2
+ import barbazquux3
+ with pytest.raises(ImportError):
+ import barbazquux4
+ if {importable_barbazquux5}:
+ import barbazquux5
+ else:
+ with pytest.raises(ImportError):
+ import barbazquux5
+ ''').format(importable_barbazquux5=('--extras' in test_args)))
+ # Run fake project tests.
+ cmd = 'python setup.py pytest'.split()
+ cmd += ['--index-url=' + index_dir.abspath()]
+ cmd += test_args
+ venv.run(cmd, cwd=project_dir)