def test_updates_package_in_nested_requirements(self): tempdir = tempfile.mkdtemp() requirements = os.path.join(tempdir, 'requirements-with-nested-reqfile.txt') requirements_nested = os.path.join(tempdir, 'requirements-nested.txt') shutil.copy('tests/samples/requirements-with-nested-reqfile.txt', requirements) shutil.copy('tests/samples/requirements-nested.txt', requirements_nested) args = ['-r', requirements] with utils.mock.patch('pip.index.PackageFinder.find_all_candidates' ) as mock_find_all_candidates: project = 'readtime' version = '0.10.1' link = Link('') candidate = InstallationCandidate(project, version, link) mock_find_all_candidates.return_value = [candidate] result = self.runner.invoke(pur, args) self.assertIsNone(result.exception) expected_output = "Updated readtime: 0.9 -> 0.10.1\nAll requirements up-to-date.\n" self.assertEquals(u(result.output), u(expected_output)) self.assertEquals(result.exit_code, 0) expected_requirements = open( 'tests/samples/results/test_updates_package_in_nested_requirements' ).read() self.assertEquals(open(requirements).read(), expected_requirements) expected_requirements = open( 'tests/samples/results/test_updates_package_in_nested_requirements_nested' ).read() self.assertEquals( open(requirements_nested).read(), expected_requirements)
def test_updates_from_alt_index_url(self): requirements = 'tests/samples/requirements-with-alt-index-url.txt' tempdir = tempfile.mkdtemp() tmpfile = os.path.join(tempdir, 'requirements.txt') shutil.copy(requirements, tmpfile) args = ['-r', tmpfile] class PackageFinderSpy(PackageFinder): _spy = None def __init__(self, *args, **kwargs): super(PackageFinderSpy, self).__init__(*args, **kwargs) PackageFinderSpy._spy = self with utils.mock.patch('pur.PackageFinder', wraps=PackageFinderSpy) as mock_finder: with utils.mock.patch('pip.index.PackageFinder.find_all_candidates' ) as mock_find_all_candidates: project = 'flask' version = '12.1' link = Link('') candidate = InstallationCandidate(project, version, link) mock_find_all_candidates.return_value = [candidate] self.runner.invoke(pur, args) self.assertTrue(mock_finder.called) self.assertEqual( PackageFinderSpy._spy.index_urls, ['http://pypi.example.com', 'https://pypi.example2.com']) self.assertEqual(PackageFinderSpy._spy.secure_origins, [('*', 'pypi.example.com', '*')])
class MockPackageFinder(object): BASE_URL = 'https://pypi.python.org/simple/pip-{0}.tar.gz' PIP_PROJECT_NAME = 'pip' INSTALLATION_CANDIDATES = [ InstallationCandidate(PIP_PROJECT_NAME, '6.9.0', BASE_URL.format('6.9.0')), InstallationCandidate(PIP_PROJECT_NAME, '3.3.1', BASE_URL.format('3.3.1')), InstallationCandidate(PIP_PROJECT_NAME, '1.0', BASE_URL.format('1.0')), ] def __init__(self, *args, **kwargs): pass def find_all_candidates(self, project_name): return self.INSTALLATION_CANDIDATES
def test_no_candidate_found_with_versions(): ireq = install_req_from_line('some-package==12.3.4') tried = [ InstallationCandidate('some-package', ver, None) for ver in ['1.2.3', '12.3.0', '12.3.5']] no_candidate_found = NoCandidateFound(ireq, tried, get_finder()) assert '{}'.format(no_candidate_found) == ( "Could not find a version that matches some-package==12.3.4\n" "Tried: 1.2.3, 12.3.0, 12.3.5\n" "There are incompatible versions in the resolved dependencies.")
def test_link_sorting_raises_when_wheel_unsupported(self): links = [ InstallationCandidate( "simple", '1.0', Link('simple-1.0-py2.py3-none-TEST.whl'), ), ] finder = PackageFinder([], [], session=PipSession()) with pytest.raises(InstallationError): finder._sort_versions(links)
def test_link_sorting(self): """ Test link sorting """ links = [ InstallationCandidate("simple", "2.0", Link(Inf)), InstallationCandidate("simple", "2.0", Link('simple-2.0.tar.gz')), InstallationCandidate( "simple", "1.0", Link('simple-1.0-pyT-none-TEST.whl'), ), InstallationCandidate( "simple", '1.0', Link('simple-1.0-pyT-TEST-any.whl'), ), InstallationCandidate( "simple", '1.0', Link('simple-1.0-pyT-none-any.whl'), ), InstallationCandidate( "simple", '1.0', Link('simple-1.0.tar.gz'), ), ] finder = PackageFinder([], [], session=PipSession()) results = finder._sort_versions(links) results2 = finder._sort_versions(reversed(links)) assert links == results == results2, results2
def test_link_sorting(self): """ Test link sorting """ links = [ InstallationCandidate("simple", "2.0", Link('simple-2.0.tar.gz')), InstallationCandidate( "simple", "1.0", Link('simple-1.0-pyT-none-TEST.whl'), ), InstallationCandidate( "simple", '1.0', Link('simple-1.0-pyT-TEST-any.whl'), ), InstallationCandidate( "simple", '1.0', Link('simple-1.0-pyT-none-any.whl'), ), InstallationCandidate( "simple", '1.0', Link('simple-1.0.tar.gz'), ), ] finder = PackageFinder([], [], session=PipSession()) finder.valid_tags = [ ('pyT', 'none', 'TEST'), ('pyT', 'TEST', 'any'), ('pyT', 'none', 'any'), ] results = sorted(links, key=finder._candidate_sort_key, reverse=True) results2 = sorted(reversed(links), key=finder._candidate_sort_key, reverse=True) assert links == results == results2, results2
def test_no_arguments_and_no_requirements_file(self): tempdir = tempfile.mkdtemp() args = [] with utils.mock.patch('pip.index.PackageFinder.find_all_candidates') as mock_find_all_candidates: project = 'flask' version = '0.10.1' link = Link('') candidate = InstallationCandidate(project, version, link) mock_find_all_candidates.return_value = [candidate] with self.cd(tempdir): result = self.runner.invoke(pur, args) self.assertEqual(result.exception.code, 1) expected_output = "Error: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'\n" self.assertEquals(u(result.output), u(expected_output)) self.assertEquals(result.exit_code, 1)
def test_updates_package_to_output_file(self): tempdir = tempfile.mkdtemp() output = os.path.join(tempdir, 'output.txt') requirements = open('tests/samples/requirements.txt').read() args = ['-r', 'tests/samples/requirements.txt', '--output', output] with utils.mock.patch('pip.index.PackageFinder.find_all_candidates') as mock_find_all_candidates: project = 'flask' version = '0.10.1' link = Link('') candidate = InstallationCandidate(project, version, link) mock_find_all_candidates.return_value = [candidate] result = self.runner.invoke(pur, args) self.assertIsNone(result.exception) expected_output = "Updated flask: 0.9 -> 0.10.1\nAll requirements up-to-date.\n" self.assertEquals(u(result.output), u(expected_output)) self.assertEquals(result.exit_code, 0) self.assertEquals(open('tests/samples/requirements.txt').read(), requirements)
def test_exit_code_from_no_updates(self): tempdir = tempfile.mkdtemp() requirements = os.path.join(tempdir, 'requirements.txt') shutil.copy('tests/samples/requirements-up-to-date.txt', requirements) args = ['-r', requirements, '--nonzero-exit-code'] with utils.mock.patch('pip.index.PackageFinder.find_all_candidates') as mock_find_all_candidates: project = 'flask' version = '0.10.1' link = Link('') candidate = InstallationCandidate(project, version, link) mock_find_all_candidates.return_value = [candidate] result = self.runner.invoke(pur, args) self.assertEqual(result.exception.code, 10) expected_output = "All requirements up-to-date.\n" self.assertEquals(u(result.output), u(expected_output)) self.assertEquals(result.exit_code, 10) expected_requirements = open('tests/samples/results/test_updates_package').read() self.assertEquals(open(requirements).read(), expected_requirements)
def test_dry_run(self): requirements = 'tests/samples/requirements.txt' tempdir = tempfile.mkdtemp() tmpfile = os.path.join(tempdir, 'requirements.txt') shutil.copy(requirements, tmpfile) args = ['-r', tmpfile, '-d'] with utils.mock.patch('pip.index.PackageFinder.find_all_candidates') as mock_find_all_candidates: project = 'flask' version = '0.10.1' link = Link('') candidate = InstallationCandidate(project, version, link) mock_find_all_candidates.return_value = [candidate] result = self.runner.invoke(pur, args) self.assertIsNone(result.exception) expected_output = open('tests/samples/results/test_updates_package').read() + "\n" self.assertEquals(u(result.output), u(expected_output)) self.assertEquals(result.exit_code, 0) self.assertEquals(open(tmpfile).read(), open(requirements).read())
def test_updates_package_with_number_in_name(self): tempdir = tempfile.mkdtemp() requirements = os.path.join(tempdir, 'requirements.txt') shutil.copy('tests/samples/requirements-version-in-name.txt', requirements) args = ['-r', requirements] with utils.mock.patch('pip.index.PackageFinder.find_all_candidates') as mock_find_all_candidates: project = 'package1' version = '2.0' link = Link('') candidate = InstallationCandidate(project, version, link) mock_find_all_candidates.return_value = [candidate] result = self.runner.invoke(pur, args) self.assertIsNone(result.exception) expected_output = "Updated package1: 1 -> 2.0\nAll requirements up-to-date.\n" self.assertEquals(u(result.output), u(expected_output)) self.assertEquals(result.exit_code, 0) expected_requirements = open('tests/samples/results/test_updates_package_with_version_in_name').read() self.assertEquals(open(requirements).read(), expected_requirements)
def test_skip_package(self): tempdir = tempfile.mkdtemp() requirements = os.path.join(tempdir, 'requirements.txt') shutil.copy('tests/samples/requirements-multiple.txt', requirements) args = ['-r', requirements, '-s', 'flask'] with utils.mock.patch('pip.index.PackageFinder.find_all_candidates') as mock_find_all_candidates: project = 'flask' version = '0.10.1' link = Link('') candidate = InstallationCandidate(project, version, link) mock_find_all_candidates.return_value = [candidate] result = self.runner.invoke(pur, args) self.assertIsNone(result.exception) expected_output = "Updated Alembic: 0.9 -> 0.10.1\nUpdated sqlalchemy: 0.9 -> 0.10.1\nAll requirements up-to-date.\n" self.assertEquals(u(result.output), u(expected_output)) self.assertEquals(result.exit_code, 0) expected_requirements = open('tests/samples/results/test_skip_package').read() self.assertEquals(open(requirements).read(), expected_requirements)
def test_updates_package_with_min_version_spec(self): requirements = 'tests/samples/requirements-with-min-version-spec.txt' tempdir = tempfile.mkdtemp() tmpfile = os.path.join(tempdir, 'requirements.txt') shutil.copy(requirements, tmpfile) args = ['-r', tmpfile] with utils.mock.patch('pip.index.PackageFinder.find_all_candidates') as mock_find_all_candidates: project = 'django' version = '1.8.13' link = Link('') candidate = InstallationCandidate(project, version, link) mock_find_all_candidates.return_value = [candidate] result = self.runner.invoke(pur, args) expected_output = "Updated django: 1.8.6 -> 1.8.13\nNew version for django found (1.8.13), but current spec prohibits updating: django > 1.8.6, < 1.9\nAll requirements up-to-date.\n" self.assertEquals(u(result.output), u(expected_output)) self.assertIsNone(result.exception) self.assertEquals(result.exit_code, 0) expected_requirements = open('tests/samples/results/test_updates_package_with_min_version_spec').read() self.assertEquals(open(tmpfile).read(), expected_requirements)
def test_does_not_update_package_with_multiline_spec(self): requirements = 'tests/samples/requirements-with-multiline.txt' tempdir = tempfile.mkdtemp() tmpfile = os.path.join(tempdir, 'requirements.txt') shutil.copy(requirements, tmpfile) args = ['-r', tmpfile] with utils.mock.patch('pip.index.PackageFinder.find_all_candidates') as mock_find_all_candidates: project = 'afakepackage' version = '1.1' link = Link('') candidate = InstallationCandidate(project, version, link) mock_find_all_candidates.return_value = [candidate] result = self.runner.invoke(pur, args) self.assertIsNone(result.exception) expected_output = "All requirements up-to-date.\n" self.assertEquals(u(result.output), u(expected_output)) self.assertEquals(result.exit_code, 0) expected_requirements = open(requirements).read() self.assertEquals(open(tmpfile).read(), expected_requirements)
def test_interactive_choice_quit(self): tempdir = tempfile.mkdtemp() requirements = os.path.join(tempdir, 'requirements.txt') shutil.copy('tests/samples/requirements-multiple.txt', requirements) args = ['-r', requirements, '-i'] with utils.mock.patch('pip.index.PackageFinder.find_all_candidates' ) as mock_find_all_candidates: project = 'flask' version = '0.10.1' link = Link('') candidate = InstallationCandidate(project, version, link) mock_find_all_candidates.return_value = [candidate] result = self.runner.invoke(pur, args, input='y\nq\n') self.assertIsNone(result.exception) expected_output = "Update flask from 0.9 to 0.10.1? (y, n, q) [y]: y\nUpdated flask: 0.9 -> 0.10.1\nUpdate Alembic from 0.9 to 0.10.1? (y, n, q) [y]: q\nAll requirements up-to-date.\n" self.assertEquals(u(result.output), u(expected_output)) self.assertEquals(result.exit_code, 0) expected_requirements = open( 'tests/samples/results/test_interactive_choice_quit').read() self.assertEquals(open(requirements).read(), expected_requirements)