4 new commits in tox: https://bitbucket.org/hpk42/tox/commits/aca6e943ba18/ Changeset: aca6e943ba18 Branch: fix-force-dep-with-reqs-file User: djeebus Date: 2014-11-03 22:50:29+00:00 Summary: Fix issues with external requirements files and force dep Using --force-dep while your [testenv] included a dep similar to "-r{toxinidir}/reqs.txt" would cause an unhandled exception similar to: ValueError: ('Expected version spec in', '-rrequirements-test.txt', 'at', 'requirements-test.txt') Affected #: 2 files
diff -r 9d8f0d5319e77951c0542ece53c960dc3b2886e7 -r aca6e943ba184799252b50b31aa08928fb092c0b tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1384,6 +1384,59 @@ r'*deps=*dep1, dep2==5.0*', ]) + def test_force_dep_with_requirements_txt_file(self, cmd, initproj): + """ + Make sure we can override dependencies configured in external reqs.txt + when using the command line option --force-dep. + """ + initproj("example123-0.5", filedefs={ + 'tox.ini': ''' + [tox] + + [testenv] + deps= + dep1==1.0 + -r{toxinidir}/reqs.txt + ''', + 'reqs.txt': ''' + -e git://hello/world/git + dep2>=2.0 + -i http://index.local/ + dep3 + dep4==4.0 + -r reqs2.txt + ''', + 'reqs2.txt': ''' + dep5>=2.2 + ''' + }) + config = parseconfig( + ['--force-dep=dep1==1.5', '--force-dep=dep2==2.1', + '--force-dep=dep3==3.0']) + assert config.option.force_dep == [ + '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'] + class TestArgumentParser: def test_dash_e_single_1(self): diff -r 9d8f0d5319e77951c0542ece53c960dc3b2886e7 -r aca6e943ba184799252b50b31aa08928fb092c0b tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -1,4 +1,5 @@ import argparse +import tempfile import os import random import sys @@ -363,6 +364,7 @@ vc.whitelist_externals = reader.getlist(section, "whitelist_externals") vc.deps = [] + reqs_files = [] for depline in reader.getlist(section, "deps"): m = re.match(r":(\w+):\s*(\S+)", depline) if m: @@ -371,8 +373,41 @@ else: name = depline.strip() ixserver = None - name = self._replace_forced_dep(name, config) - vc.deps.append(DepConfig(name, ixserver)) + + 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)) + 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 + + 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) + vc.distribute = reader.getbool(section, "distribute", False) vc.sitepackages = self.config.option.sitepackages or \ reader.getbool(section, "sitepackages", False) https://bitbucket.org/hpk42/tox/commits/80bb02e004fc/ Changeset: 80bb02e004fc Branch: fix-force-dep-with-reqs-file User: djeebus Date: 2014-11-04 00:51:30+00:00 Summary: Ignore comments Affected #: 2 files diff -r aca6e943ba184799252b50b31aa08928fb092c0b -r 80bb02e004fc52c57997977b5ae1f2255707f497 tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1400,7 +1400,10 @@ ''', 'reqs.txt': ''' -e git://hello/world/git - dep2>=2.0 + # comment + dep2>=2.0 # comment + + -i http://index.local/ dep3 dep4==4.0 diff -r aca6e943ba184799252b50b31aa08928fb092c0b -r 80bb02e004fc52c57997977b5ae1f2255707f497 tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -400,6 +400,8 @@ else: lines.append(req) continue + elif req.startswith('#'): + continue name = self._replace_forced_dep(req, config) lines.append(name) https://bitbucket.org/hpk42/tox/commits/4f704801ff0a/ Changeset: 4f704801ff0a Branch: fix-force-dep-with-reqs-file-with-pip User: sontek Date: 2015-03-06 00:42:07+00:00 Summary: Support force dependencies with requirements.txt using pip Affected #: 2 files diff -r 80bb02e004fc52c57997977b5ae1f2255707f497 -r 4f704801ff0a8b08ee7addce1cc0ca42c61877cb tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1399,7 +1399,7 @@ -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 @@ '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 -r 80bb02e004fc52c57997977b5ae1f2255707f497 -r 4f704801ff0a8b08ee7addce1cc0ca42c61877cb tox/_config.py --- 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 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 @@ 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 @@ 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 + pip_session = PipSession() - 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 + for requirement_file in requirement_files: + req_deps = parse_requirements( + requirement_file, + session=pip_session + ) - 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) + 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 \ https://bitbucket.org/hpk42/tox/commits/1c6afe4646fc/ Changeset: 1c6afe4646fc User: hpk42 Date: 2015-03-09 07:10:45+00:00 Summary: Merged in sontek/tox/fix-force-dep-with-reqs-file-with-pip (pull request #136) Support force dependencies with requirements.txt using pip Affected #: 2 files diff -r 69f9be62ef38ef3dca9a932d79f2df85c834258a -r 1c6afe4646fcd4ccc8a6e4c20cc8bc19d6a4549b tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1423,6 +1423,50 @@ r'*deps=*dep1, dep2==5.0*', ]) + def test_force_dep_with_requirements_txt_file(self, cmd, initproj): + """ + Make sure we can override dependencies configured in external reqs.txt + when using the command line option --force-dep. + """ + initproj("example123-0.5", filedefs={ + 'tox.ini': ''' + [tox] + + [testenv] + deps= + dep1==1.0 + -r{toxinidir}/reqs.txt + ''', + 'reqs.txt': ''' + -e git://hello/world/git#egg=Hello + # comment + dep2>=2.0 # comment + + + -i http://index.local/ + dep3 + dep4==4.0 + -r reqs2.txt + ''', + 'reqs2.txt': ''' + dep5>=2.2 + ''' + }) + config = parseconfig( + ['--force-dep=dep1==1.5', '--force-dep=dep2==2.1', + '--force-dep=dep3==3.0']) + assert config.option.force_dep == [ + 'dep1==1.5', 'dep2==2.1', 'dep3==3.0'] + + deps = config.envconfigs['python'].deps + 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: def test_dash_e_single_1(self): diff -r 69f9be62ef38ef3dca9a932d79f2df85c834258a -r 1c6afe4646fcd4ccc8a6e4c20cc8bc19d6a4549b tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -9,7 +9,8 @@ import itertools from tox.interpreters import Interpreters - +from pip.req.req_file import parse_requirements +from pip.download import PipSession import py import tox @@ -371,6 +372,8 @@ vc.whitelist_externals = reader.getlist(section, "whitelist_externals") vc.deps = [] + requirement_files = [] + for depline in reader.getlist(section, "deps"): m = re.match(r":(\w+):\s*(\S+)", depline) if m: @@ -379,8 +382,29 @@ else: name = depline.strip() ixserver = None - name = self._replace_forced_dep(name, config) - 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)) + + 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 \ reader.getbool(section, "sitepackages", False) Repository URL: https://bitbucket.org/hpk42/tox/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. _______________________________________________ pytest-commit mailing list pytest-commit@python.org https://mail.python.org/mailman/listinfo/pytest-commit