diff options
| -rw-r--r-- | tests/test_config.py | 28 | ||||
| -rw-r--r-- | tox/_config.py | 55 |
2 files changed, 29 insertions, 54 deletions
diff --git a/tests/test_config.py b/tests/test_config.py index bc2410f..31384c3 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1399,7 +1399,7 @@ class TestCmdInvocation: -r{toxinidir}/reqs.txt ''', 'reqs.txt': ''' - -e git://hello/world/git + -e git://hello/world/git#egg=Hello # comment dep2>=2.0 # comment @@ -1420,25 +1420,13 @@ class TestCmdInvocation: 'dep1==1.5', 'dep2==2.1', 'dep3==3.0'] deps = config.envconfigs['python'].deps - assert len(deps) == 2 - assert deps[0].name == 'dep1==1.5' - include_file = deps[1].name - assert include_file.startswith('-r') - with open(include_file[2:]) as reqs: - lines = [x.strip() for x in reqs.readlines()] - assert len(lines) == 6 - second_file = lines.pop(len(lines) - 1) - assert second_file.startswith('-r') - assert lines == [ - '-e git://hello/world/git', - 'dep2==2.1', - '-i http://index.local/', - 'dep3==3.0', - 'dep4==4.0', - ] - with open(second_file[2:]) as reqs2: - lines = [x.strip() for x in reqs2.readlines()] - assert lines == ['dep5>=2.2'] + assert len(deps) == 6 + expected = ['dep1==1.5', 'Hello', 'dep2==2.1', + 'dep3==3.0', 'dep4', 'dep5'] + + for index, dep in enumerate(deps): + assert dep.name == expected[index] + class TestArgumentParser: diff --git a/tox/_config.py b/tox/_config.py index 1d2b817..385bb17 100644 --- a/tox/_config.py +++ b/tox/_config.py @@ -1,5 +1,4 @@ import argparse -import tempfile import os import random import sys @@ -10,7 +9,8 @@ import pkg_resources import itertools from tox.interpreters import Interpreters - +from pip.req.req_file import parse_requirements +from pip.download import PipSession import py import tox @@ -364,7 +364,8 @@ class parseini: vc.whitelist_externals = reader.getlist(section, "whitelist_externals") vc.deps = [] - reqs_files = [] + requirement_files = [] + for depline in reader.getlist(section, "deps"): m = re.match(r":(\w+):\s*(\S+)", depline) if m: @@ -374,41 +375,27 @@ class parseini: name = depline.strip() ixserver = None - if name[:2] == '-r': # not a dependency, but a file full of dependencies - fd, temp_path = tempfile.mkstemp() - reqs_files.append((name[2:].strip(), fd, temp_path)) - vc.deps.append(DepConfig('-r%s' % temp_path)) - elif name[0] == '-': # an option to be sent to pip - vc.deps.append(DepConfig(name, ixserver)) + + # We want to parse requirements.txt files last so that + # we can process them with forced dependencies + if name[:2] == '-r': + fname = name[2:].strip() + requirement_files.append(fname) else: name = self._replace_forced_dep(name, config) vc.deps.append(DepConfig(name, ixserver)) - for reqs_file, fd, temp_path in reqs_files: - lines = [] - with open(reqs_file, 'r') as reqs: - for req in reqs.readlines(): - req = req.strip() - if not req: - continue - - if req.startswith('-'): - if req.startswith('-r'): - new_fd, new_temp_path = tempfile.mkstemp() - reqs_files.append((req[2:].strip(), new_fd, new_temp_path)) - lines.append('-r' + new_temp_path) - else: - lines.append(req) - continue - elif req.startswith('#'): - continue - - name = self._replace_forced_dep(req, config) - lines.append(name) - - with open(temp_path, mode='w') as temp_reqs: - temp_reqs.writelines(os.linesep.join(lines)) - os.close(fd) + pip_session = PipSession() + + for requirement_file in requirement_files: + req_deps = parse_requirements( + requirement_file, + session=pip_session + ) + + for r in req_deps: + name = self._replace_forced_dep(r.name, config) + vc.deps.append(DepConfig(name, ixserver)) vc.distribute = reader.getbool(section, "distribute", False) vc.sitepackages = self.config.option.sitepackages or \ |
