From cc243cc8085ffd7b184d52e9250b64d8ee3eb1a0 Mon Sep 17 00:00:00 2001 From: Tarek Ziade Date: Sat, 21 May 2011 22:47:40 +0200 Subject: make sure the crawler can browse file-based indexes under win32 --- Lib/packaging/pypi/simple.py | 18 ++++++++++++++---- Lib/packaging/tests/test_pypi_simple.py | 14 +++++++++++--- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Lib/packaging/pypi/simple.py b/Lib/packaging/pypi/simple.py index 8585193..ee7a113 100644 --- a/Lib/packaging/pypi/simple.py +++ b/Lib/packaging/pypi/simple.py @@ -123,8 +123,14 @@ class Crawler(BaseClient): self.follow_externals = follow_externals # mirroring attributes. - if not index_url.endswith("/"): - index_url += "/" + parsed = urllib.parse.urlparse(index_url) + self.scheme = parsed[0] + if self.scheme == 'file': + ender = os.path.sep + else: + ender = '/' + if not index_url.endswith(ender): + index_url += ender # if no mirrors are defined, use the method described in PEP 381. if mirrors is None: mirrors = get_mirrors(mirrors_url) @@ -376,7 +382,11 @@ class Crawler(BaseClient): :param name: the name of the project to find the page """ # Browse and index the content of the given PyPI page. - url = self.index_url + name + "/" + if self.scheme == 'file': + ender = os.path.sep + else: + ender = '/' + url = self.index_url + name + ender self._process_url(url, name) @socket_timeout() @@ -395,7 +405,7 @@ class Crawler(BaseClient): # add index.html automatically for filesystem paths if scheme == 'file': - if url.endswith('/'): + if url.endswith(os.path.sep): url += "index.html" # add authorization headers if auth is provided diff --git a/Lib/packaging/tests/test_pypi_simple.py b/Lib/packaging/tests/test_pypi_simple.py index 6f0d8d9..d50e3f4 100644 --- a/Lib/packaging/tests/test_pypi_simple.py +++ b/Lib/packaging/tests/test_pypi_simple.py @@ -1,5 +1,5 @@ """Tests for the packaging.pypi.simple module.""" - +import re import os import sys import http.client @@ -277,8 +277,16 @@ class SimpleCrawlerTestCase(TempdirManager, def test_browse_local_files(self): # Test that we can browse local files""" - index_path = os.sep.join(["file://" + PYPI_DEFAULT_STATIC_PATH, - "test_found_links", "simple"]) + index_url = "file://" + PYPI_DEFAULT_STATIC_PATH + if sys.platform == 'win32': + # under windows the correct syntax is: + # file:///C|\the\path\here + # instead of + # file://C:\the\path\here + fix = re.compile(r'^(file://)([A-Za-z])(:)') + index_url = fix.sub('\\1/\\2|', index_url) + + index_path = os.sep.join([index_url, "test_found_links", "simple"]) crawler = Crawler(index_path) dists = crawler.get_releases("foobar") self.assertEqual(4, len(dists)) -- cgit v0.12