diff --git a/pip/download.py b/pip/download.py index 000f4594a..281118b50 100644 --- a/pip/download.py +++ b/pip/download.py @@ -213,7 +213,9 @@ def get_file_content(url, comes_from=None, session=None): """Gets the content of a file; it may be a filename, file: URL, or http: URL. Returns (location, content). Content is unicode.""" if session is None: - session = PipSession() + raise TypeError( + "get_file_content() missing 1 required keyword argument: 'session'" + ) match = _scheme_re.search(url) if match: @@ -494,7 +496,9 @@ def _copy_file(filename, location, content_type, link): def unpack_http_url(link, location, download_cache, download_dir=None, session=None): if session is None: - session = PipSession() + raise TypeError( + "unpack_http_url() missing 1 required keyword argument: 'session'" + ) temp_dir = tempfile.mkdtemp('-unpack', 'pip-') temp_location = None diff --git a/pip/index.py b/pip/index.py index 295246a7d..58c1a299e 100644 --- a/pip/index.py +++ b/pip/index.py @@ -13,7 +13,7 @@ from pip.exceptions import ( UnsupportedWheel, ) from pip.backwardcompat import urlparse, url2pathname -from pip.download import PipSession, url_to_path, path_to_url +from pip.download import url_to_path, path_to_url from pip.wheel import Wheel, wheel_ext from pip.pep425tags import supported_tags, supported_tags_noarch, get_platform from pip._vendor import html5lib, requests, pkg_resources @@ -39,6 +39,12 @@ class PackageFinder(object): use_wheel=True, allow_external=[], allow_unverified=[], allow_all_external=False, allow_all_prereleases=False, session=None): + if session is None: + raise TypeError( + "PackageFinder() missing 1 required keyword argument: " + "'session'" + ) + self.find_links = find_links self.index_urls = index_urls self.cache = PageCache() @@ -73,7 +79,7 @@ class PackageFinder(object): self.allow_all_prereleases = allow_all_prereleases # The Session we'll use to make requests - self.session = session or PipSession() + self.session = session def _sort_locations(self, locations): """ @@ -717,7 +723,9 @@ class HTMLPage(object): @classmethod def get_page(cls, link, req, cache=None, skip_archives=True, session=None): if session is None: - session = PipSession() + raise TypeError( + "get_page() missing 1 required keyword argument: 'session'" + ) url = link.url url = url.split('#', 1)[0] @@ -827,11 +835,8 @@ class HTMLPage(object): cache.add_page_failure(url, level) @staticmethod - def _get_content_type(url, session=None): + def _get_content_type(url, session): """Get the Content-Type of the given url, using a HEAD request""" - if session is None: - session = PipSession() - scheme, netloc, path, query, fragment = urlparse.urlsplit(url) if scheme not in ('http', 'https', 'ftp', 'ftps'): # FIXME: some warning or something? diff --git a/pip/req/req_file.py b/pip/req/req_file.py index a572e2c60..1dd5e6f73 100644 --- a/pip/req/req_file.py +++ b/pip/req/req_file.py @@ -2,7 +2,7 @@ import os import re from pip.backwardcompat import urlparse -from pip.download import PipSession, get_file_content +from pip.download import get_file_content from pip.req.req_install import InstallRequirement from pip.util import normalize_name @@ -12,7 +12,10 @@ _scheme_re = re.compile(r'^(http|https|file):', re.I) def parse_requirements(filename, finder=None, comes_from=None, options=None, session=None): if session is None: - session = PipSession() + raise TypeError( + "parse_requirements() missing 1 required keyword argument: " + "'session'" + ) skip_match = None skip_regex = options.skip_requirements_regex if options else None diff --git a/pip/req/req_set.py b/pip/req/req_set.py index 11291be90..ac55c8659 100644 --- a/pip/req/req_set.py +++ b/pip/req/req_set.py @@ -4,7 +4,7 @@ import zipfile from pip._vendor import pkg_resources from pip.backwardcompat import HTTPError -from pip.download import (PipSession, url_to_path, unpack_vcs_link, is_vcs_url, +from pip.download import (url_to_path, unpack_vcs_link, is_vcs_url, is_file_url, unpack_file_url, unpack_http_url) from pip.exceptions import (InstallationError, BestVersionAlreadyInstalled, DistributionNotFound, PreviousBuildDirError) @@ -54,6 +54,12 @@ class RequirementSet(object): target_dir=None, ignore_dependencies=False, force_reinstall=False, use_user_site=False, session=None, pycompile=True, wheel_download_dir=None): + if session is None: + raise TypeError( + "RequirementSet() missing 1 required keyword argument: " + "'session'" + ) + self.build_dir = build_dir self.src_dir = src_dir self.download_dir = download_dir @@ -74,7 +80,7 @@ class RequirementSet(object): self.as_egg = as_egg self.use_user_site = use_user_site self.target_dir = target_dir # set from --target option - self.session = session or PipSession() + self.session = session self.pycompile = pycompile self.wheel_download_dir = wheel_download_dir diff --git a/tests/unit/test_finder.py b/tests/unit/test_finder.py index b5a628954..bb3653cf0 100644 --- a/tests/unit/test_finder.py +++ b/tests/unit/test_finder.py @@ -11,13 +11,14 @@ from pip.exceptions import ( BestVersionAlreadyInstalled, DistributionNotFound, InstallationError, ) from pip.util import Inf +from pip.download import PipSession from mock import Mock, patch def test_no_mpkg(data): """Finder skips zipfiles with "macosx10" in the name.""" - finder = PackageFinder([data.find_links], []) + finder = PackageFinder([data.find_links], [], session=PipSession()) req = InstallRequirement.from_line("pkgwithmpkg") found = finder.find_requirement(req, False) @@ -26,7 +27,7 @@ def test_no_mpkg(data): def test_no_partial_name_match(data): """Finder requires the full project name to match, not just beginning.""" - finder = PackageFinder([data.find_links], []) + finder = PackageFinder([data.find_links], [], session=PipSession()) req = InstallRequirement.from_line("gmpy") found = finder.find_requirement(req, False) @@ -36,7 +37,11 @@ def test_no_partial_name_match(data): def test_duplicates_sort_ok(data): """Finder successfully finds one of a set of duplicates in different locations""" - finder = PackageFinder([data.find_links, data.find_links2], []) + finder = PackageFinder( + [data.find_links, data.find_links2], + [], + session=PipSession(), + ) req = InstallRequirement.from_line("duplicate") found = finder.find_requirement(req, False) @@ -46,7 +51,7 @@ def test_duplicates_sort_ok(data): def test_finder_detects_latest_find_links(data): """Test PackageFinder detects latest using find-links""" req = InstallRequirement.from_line('simple', None) - finder = PackageFinder([data.find_links], []) + finder = PackageFinder([data.find_links], [], session=PipSession()) link = finder.find_requirement(req, False) assert link.url.endswith("simple-3.0.tar.gz") @@ -62,7 +67,7 @@ def test_finder_detects_latest_already_satisfied_find_links(data): version=latest_version ) req.satisfied_by = satisfied_by - finder = PackageFinder([data.find_links], []) + finder = PackageFinder([data.find_links], [], session=PipSession()) with pytest.raises(BestVersionAlreadyInstalled): finder.find_requirement(req, True) @@ -79,7 +84,11 @@ def test_finder_detects_latest_already_satisfied_pypi_links(): version=latest_version, ) req.satisfied_by = satisfied_by - finder = PackageFinder([], ["http://pypi.python.org/simple"]) + finder = PackageFinder( + [], + ["http://pypi.python.org/simple"], + session=PipSession(), + ) with pytest.raises(BestVersionAlreadyInstalled): finder.find_requirement(req, True) @@ -98,7 +107,12 @@ class TestWheel: logger.add_consumers((logger.DEBUG, log.append)) req = InstallRequirement.from_line("invalid") # data.find_links contains "invalid.whl", which is an invalid wheel - finder = PackageFinder([data.find_links], [], use_wheel=True) + finder = PackageFinder( + [data.find_links], + [], + use_wheel=True, + session=PipSession(), + ) with pytest.raises(DistributionNotFound): finder.find_requirement(req, True) "invalid.whl because the wheel filename is invalid" in "".join(log) @@ -114,7 +128,12 @@ class TestWheel: ) req = InstallRequirement.from_line("simple.dist") - finder = PackageFinder([data.find_links], [], use_wheel=True) + finder = PackageFinder( + [data.find_links], + [], + use_wheel=True, + session=PipSession(), + ) with pytest.raises(DistributionNotFound): finder.find_requirement(req, True) @@ -130,7 +149,12 @@ class TestWheel: ) req = InstallRequirement.from_line("simple.dist") - finder = PackageFinder([data.find_links], [], use_wheel=True) + finder = PackageFinder( + [data.find_links], + [], + use_wheel=True, + session=PipSession(), + ) found = finder.find_requirement(req, True) assert ( found.url.endswith("simple.dist-0.1-py2.py3-none-any.whl"), found @@ -142,7 +166,12 @@ class TestWheel: `test_link_sorting` also covers this at lower level """ req = InstallRequirement.from_line("priority") - finder = PackageFinder([data.find_links], [], use_wheel=True) + finder = PackageFinder( + [data.find_links], + [], + use_wheel=True, + session=PipSession(), + ) found = finder.find_requirement(req, True) assert found.url.endswith("priority-1.0-py2.py3-none-any.whl"), found @@ -159,7 +188,12 @@ class TestWheel: version=latest_version, ) req.satisfied_by = satisfied_by - finder = PackageFinder([data.find_links], [], use_wheel=True) + finder = PackageFinder( + [data.find_links], + [], + use_wheel=True, + session=PipSession(), + ) with pytest.raises(BestVersionAlreadyInstalled): finder.find_requirement(req, True) @@ -186,7 +220,7 @@ class TestWheel: (parse_version('1.0'), Link('simple-1.0.tar.gz'), '1.0'), ] - finder = PackageFinder([], []) + finder = PackageFinder([], [], session=PipSession()) finder.use_wheel = True results = finder._sort_versions(links) @@ -203,7 +237,7 @@ class TestWheel: '1.0', ), ] - finder = PackageFinder([], [], use_wheel=True) + finder = PackageFinder([], [], use_wheel=True, session=PipSession()) with pytest.raises(InstallationError): finder._sort_versions(links) @@ -214,6 +248,7 @@ def test_finder_priority_file_over_page(data): finder = PackageFinder( [data.find_links], ["http://pypi.python.org/simple"], + session=PipSession(), ) link = finder.find_requirement(req, False) assert link.url.startswith("file://") @@ -224,7 +259,7 @@ def test_finder_priority_nonegg_over_eggfragments(): req = InstallRequirement.from_line('bar==1.0', None) links = ['http://foo/bar.py#egg=bar-1.0', 'http://foo/bar-1.0.tar.gz'] - finder = PackageFinder(links, []) + finder = PackageFinder(links, [], session=PipSession()) with patch.object(finder, "_get_pages", lambda x, y: []): link = finder.find_requirement(req, False) @@ -232,7 +267,7 @@ def test_finder_priority_nonegg_over_eggfragments(): assert link.url.endswith('tar.gz') links.reverse() - finder = PackageFinder(links, []) + finder = PackageFinder(links, [], session=PipSession()) with patch.object(finder, "_get_pages", lambda x, y: []): link = finder.find_requirement(req, False) @@ -248,20 +283,20 @@ def test_finder_only_installs_stable_releases(data): req = InstallRequirement.from_line("bar", None) # using a local index (that has pre & dev releases) - finder = PackageFinder([], [data.index_url("pre")]) + finder = PackageFinder([], [data.index_url("pre")], session=PipSession()) link = finder.find_requirement(req, False) assert link.url.endswith("bar-1.0.tar.gz"), link.url # using find-links links = ["https://foo/bar-1.0.tar.gz", "https://foo/bar-2.0b1.tar.gz"] - finder = PackageFinder(links, []) + finder = PackageFinder(links, [], session=PipSession()) with patch.object(finder, "_get_pages", lambda x, y: []): link = finder.find_requirement(req, False) assert link.url == "https://foo/bar-1.0.tar.gz" links.reverse() - finder = PackageFinder(links, []) + finder = PackageFinder(links, [], session=PipSession()) with patch.object(finder, "_get_pages", lambda x, y: []): link = finder.find_requirement(req, False) @@ -276,20 +311,20 @@ def test_finder_installs_pre_releases(data): req = InstallRequirement.from_line("bar", None, prereleases=True) # using a local index (that has pre & dev releases) - finder = PackageFinder([], [data.index_url("pre")]) + finder = PackageFinder([], [data.index_url("pre")], session=PipSession()) link = finder.find_requirement(req, False) assert link.url.endswith("bar-2.0b1.tar.gz"), link.url # using find-links links = ["https://foo/bar-1.0.tar.gz", "https://foo/bar-2.0b1.tar.gz"] - finder = PackageFinder(links, []) + finder = PackageFinder(links, [], session=PipSession()) with patch.object(finder, "_get_pages", lambda x, y: []): link = finder.find_requirement(req, False) assert link.url == "https://foo/bar-2.0b1.tar.gz" links.reverse() - finder = PackageFinder(links, []) + finder = PackageFinder(links, [], session=PipSession()) with patch.object(finder, "_get_pages", lambda x, y: []): link = finder.find_requirement(req, False) @@ -304,7 +339,7 @@ def test_finder_installs_dev_releases(data): req = InstallRequirement.from_line("bar", None, prereleases=True) # using a local index (that has dev releases) - finder = PackageFinder([], [data.index_url("dev")]) + finder = PackageFinder([], [data.index_url("dev")], session=PipSession()) link = finder.find_requirement(req, False) assert link.url.endswith("bar-2.0.dev1.tar.gz"), link.url @@ -316,14 +351,14 @@ def test_finder_installs_pre_releases_with_version_spec(): req = InstallRequirement.from_line("bar>=0.0.dev0", None) links = ["https://foo/bar-1.0.tar.gz", "https://foo/bar-2.0b1.tar.gz"] - finder = PackageFinder(links, []) + finder = PackageFinder(links, [], session=PipSession()) with patch.object(finder, "_get_pages", lambda x, y: []): link = finder.find_requirement(req, False) assert link.url == "https://foo/bar-2.0b1.tar.gz" links.reverse() - finder = PackageFinder(links, []) + finder = PackageFinder(links, [], session=PipSession()) with patch.object(finder, "_get_pages", lambda x, y: []): link = finder.find_requirement(req, False) @@ -337,7 +372,11 @@ def test_finder_ignores_external_links(data): req = InstallRequirement.from_line("bar", None) # using a local index - finder = PackageFinder([], [data.index_url("externals")]) + finder = PackageFinder( + [], + [data.index_url("externals")], + session=PipSession(), + ) link = finder.find_requirement(req, False) assert link.filename == "bar-1.0.tar.gz" @@ -354,6 +393,7 @@ def test_finder_finds_external_links_with_hashes_per_project(data): [], [data.index_url("externals")], allow_external=["bar"], + session=PipSession(), ) link = finder.find_requirement(req, False) assert link.filename == "bar-2.0.tar.gz" @@ -371,6 +411,7 @@ def test_finder_finds_external_links_with_hashes_all(data): [], [data.index_url("externals")], allow_all_external=True, + session=PipSession(), ) link = finder.find_requirement(req, False) assert link.filename == "bar-2.0.tar.gz" @@ -388,6 +429,7 @@ def test_finder_finds_external_links_without_hashes_per_project(data): [data.index_url("externals")], allow_external=["bar"], allow_unverified=["bar"], + session=PipSession(), ) link = finder.find_requirement(req, False) assert link.filename == "bar-3.0.tar.gz" @@ -406,6 +448,7 @@ def test_finder_finds_external_links_without_hashes_all(data): [data.index_url("externals")], allow_all_external=True, allow_unverified=["bar"], + session=PipSession(), ) link = finder.find_requirement(req, False) assert link.filename == "bar-3.0.tar.gz" @@ -423,6 +466,7 @@ def test_finder_finds_external_links_without_hashes_scraped_per_project(data): [data.index_url("externals")], allow_external=["bar"], allow_unverified=["bar"], + session=PipSession(), ) link = finder.find_requirement(req, False) assert link.filename == "bar-4.0.tar.gz" @@ -441,6 +485,7 @@ def test_finder_finds_external_links_without_hashes_scraped_all(data): [data.index_url("externals")], allow_all_external=True, allow_unverified=["bar"], + session=PipSession(), ) link = finder.find_requirement(req, False) assert link.filename == "bar-4.0.tar.gz" @@ -459,6 +504,7 @@ def test_finder_finds_external_links_without_hashes_per_project_all_insecure( [data.index_url("externals")], allow_external=["bar"], allow_unverified=["bar"], + session=PipSession(), ) link = finder.find_requirement(req, False) assert link.filename == "bar-3.0.tar.gz" @@ -477,6 +523,7 @@ def test_finder_finds_external_links_without_hashes_all_all_insecure(data): [data.index_url("externals")], allow_all_external=True, allow_unverified=["bar"], + session=PipSession(), ) link = finder.find_requirement(req, False) assert link.filename == "bar-3.0.tar.gz" @@ -494,6 +541,7 @@ def test_finder_finds_external_links_without_hashes_scraped_per_project_all_inse [data.index_url("externals")], allow_external=["bar"], allow_unverified=["bar"], + session=PipSession(), ) link = finder.find_requirement(req, False) assert link.filename == "bar-4.0.tar.gz" @@ -513,6 +561,7 @@ def test_finder_finds_external_links_without_hashes_scraped_all_all_insecure( [data.index_url("externals")], allow_all_external=True, allow_unverified=["bar"], + session=PipSession(), ) link = finder.find_requirement(req, False) assert link.filename == "bar-4.0.tar.gz" @@ -530,6 +579,7 @@ def test_finder_finds_external_links_without_hashes_scraped_insecure(data): [], [data.index_url("externals")], allow_unverified=["bar"], + session=PipSession(), ) link = finder.find_requirement(req, False) assert link.filename == "bar-4.0.tar.gz" @@ -546,7 +596,12 @@ class test_link_package_versions(object): self.version = '1.0' self.parsed_version = parse_version(self.version) self.search_name = 'pytest' - self.finder = PackageFinder([], [], use_wheel=True) + self.finder = PackageFinder( + [], + [], + use_wheel=True, + session=PipSession(), + ) def test_link_package_versions_match_wheel(self): """Test that 'pytest' archives match for 'pytest'""" diff --git a/tests/unit/test_index.py b/tests/unit/test_index.py index a775299f9..ef4b8b8eb 100644 --- a/tests/unit/test_index.py +++ b/tests/unit/test_index.py @@ -1,3 +1,4 @@ +from pip.download import PipSession from pip.index import package_to_requirement, HTMLPage from pip.index import PackageFinder, Link, INSTALLED_VERSION @@ -36,7 +37,7 @@ def test_sort_locations_file_find_link(data): """ Test that a file:// find-link dir gets listdir run """ - finder = PackageFinder([data.find_links], []) + finder = PackageFinder([data.find_links], [], session=PipSession()) files, urls = finder._sort_locations([data.find_links]) assert files and not urls, ( "files and not urls should have been found at find-links url: %s" % @@ -49,7 +50,7 @@ def test_sort_locations_file_not_find_link(data): Test that a file:// url dir that's not a find-link, doesn't get a listdir run """ - finder = PackageFinder([], []) + finder = PackageFinder([], [], session=PipSession()) files, urls = finder._sort_locations(data.index_url("empty_with_pkg")) assert urls and not files, "urls, but not files should have been found" diff --git a/tests/unit/test_req.py b/tests/unit/test_req.py index cba3abd70..1b6dd077e 100644 --- a/tests/unit/test_req.py +++ b/tests/unit/test_req.py @@ -8,6 +8,7 @@ from mock import Mock, patch, mock_open from pip.exceptions import ( PreviousBuildDirError, InvalidWheelFilename, UnsupportedWheel, ) +from pip.download import PipSession from pip.index import PackageFinder from pip.log import logger from pip.req import (InstallRequirement, RequirementSet, @@ -34,6 +35,7 @@ class TestRequirementSet(object): src_dir=os.path.join(self.tempdir, 'src'), download_dir=None, download_cache=os.path.join(self.tempdir, 'download_cache'), + session=PipSession(), ) def test_no_reuse_existing_build_dir(self, data): @@ -45,7 +47,7 @@ class TestRequirementSet(object): reqset = self.basic_reqset() req = InstallRequirement.from_line('simple') reqset.add_requirement(req) - finder = PackageFinder([data.find_links], []) + finder = PackageFinder([data.find_links], [], session=PipSession()) assert_raises_regexp( PreviousBuildDirError, "pip can't proceed with [\s\S]*%s[\s\S]*%s" % @@ -181,7 +183,7 @@ def test_remote_reqs_parse(): # previously this has failed in py3: https://github.com/pypa/pip/issues/760 for req in parse_requirements( 'https://raw.githubusercontent.com/pypa/pip-test-package/master/' - 'tests/req_just_comment.txt'): + 'tests/req_just_comment.txt', session=PipSession()): pass @@ -189,9 +191,10 @@ def test_req_file_parse_use_wheel(data): """ Test parsing --use-wheel from a req file """ - finder = PackageFinder([], []) + finder = PackageFinder([], [], session=PipSession()) for req in parse_requirements( - data.reqfiles.join("supported_options.txt"), finder): + data.reqfiles.join("supported_options.txt"), finder, + session=PipSession()): pass assert finder.use_wheel @@ -203,8 +206,9 @@ def test_req_file_parse_comment_start_of_line(tmpdir): with open(tmpdir.join("req1.txt"), "w") as fp: fp.write("# Comment ") - finder = PackageFinder([], []) - reqs = list(parse_requirements(tmpdir.join("req1.txt"), finder)) + finder = PackageFinder([], [], session=PipSession()) + reqs = list(parse_requirements(tmpdir.join("req1.txt"), finder, + session=PipSession())) assert not reqs @@ -216,8 +220,9 @@ def test_req_file_parse_comment_end_of_line_with_url(tmpdir): with open(tmpdir.join("req1.txt"), "w") as fp: fp.write("https://example.com/foo.tar.gz # Comment ") - finder = PackageFinder([], []) - reqs = list(parse_requirements(tmpdir.join("req1.txt"), finder)) + finder = PackageFinder([], [], session=PipSession()) + reqs = list(parse_requirements(tmpdir.join("req1.txt"), finder, + session=PipSession())) assert len(reqs) == 1 assert reqs[0].url == "https://example.com/foo.tar.gz" @@ -230,8 +235,9 @@ def test_req_file_parse_egginfo_end_of_line_with_url(tmpdir): with open(tmpdir.join("req1.txt"), "w") as fp: fp.write("https://example.com/foo.tar.gz#egg=wat") - finder = PackageFinder([], []) - reqs = list(parse_requirements(tmpdir.join("req1.txt"), finder)) + finder = PackageFinder([], [], session=PipSession()) + reqs = list(parse_requirements(tmpdir.join("req1.txt"), finder, + session=PipSession())) assert len(reqs) == 1 assert reqs[0].name == "wat"