diff --git a/tests/test_yolk_cli.py b/tests/test_yolk_cli.py index 7f217a9..98009b5 100644 --- a/tests/test_yolk_cli.py +++ b/tests/test_yolk_cli.py @@ -1,3 +1,6 @@ +import unittest + +import yolk.yolklib class TestStdOut: def test_object_initialization(self): @@ -107,3 +110,7 @@ class TestMain: def test_main(self): pass # TODO: implement your test here +class TestYolkLib (unittest.TestCase): + def test_get_highest_version(self): + versions = ['2.2', '3.0.5', '1.3', '3.1.2', '1.3.4', '0.3', '3.1.1', '1.2.4'] + self.assertEqual('3.1.2', yolk.yolklib.get_highest_version(versions)) diff --git a/yolk/cli.py b/yolk/cli.py index fccc2c5..5b77032 100755 --- a/yolk/cli.py +++ b/yolk/cli.py @@ -240,27 +240,41 @@ def show_updates(self): #Check for every installed package pkg_list = get_pkglist() found = None - for pkg in pkg_list: + + from multiprocessing import Process, Manager + manager = Manager() + def worker_function(pkg, result_list, index): for (dist, active) in dists.get_distributions("all", pkg, dists.get_highest_installed(pkg)): (project_name, versions) = \ self.pypi.query_versions_pypi(dist.project_name) - if versions: - - #PyPI returns them in chronological order, - #but who knows if its guaranteed in the API? - #Make sure we grab the highest version: - - newest = get_highest_version(versions) - if newest != dist.version: - - #We may have newer than what PyPI knows about - - if pkg_resources.parse_version(dist.version) < \ - pkg_resources.parse_version(newest): - found = True - print " %s %s (%s)" % (project_name, dist.version, - newest) + result_list[index] = (pkg, dist, project_name, versions) + + outputs = manager.list([None for _ in pkg_list]) + workers = [] + for index, pkg in enumerate(pkg_list): + p = Process(target = worker_function, args=(pkg, outputs, index)) + p.start() + workers.append(p) + for process in workers: + process.join() + for (pkg, dist, project_name, versions) in outputs: + if versions: + + #PyPI returns them in chronological order, + #but who knows if its guaranteed in the API? + #Make sure we grab the highest version: + + newest = get_highest_version(versions) + if newest != dist.version: + + #We may have newer than what PyPI knows about + + if pkg_resources.parse_version(dist.version) < \ + pkg_resources.parse_version(newest): + found = True + print " %s %s (%s)" % (project_name, dist.version, + newest) if not found and self.project_name: self.logger.info("You have the latest version installed.") elif not found: diff --git a/yolk/metadata.py b/yolk/metadata.py index 3690bae..5019608 100644 --- a/yolk/metadata.py +++ b/yolk/metadata.py @@ -35,9 +35,12 @@ def get_metadata(dist): if not dist.has_metadata('PKG-INFO'): return - msg = email.message_from_string(dist.get_metadata('PKG-INFO')) - metadata = {} - for header in [l for l in msg._headers]: - metadata[header[0]] = header[1] - + try: + metadata = {} + msg = email.message_from_string(dist.get_metadata('PKG-INFO')) + for header in [l for l in msg._headers]: + metadata[header[0]] = header[1] + except IOError as e: + # no egg-file, installed using other package manager + pass return metadata diff --git a/yolk/pypi.py b/yolk/pypi.py index 2c8f71d..cf6e6e0 100644 --- a/yolk/pypi.py +++ b/yolk/pypi.py @@ -223,7 +223,7 @@ def package_releases(self, package_name): return self.xmlrpc.package_releases(package_name) def get_download_urls(self, package_name, version="", pkg_type="all"): - """Query PyPI for pkg download URI for a packge""" + """Query PyPI for pkg download URI for a package""" if version: versions = [version] diff --git a/yolk/yolklib.py b/yolk/yolklib.py index 754515f..9d7d903 100755 --- a/yolk/yolklib.py +++ b/yolk/yolklib.py @@ -166,7 +166,7 @@ def get_highest_version(versions): sorted_versions = [] for ver in versions: sorted_versions.append((pkg_resources.parse_version(ver), ver)) - + sorted_versions = sorted(sorted_versions) sorted_versions.reverse() return sorted_versions[0][1]