diff --git a/pypiserver/core.py b/pypiserver/core.py index 7eabe16..02cf93c 100755 --- a/pypiserver/core.py +++ b/pypiserver/core.py @@ -45,9 +45,31 @@ def parse_version(s): _archive_suffix_rx = re.compile(r"(\.zip|\.tar\.gz|\.tgz|\.tar\.bz2|-py[23]\.\d-.*|\.win-amd64-py[23]\.\d\..*|\.win32-py[23]\.\d\..*)$", re.IGNORECASE) +wheel_file_re = re.compile( + r"""^(?P(?P.+?)-(?P\d.*?)) + ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) + \.whl|\.dist-info)$""", + re.VERBOSE) + + +def _guess_pkgname_and_version_wheel(basename): + m = wheel_file_re.match(basename) + if not m: + return None, None + name = m.group("name") + ver = m.group("ver") + build = m.group("build") + if build: + return name, ver + "-" + build + else: + return name, ver + def guess_pkgname_and_version(path): path = os.path.basename(path) + if path.endswith(".whl"): + return _guess_pkgname_and_version_wheel(path) + path = _archive_suffix_rx.sub('', path) if '-' not in path: pkgname, version = path, '' @@ -90,10 +112,11 @@ def listdir(root): if not is_allowed_path(x) or not os.path.isfile(fn): continue pkgname, version = guess_pkgname_and_version(x) - yield pkgfile(fn=fn, root=root, relfn=fn[len(root) + 1:], - pkgname=pkgname, - version=version, - parsed_version=parse_version(version)) + if pkgname: + yield pkgfile(fn=fn, root=root, relfn=fn[len(root) + 1:], + pkgname=pkgname, + version=version, + parsed_version=parse_version(version)) def find_packages(pkgs, prefix=""): diff --git a/tests/test_core.py b/tests/test_core.py index ec76349..28e786e 100755 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -32,6 +32,7 @@ files = [ ("package-123-20000101.zip", "package-123", "20000101"), ("pyelasticsearch-0.5-brainbot-1-20130712.zip", "pyelasticsearch", "0.5-brainbot-1-20130712"), ("pywin32-217-cp27-none-win32.whl", "pywin32", "217"), + ("pywin32-217-55-cp27-none-win32.whl", "pywin32", "217-55"), ("pywin32-217.1-cp27-none-win32.whl", "pywin32", "217.1"), ("package.zip", "package", ""), ] @@ -40,3 +41,9 @@ files = [ @pytest.mark.parametrize(("filename", "pkgname", "version"), files) def test_guess_pkgname_and_version(filename, pkgname, version): assert core.guess_pkgname_and_version(filename) == (pkgname, version) + + +def test_listdir_bad_name(tmpdir): + tmpdir.join("foo.whl").ensure() + res = list(core.listdir(tmpdir.strpath)) + assert res == []