def fetch_releases(package_name, include_hidden=True): if not package_name: raise TypeError("package_name requires a valid package name") package_name = package_name include_hidden = include_hidden proxy = xmlrpclib.Server('http://pypi.python.org/pypi') releases = [] for version in proxy.package_releases(package_name, include_hidden): release_data = PypiVersion(proxy.release_data(package_name, version)) release_data.hidden = release_data._pypi_hidden release_data.downloads = 0 try: for download in proxy.release_urls(package_name, version): release_data.downloads += download["downloads"] timetuple = download['upload_time'].timetuple() release_data.upload_time = datetime( timetuple.tm_year, timetuple.tm_mon, timetuple.tm_mday, timetuple.tm_hour, timetuple.tm_min, timetuple.tm_sec, ) except xmlrpclib.ProtocolError: # TODO - log this error and report it! pass if release_data.license == None or 'UNKNOWN' == release_data.license.upper(): for classifier in release_data.classifiers: if classifier.startswith('License'): # Do it this way to cover people not quite following the spec # at http://docs.python.org/distutils/setupscript.html#additional-meta-data release_data.license = classifier.replace('License ::', '') release_data.license = release_data.license.replace('OSI Approved :: ', '') break if release_data.license and len(release_data.license) > 100: release_data.license = "Other (see http://pypi.python.org/pypi/%s)" % package_name release_data.development_status = 0 for classifier in release_data.classifiers: if classifier.startswith('Development Status'): release_data.development_status = status_choices_switch(classifier) break release_data.supports_python3 = False for classifier in release_data.classifiers: if classifier.startswith('Programming Language :: Python :: 3'): release_data.supports_python3 = True break releases.append(release_data) return releases
def fetch_releases(package_name, include_hidden=True): if not package_name: raise TypeError("package_name requires a valid package name") package_name = package_name include_hidden = include_hidden proxy = xmlrpclib.Server('http://pypi.python.org/pypi') releases = [] for version in proxy.package_releases(package_name, include_hidden): release_data = PypiVersion(proxy.release_data(package_name, version)) release_data.hidden = release_data._pypi_hidden release_data.downloads = 0 for download in proxy.release_urls(package_name, version): release_data.downloads += download["downloads"] timetuple = download['upload_time'].timetuple() release_data.upload_time = datetime( timetuple.tm_year, timetuple.tm_mon, timetuple.tm_mday, timetuple.tm_hour, timetuple.tm_min, timetuple.tm_sec, ) if release_data.license == None or 'UNKNOWN' == release_data.license.upper( ): for classifier in release_data.classifiers: if classifier.startswith('License'): # Do it this way to cover people not quite following the spec # at http://docs.python.org/distutils/setupscript.html#additional-meta-data release_data.license = classifier.replace('License ::', '') release_data.license = release_data.license.replace( 'OSI Approved :: ', '') break if release_data.license and len(release_data.license) > 100: release_data.license = "Other (see http://pypi.python.org/pypi/%s)" % package_name release_data.development_status = 0 for classifier in release_data.classifiers: if classifier.startswith('Development Status'): release_data.development_status = status_choices_switch( classifier) break releases.append(release_data) return releases
def fetch_pypi_data(self, *args, **kwargs): # Get the releases from pypi if self.pypi_url.strip() and self.pypi_url != "http://pypi.python.org/pypi/": total_downloads = 0 url = "https://pypi.python.org/pypi/{0}/json".format(self.pypi_name) response = requests.get(url) if settings.DEBUG: if response.status_code not in (200, 404): print("BOOM!") print(self, response.status_code) if response.status_code == 404: if settings.DEBUG: print("BOOM!") print(self, response.status_code) return False release = json.loads(response.content) info = release['info'] version, created = Version.objects.get_or_create( package=self, number=info['version'] ) # add to versions license = info['license'] if not info['license'] or not license.strip() or 'UNKNOWN' == license.upper(): for classifier in info['classifiers']: if classifier.strip().startswith('License'): # Do it this way to cover people not quite following the spec # at http://docs.python.org/distutils/setupscript.html#additional-meta-data license = classifier.strip().replace('License ::', '') license = license.replace('OSI Approved :: ', '') break if license and len(license) > 100: license = "Other (see http://pypi.python.org/pypi/%s)" % self.pypi_name version.license = license #version stuff try: url_data = release['urls'][0] version.downloads = url_data['downloads'] version.upload_time = url_data['upload_time'] except IndexError: # Not a real release so we just guess the upload_time. version.upload_time = version.created version.hidden = info['_pypi_hidden'] for classifier in info['classifiers']: if classifier.startswith('Development Status'): version.development_status = status_choices_switch(classifier) break for classifier in info['classifiers']: if classifier.startswith('Programming Language :: Python :: 3'): version.supports_python3 = True break version.save() self.pypi_downloads = total_downloads # Calculate total downloads return True return False