def test_version(): assert VERSION out, err = venv_update('--version') assert strip_coverage_warnings(err) == '' assert out == VERSION + '\n' out, err = venv_update('-V') assert strip_coverage_warnings(err) == '' assert out == VERSION + '\n'
def test_help(): assert HELP_OUTPUT assert HELP_OUTPUT.startswith('usage:') last_line = HELP_OUTPUT.rsplit('\n', 2)[-2].strip() assert last_line.startswith('Version control at: http') out, err = venv_update('--help') assert strip_coverage_warnings(err) == '' assert out == HELP_OUTPUT out, err = venv_update('-h') assert strip_coverage_warnings(err) == '' assert out == HELP_OUTPUT
def test_help(): assert HELP_OUTPUT assert HELP_OUTPUT.startswith('usage:') last_line = HELP_OUTPUT.rsplit('\n', 2)[-2].strip() assert last_line.startswith('Please send issues to: https://') out, err = venv_update('--help') assert strip_coverage_warnings(err) == '' assert out == HELP_OUTPUT out, err = venv_update('-h') assert strip_coverage_warnings(err) == '' assert out == HELP_OUTPUT
def test_args_backward(tmpdir): tmpdir.chdir() enable_coverage() requirements('') with pytest.raises(CalledProcessError) as excinfo: venv_update('venv=', 'requirements.txt') # py26 doesn't have a consistent exit code: # http://bugs.python.org/issue15033 assert excinfo.value.returncode != 0 out, err = excinfo.value.result err = strip_coverage_warnings(err) err = strip_pip_warnings(err) assert err == '' out = uncolor(out) assert out.rsplit('\n', 4)[-4:] == [ '> virtualenv requirements.txt', 'ERROR: File already exists and is not a directory.', 'Please provide a different path or delete the file.', '', ] assert Path('requirements.txt').isfile() assert Path('requirements.txt').read() == '' assert not Path('myvenv').exists()
def test_multiple_issues(tmpdir): # Make it a bit worse. The output should show all three issues. tmpdir.chdir() T.requirements('flake8==2.2.5') T.venv_update() T.run('./virtualenv_run/bin/pip', 'uninstall', '--yes', 'pyflakes') T.requirements(''' # flake8 2.2.5 requires mccabe>=0.2.1 and pep8>=1.5.7, so this isn't satisfiable flake8==2.2.5 mccabe==0.2 pep8==1.0 ''') with pytest.raises(CalledProcessError) as excinfo: T.venv_update() assert excinfo.value.returncode == 1 out, err = excinfo.value.result err = T.strip_coverage_warnings(err) assert err == '' out = T.uncolor(out) assert ''' Cleaning up... Error: version conflict: mccabe 0.2 <-> mccabe>=0.2.1 (from flake8==2.2.5 (from -r requirements.txt (line 3))) Error: version conflict: pep8 1.0 <-> pep8>=1.5.7 (from flake8==2.2.5 (from -r requirements.txt (line 3))) Error: unmet dependency: pyflakes>=0.8.1 (from flake8==2.2.5 (from -r requirements.txt (line 3))) Something went wrong! Sending 'virtualenv_run' back in time, so make knows it's invalid. ''' in out
def test_conflicting_reqs(tmpdir): tmpdir.chdir() T.requirements(''' dependant_package conflicting_package ''') with pytest.raises(CalledProcessError) as excinfo: T.venv_update() assert excinfo.value.returncode == 1 out, err = excinfo.value.result err = T.strip_coverage_warnings(err) err = T.strip_pip_warnings(err) assert err == ( "conflicting-package 1 has requirement many-versions-package<2, but you'll " 'have many-versions-package 3 which is incompatible.\n' # TODO: do we still need to append our own error? 'Error: version conflict: many-versions-package 3 (venv/{}) ' '<-> many-versions-package<2 ' '(from conflicting_package->-r requirements.txt (line 3))\n'.format( PYTHON_LIB, )) out = T.uncolor(out) assert_something_went_wrong(out) assert_venv_marked_invalid(tmpdir.join('venv'))
def test_conflicting_reqs(tmpdir): tmpdir.chdir() T.requirements(''' dependant_package conflicting_package ''') with pytest.raises(CalledProcessError) as excinfo: T.venv_update() assert excinfo.value.returncode == 1 out, err = excinfo.value.result err = T.strip_coverage_warnings(err) err = T.strip_pip_warnings(err) assert err == '' out = T.uncolor(out) assert ( ''' Cleaning up... Error: version conflict: many-versions-package 3 (venv/%s)''' ''' <-> many-versions-package<2 (from conflicting-package->-r requirements.txt (line 3)) Storing debug log for failure in %s/home/.pip/pip.log Something went wrong! Sending 'venv' back in time, so make knows it's invalid. ''' % (PYTHON_LIB, tmpdir)) in out assert_venv_marked_invalid(tmpdir.join('venv'))
def test_editable_egg_conflict(tmpdir): conflicting_package = tmpdir / 'tmp/conflicting_package' many_versions_package_2 = tmpdir / 'tmp/many_versions_package_2' from shutil import copytree copytree( str(T.TOP / 'tests/testing/packages/conflicting_package'), str(conflicting_package), ) copytree( str(T.TOP / 'tests/testing/packages/many_versions_package_2'), str(many_versions_package_2), ) with many_versions_package_2.as_cwd(): from sys import executable as python T.run(python, 'setup.py', 'bdist_egg', '--dist-dir', str(conflicting_package)) with tmpdir.as_cwd(): T.requirements('-r %s/requirements.d/coverage.txt' % T.TOP) T.venv_update() T.requirements('-e %s' % conflicting_package) with pytest.raises(CalledProcessError) as excinfo: T.venv_update() assert excinfo.value.returncode == 1 out, err = excinfo.value.result err = T.strip_coverage_warnings(err) assert err == '' out = T.uncolor(out) expected = '\nSuccessfully installed many-versions-package conflicting-package\n' assert expected in out rest = out.rsplit(expected, 1)[-1] if True: # :pragma:nocover:pylint:disable=using-constant-test # Debian de-vendorizes the version of pip it ships try: from sysconfig import get_python_version except ImportError: # <= python2.6 from distutils.sysconfig import get_python_version assert ( '''\ Cleaning up... Error: version conflict: many-versions-package 2 (tmp/conflicting_package/many_versions_package-2-py{0}.egg)''' ''' <-> many-versions-package<2 (from conflicting-package==1->-r requirements.txt (line 1)) Storing debug log for failure in {1}/home/.pip/pip.log Something went wrong! Sending 'venv' back in time, so make knows it's invalid. '''.format(get_python_version(), tmpdir)) == rest assert_venv_marked_invalid(tmpdir.join('venv'))
def test_bad_option(): import pytest from subprocess import CalledProcessError with pytest.raises(CalledProcessError) as excinfo: venv_update('venv') out, err = excinfo.value.result assert strip_coverage_warnings(err) == '''\ invalid option: venv Try --help for more information. ''' assert out == ''
def test_multiple_issues(tmpdir): # Make it a bit worse. The output should show all three issues. tmpdir.chdir() T.enable_coverage() T.requirements('dependant_package\n-r %s/requirements.d/coverage.txt' % T.TOP) T.venv_update() T.run('./venv/bin/pip', 'uninstall', '--yes', 'implicit_dependency') T.requirements(''' dependant_package conflicting_package pure_python_package==0.1.0 ''') with pytest.raises(CalledProcessError) as excinfo: T.venv_update() assert excinfo.value.returncode == 1 out, err = excinfo.value.result err = T.strip_coverage_warnings(err) err = T.strip_pip_warnings(err) err = err.splitlines() # pip outputs conflict lines in a non-consistent order assert set(err[:3]) == { 'dependant-package 1 requires implicit-dependency, which is not installed.', "dependant-package 1 has requirement pure-python-package>=0.2.1, but you'll have pure-python-package 0.1.0 which is incompatible.", # noqa "conflicting-package 1 has requirement many-versions-package<2, but you'll have many-versions-package 3 which is incompatible.", # noqa } # TODO: do we still need to append our own error? assert '\n'.join(err[3:]) == ( 'Error: version conflict: pure-python-package 0.1.0 ' '(venv/{lib}) <-> pure-python-package>=0.2.1 ' '(from dependant_package->-r requirements.txt (line 2))\n' 'Error: version conflict: many-versions-package 3 ' '(venv/{lib}) <-> many-versions-package<2 ' '(from conflicting_package->-r requirements.txt (line 3))'.format( lib=PYTHON_LIB, )) out = T.uncolor(out) assert_something_went_wrong(out) assert_venv_marked_invalid(tmpdir.join('venv'))
def test_args_backward(tmpdir): tmpdir.chdir() requirements('') from subprocess import CalledProcessError with pytest.raises(CalledProcessError) as excinfo: venv_update('requirements.txt', 'myvenv') # py26 doesn't have a consistent exit code: # http://bugs.python.org/issue15033 assert excinfo.value.returncode != 0 _, err = excinfo.value.result lasterr = strip_coverage_warnings(err).rsplit('\n', 2)[-2] errname = 'NotADirectoryError' if PY33 else 'OSError' assert lasterr.startswith(errname + ': [Errno 20] Not a directory'), err assert Path('requirements.txt').isfile() assert Path('requirements.txt').read() == '' assert not Path('myvenv').exists()
def test_editable_egg_conflict(tmpdir): conflicting_package = tmpdir / 'tmp/conflicting_package' many_versions_package_2 = tmpdir / 'tmp/many_versions_package_2' from shutil import copytree copytree( str(T.TOP / 'tests/testing/packages/conflicting_package'), str(conflicting_package), ) copytree( str(T.TOP / 'tests/testing/packages/many_versions_package_2'), str(many_versions_package_2), ) with many_versions_package_2.as_cwd(): from sys import executable as python T.run(python, 'setup.py', 'bdist_egg', '--dist-dir', str(conflicting_package)) with tmpdir.as_cwd(): T.enable_coverage() T.requirements('-e %s' % conflicting_package) with pytest.raises(CalledProcessError) as excinfo: T.venv_update() assert excinfo.value.returncode == 1 out, err = excinfo.value.result err = T.strip_coverage_warnings(err) err = T.strip_pip_warnings(err) assert err.strip() == ( 'Error: version conflict: many-versions-package 2 ' '(tmp/conflicting_package/many_versions_package-2-py{}.egg) ' '<-> many_versions_package<2 ' '(from conflicting-package==1->-r requirements.txt (line 1))'.format( get_python_version(), ) ) out = T.uncolor(out) assert_something_went_wrong(out) assert_venv_marked_invalid(tmpdir.join('venv'))
def test_multiple_issues(tmpdir): # Make it a bit worse. The output should show all three issues. tmpdir.chdir() T.enable_coverage() T.requirements('dependant_package\n-r %s/requirements.d/coverage.txt' % T.TOP) T.venv_update() T.run('./venv/bin/pip', 'uninstall', '--yes', 'implicit_dependency') T.requirements(''' dependant_package conflicting_package pure_python_package==0.1.0 ''') with pytest.raises(CalledProcessError) as excinfo: T.venv_update() assert excinfo.value.returncode == 1 out, err = excinfo.value.result err = T.strip_coverage_warnings(err) assert err == '' out = T.uncolor(out) assert ( ''' Cleaning up... Error: unmet dependency: implicit-dependency (from dependant-package->-r requirements.txt (line 2)) Error: version conflict: many-versions-package 1 (venv/%s)''' ''' <-> many-versions-package>=2,<4 (from dependant-package->-r requirements.txt (line 2)) Error: version conflict: pure-python-package 0.1.0 (venv/%s)''' ''' <-> pure-python-package>=0.2.0 (from dependant-package->-r requirements.txt (line 2)) Storing debug log for failure in %s/home/.pip/pip.log Something went wrong! Sending 'venv' back in time, so make knows it's invalid. ''' % (PYTHON_LIB, PYTHON_LIB, tmpdir)) in out assert_venv_marked_invalid(tmpdir.join('venv'))
def test_conflicting_reqs(tmpdir): tmpdir.chdir() T.requirements(''' # flake8 2.2.5 requires mccabe>=0.2.1, so this isn't satisfiable flake8==2.2.5 mccabe==0.2 ''') with pytest.raises(CalledProcessError) as excinfo: T.venv_update() assert excinfo.value.returncode == 1 out, err = excinfo.value.result err = T.strip_coverage_warnings(err) assert err == '' out = T.uncolor(out) assert ''' Cleaning up... Error: version conflict: mccabe 0.2 <-> mccabe>=0.2.1 (from flake8==2.2.5 (from -r requirements.txt (line 3))) Something went wrong! Sending 'virtualenv_run' back in time, so make knows it's invalid. ''' in out
def test_multiple_issues(tmpdir): # Make it a bit worse. The output should show all three issues. tmpdir.chdir() T.enable_coverage() T.requirements('dependant_package\n-r %s/requirements.d/coverage.txt' % T.TOP) T.venv_update() T.run('./venv/bin/pip', 'uninstall', '--yes', 'implicit_dependency') T.requirements(''' dependant_package conflicting_package pure_python_package==0.1.0 ''') with pytest.raises(CalledProcessError) as excinfo: T.venv_update() assert excinfo.value.returncode == 1 out, err = excinfo.value.result err = T.strip_coverage_warnings(err) err = T.strip_pip_warnings(err) assert err == ( 'Error: version conflict: pure-python-package 0.1.0 ' '(venv/{lib}) <-> pure-python-package>=0.2.1 ' '(from dependant_package->-r requirements.txt (line 2))\n' 'Error: version conflict: many-versions-package 3 ' '(venv/{lib}) <-> many-versions-package<2 ' '(from conflicting_package->-r requirements.txt (line 3))\n'.format( lib=PYTHON_LIB, )) out = T.uncolor(out) assert_something_went_wrong(out) assert_venv_marked_invalid(tmpdir.join('venv'))
def test_conflicting_reqs(tmpdir): tmpdir.chdir() T.requirements(''' dependant_package conflicting_package ''') with pytest.raises(CalledProcessError) as excinfo: T.venv_update() assert excinfo.value.returncode == 1 out, err = excinfo.value.result err = T.strip_coverage_warnings(err) err = T.strip_pip_warnings(err) assert err == ( 'Error: version conflict: many-versions-package 3 (venv/{0}) ' '<-> many-versions-package<2 ' '(from conflicting_package->-r requirements.txt (line 3))\n'.format( PYTHON_LIB, )) out = T.uncolor(out) assert_something_went_wrong(out) assert_venv_marked_invalid(tmpdir.join('venv'))