Require an already created session to be passed into APIs

This commit is contained in:
Donald Stufft 2014-05-06 19:25:44 -04:00
parent fb46902a11
commit 7037443975
7 changed files with 131 additions and 51 deletions

View File

@ -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

View File

@ -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?

View File

@ -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

View File

@ -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

View File

@ -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'"""

View File

@ -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"

View File

@ -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"