class Web(object): def __init__(self): self.cache = set() self.store = dict() self.extra = set() self.server = ServerProxy("https://pypi.python.org/pypi") def get_users(self, package="pip"): results = self.server.package_roles(package) self.extra.add(package) title, users = zip(*results) for user in users: if user in self.cache: pass else: user_result = self.server.user_packages(user) title, packages = zip(*user_result) self.store[user] = set(packages) self.cache.add(user) print(user, packages)
class Client(object): def __init__(self): self.uri = 'https://pypi.python.org/pypi' self.proxy = ServerProxy(self.uri) self.cache = set() def all_distributions(self): return self.proxy.list_packages() def roles(self, package): return [cl[1] for cl in self.proxy.package_roles(package)] def user_packages(self, user): return [cl[1] for cl in self.proxy.user_packages(user)] def release_downloads(self, package, version=None): if version is None: version = max(self.proxy.package_releases(package)) if isinstance(version, list): version = version[0] return self.proxy.release_downloads(package, version) def package_releases(self, package): return self.proxy.package_releases(package) def release_data(self, package, version=None): version = max(self.proxy.package_releases(package)) if isinstance(version, list): version = version[0] data = self.proxy.release_data(package, version) return data def simple_search(self, spec, operator='or', getter = None, omit = ('django')): """Can search by name, version, author, author_email, maintainer, maintainer_email, home_page, license, summary, description, keywords, platform,download_url""" from pip.commands.search import transform_hits, highest_version from results = set() packages = {} from operator import itemgetter filter = itemgetter('name', 'version') info_getter = itemgetter('name', 'summary') name_getter = itemgetter('name') hits = self.proxy.search({'name': spec},{'summary':spec}, operator) results = transform_hits(hits) for result in results: result['version'] = highest_version(result['versions']) del result['score'] return results def deep_search(self, spec, operator='and', cache = None, limit=20): results =list() temp_cache = set() initial_results = self.simple_search(spec, operator='and', getter=None, omit=['django']) for result in initial_results: new = PyPiPackage(result) results.append(new) temp_cache.add(new) if cache is not None: self.cache = cache|temp_cache else: pass filtered = sorted(results, key = lambda x: x.max_downloads, reversed=True) return filtered[limit:] def browse(self, classifiers): return self.proxy.browse(classifiers) def get_json_url(self, package): return "http://pypi.python.org/pypi/{}/json".format(package)