Example #1
0
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
Example #2
0
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
Example #3
0
    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