summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Anderson <sontek@gmail.com>2015-03-05 16:42:07 -0800
committerJohn Anderson <sontek@gmail.com>2015-03-05 16:42:07 -0800
commit0765d8d77af6e5bbe16e79d4aff947c8dcd46e91 (patch)
tree43a0db5dc0d3b97f5c36aa7e5135bd5219955770
parent073c249d39064c5e338ea9049908025e54e6f778 (diff)
downloadtox-0765d8d77af6e5bbe16e79d4aff947c8dcd46e91.tar.gz
Support force dependencies with requirements.txt using pip
-rw-r--r--tests/test_config.py28
-rw-r--r--tox/_config.py55
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 \