diff options
Diffstat (limited to 'setuptools')
-rwxr-xr-x | setuptools/command/easy_install.py | 7 | ||||
-rwxr-xr-x | setuptools/package_index.py | 4 | ||||
-rw-r--r-- | setuptools/tests/indexes/test_links_priority/external.html | 3 | ||||
-rw-r--r-- | setuptools/tests/indexes/test_links_priority/simple/foobar/index.html | 4 | ||||
-rw-r--r-- | setuptools/tests/server.py | 48 | ||||
-rw-r--r-- | setuptools/tests/test_easy_install.py | 8 | ||||
-rw-r--r-- | setuptools/tests/test_packageindex.py | 36 |
7 files changed, 100 insertions, 10 deletions
diff --git a/setuptools/command/easy_install.py b/setuptools/command/easy_install.py index e13f676a..2a227196 100755 --- a/setuptools/command/easy_install.py +++ b/setuptools/command/easy_install.py @@ -39,7 +39,7 @@ __all__ = [ ] import site -HAS_USER_SITE = not sys.version < "2.6" +HAS_USER_SITE = not sys.version < "2.6" and site.ENABLE_USER_SITE def samefile(p1,p2): if hasattr(os.path,'samefile') and ( @@ -122,7 +122,7 @@ class easy_install(Command): create_index = PackageIndex def initialize_options(self): - if HAS_USER_SITE and site.ENABLE_USER_SITE: + if HAS_USER_SITE: whereami = os.path.abspath(__file__) self.user = whereami.startswith(site.USER_SITE) else: @@ -1348,8 +1348,7 @@ def get_site_dirs(): site_lib = get_python_lib(plat_specific) if site_lib not in sitedirs: sitedirs.append(site_lib) - if sys.version >= "2.6": - import site + if HAS_USER_SITE: sitedirs.append(site.USER_SITE) sitedirs = map(normalize_path, sitedirs) diff --git a/setuptools/package_index.py b/setuptools/package_index.py index 67e9f6ae..1d467f78 100755 --- a/setuptools/package_index.py +++ b/setuptools/package_index.py @@ -203,11 +203,11 @@ class PackageIndex(Environment): charset = f.headers.get_param('charset') or 'latin-1' page = page.decode(charset, "ignore") f.close() - if url.startswith(self.index_url) and getattr(f,'code',None)!=404: - page = self.process_index(url, page) for match in HREF.finditer(page): link = urlparse.urljoin(base, htmldecode(match.group(1))) self.process_url(link) + if url.startswith(self.index_url) and getattr(f,'code',None)!=404: + page = self.process_index(url, page) def process_filename(self, fn, nested=False): # process filenames or directories diff --git a/setuptools/tests/indexes/test_links_priority/external.html b/setuptools/tests/indexes/test_links_priority/external.html new file mode 100644 index 00000000..92e4702f --- /dev/null +++ b/setuptools/tests/indexes/test_links_priority/external.html @@ -0,0 +1,3 @@ +<html><body> +<a href="/foobar-0.1.tar.gz#md5=1__bad_md5___">bad old link</a> +</body></html> diff --git a/setuptools/tests/indexes/test_links_priority/simple/foobar/index.html b/setuptools/tests/indexes/test_links_priority/simple/foobar/index.html new file mode 100644 index 00000000..fefb028b --- /dev/null +++ b/setuptools/tests/indexes/test_links_priority/simple/foobar/index.html @@ -0,0 +1,4 @@ +<html><body> +<a href="/foobar-0.1.tar.gz#md5=0_correct_md5">foobar-0.1.tar.gz</a><br/> +<a href="../../external.html" rel="homepage">external homepage</a><br/> +</body></html> diff --git a/setuptools/tests/server.py b/setuptools/tests/server.py new file mode 100644 index 00000000..f4aaaa1c --- /dev/null +++ b/setuptools/tests/server.py @@ -0,0 +1,48 @@ +"""Basic http server for tests to simulate PyPI or custom indexes +""" +import urllib2 +import sys +from threading import Thread +from BaseHTTPServer import HTTPServer +from SimpleHTTPServer import SimpleHTTPRequestHandler + +class IndexServer(HTTPServer): + """Basic single-threaded http server simulating a package index + + You can use this server in unittest like this:: + s = IndexServer() + s.start() + index_url = s.base_url() + 'mytestindex' + # do some test requests to the index + # The index files should be located in setuptools/tests/indexes + s.stop() + """ + def __init__(self): + HTTPServer.__init__(self, ('', 0), SimpleHTTPRequestHandler) + self._run = True + + def serve(self): + while True: + self.handle_request() + if not self._run: break + + def start(self): + self.thread = Thread(target=self.serve) + self.thread.start() + + def stop(self): + """self.shutdown is not supported on python < 2.6""" + self._run = False + try: + if sys.version > '2.6': + urllib2.urlopen('http://127.0.0.1:%s/' % self.server_port, + None, 5) + else: + urllib2.urlopen('http://127.0.0.1:%s/' % self.server_port) + except urllib2.URLError: + pass + self.thread.join() + + def base_url(self): + port = self.server_port + return 'http://127.0.0.1:%s/setuptools/tests/indexes/' % port diff --git a/setuptools/tests/test_easy_install.py b/setuptools/tests/test_easy_install.py index 4791e03c..8caaeb87 100644 --- a/setuptools/tests/test_easy_install.py +++ b/setuptools/tests/test_easy_install.py @@ -158,7 +158,7 @@ class TestUserInstallTest(unittest.TestCase): self.old_cwd = os.getcwd() os.chdir(self.dir) if sys.version >= "2.6": - self.old_enable = site.ENABLE_USER_SITE + self.old_has_site = easy_install_pkg.HAS_USER_SITE self.old_file = easy_install_pkg.__file__ self.old_base = site.USER_BASE site.USER_BASE = tempfile.mkdtemp() @@ -174,11 +174,11 @@ class TestUserInstallTest(unittest.TestCase): shutil.rmtree(site.USER_SITE) site.USER_BASE = self.old_base site.USER_SITE = self.old_site - site.ENABLE_USER_SITE = self.old_enable + easy_install_pkg.HAS_USER_SITE = self.old_has_site easy_install_pkg.__file__ = self.old_file def test_user_install_implied(self): - site.ENABLE_USER_SITE = True # disabled sometimes + easy_install_pkg.HAS_USER_SITE = True # disabled sometimes #XXX: replace with something meaningfull if sys.version < "2.6": return #SKIP @@ -195,7 +195,7 @@ class TestUserInstallTest(unittest.TestCase): _LOG.info('this should not break') def test_user_install_not_implied_without_usersite_enabled(self): - site.ENABLE_USER_SITE = False # disabled sometimes + easy_install_pkg.HAS_USER_SITE = False # usually enabled #XXX: replace with something meaningfull if sys.version < "2.6": return #SKIP diff --git a/setuptools/tests/test_packageindex.py b/setuptools/tests/test_packageindex.py index 8ae7a5b9..42cb8c1e 100644 --- a/setuptools/tests/test_packageindex.py +++ b/setuptools/tests/test_packageindex.py @@ -5,6 +5,7 @@ import sys import os, shutil, tempfile, unittest, urllib2 import pkg_resources import setuptools.package_index +from server import IndexServer class TestPackageIndex(unittest.TestCase): @@ -74,3 +75,38 @@ class TestPackageIndex(unittest.TestCase): url = 'file:///tmp/test_package_index' self.assert_(index.url_ok(url, True)) + def test_links_priority(self): + """ + Download links from the pypi simple index should be used before + external download links. + http://bitbucket.org/tarek/distribute/issue/163/md5-validation-error + + Usecase : + - someone uploads a package on pypi, a md5 is generated + - someone manually copies this link (with the md5 in the url) onto an + external page accessible from the package page. + - someone reuploads the package (with a different md5) + - while easy_installing, an MD5 error occurs because the external link + is used + -> Distribute should use the link from pypi, not the external one. + """ + # start an index server + server = IndexServer() + server.start() + index_url = server.base_url() + 'test_links_priority/simple/' + + # scan a test index + pi = setuptools.package_index.PackageIndex(index_url) + requirement = pkg_resources.Requirement.parse('foobar') + pi.find_packages(requirement) + server.stop() + + # the distribution has been found + self.assert_('foobar' in pi) + # we have only one link, because links are compared without md5 + self.assert_(len(pi['foobar'])==1) + # the link should be from the index + self.assert_('correct_md5' in pi['foobar'][0].location) + + + |