import argparse
from operator import itemgetter
import pkg_resources
import platform
import sys


def out(*args):  # pragma: no cover
    for arg in args:
        sys.stdout.write(arg)
        sys.stdout.write(' ')
    sys.stdout.write('\n')


def get_parser():
    parser = argparse.ArgumentParser(
        description="Show Python distribution versions and locations in use"
    )
    return parser


def main(
    argv=sys.argv,
    pkg_resources=pkg_resources,
    platform=platform.platform,
    out=out,
):
    # all args except argv are for unit testing purposes only
    parser = get_parser()
    parser.parse_args(argv[1:])
    packages = []
    for distribution in pkg_resources.working_set:
        name = distribution.project_name
        packages.append(
            {
                'version': distribution.version,
                'lowername': name.lower(),
                'name': name,
                'location': distribution.location,
            }
        )
    packages = sorted(packages, key=itemgetter('lowername'))
    pyramid_version = pkg_resources.get_distribution('pyramid').version
    plat = platform()
    out('Pyramid version:', pyramid_version)
    out('Platform:', plat)
    out('Packages:')
    for package in packages:
        out(' ', package['name'], package['version'])
        out('   ', package['location'])


if __name__ == '__main__':  # pragma: no cover
    sys.exit(main() or 0)
