Calculates the health of a package, based on several factors

    :param package_name: name of package on pypi.python.org
    :param package_version: version number of package to check, optional - defaults to latest version
    :param verbose: flag to print out reasons
    :param no_output: print no output
    :param lint: run pylint on the package

    :returns: (score: integer, reasons: list of reasons for score)
    :rtype: tuple

def calculate_health(package_name, package_version=None, verbose=False, no_output=False):
    """
    Calculates the health of a package, based on several factors

    :param package_name: name of package on pypi.python.org
    :param package_version: version number of package to check, optional - defaults to latest version
    :param verbose: flag to print out reasons
    :param no_output: print no output
    :param lint: run pylint on the package

    :returns: (score: integer, reasons: list of reasons for score)
    :rtype: tuple
    """
    total_score = 0
    reasons = []

    package_releases = CLIENT.package_releases(package_name)
    if not package_releases:
        if not no_output:
            print(TERMINAL.red('{} is not listed on pypi'.format(package_name)))
        return 0, []

    if package_version is None:
        package_version = package_releases[0]

    package_info = CLIENT.release_data(package_name, package_version)
    release_urls = CLIENT.release_urls(package_name, package_version)

    if not package_info or not release_urls:
        if not no_output:
            print(TERMINAL.red('Version {} is not listed on pypi'.format(
                package_version)))
        return 0, []

    if not no_output:
        print(TERMINAL.bold('{} v{}'.format(package_name, package_version)))
        print('-----')

    checkers = [
        checks.check_license,
        checks.check_homepage,
        checks.check_summary,
        checks.check_description,
        checks.check_python_classifiers,
        checks.check_author_info,
        checks.check_release_files,
        checks.check_stale
    ]

    for checker in checkers:
        result, reason, score = checker(package_info, release_urls)
        if result:
            total_score += score
        else:
            reasons.append(reason)

    if total_score < 0:
        total_score = 0

    if not no_output:
        percentage = int(float(total_score) / float(checks.TOTAL_POSSIBLE) * 100)
        score_string = 'score: {}/{} {}%'.format(total_score, checks.TOTAL_POSSIBLE, percentage)

        print(get_health_color(percentage)(score_string))

    if verbose and not no_output:
        for reason in reasons:
            print(reason)

    if no_output:
        return total_score, reasons