Skip to content

Instantly share code, notes, and snippets.

@kaos
Created April 28, 2018 11:38
Show Gist options
  • Save kaos/68511bd013fcdebe766c981f50b473d4 to your computer and use it in GitHub Desktop.
Save kaos/68511bd013fcdebe766c981f50b473d4 to your computer and use it in GitHub Desktop.

Revisions

  1. kaos created this gist Apr 28, 2018.
    84 changes: 84 additions & 0 deletions list-pkg-versions.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,84 @@
    #!/usr/bin/env python
    # When you want a easy way to get at all (or the latest) version of a certain python package from a PyPi index.

    import sys
    import logging

    try:
    from pip._internal import cmdoptions, main
    from pip._internal.commands import commands_dict
    from pip._internal.basecommand import RequirementCommand
    except ImportError:
    from pip import cmdoptions, main
    from pip.commands import commands_dict
    from pip.basecommand import RequirementCommand

    from pip._vendor.packaging.version import parse as parse_version

    logger = logging.getLogger('pip')

    class ListPkgVersionsCommand(RequirementCommand):
    """
    List all available versions for a given package from:
    - PyPI (and other indexes) using requirement specifiers.
    - VCS project urls.
    - Local project directories.
    - Local or remote source archives.
    """
    name = "list-pkg-versions"
    usage = """
    %prog [options] <requirement specifier> [package-index-options] ...
    %prog [options] [-e] <vcs project url> ...
    %prog [options] [-e] <local project path> ...
    %prog [options] <archive url/path> ..."""

    summary = 'List package versions.'

    def __init__(self, *args, **kw):
    super(ListPkgVersionsCommand, self).__init__(*args, **kw)

    cmd_opts = self.cmd_opts

    cmd_opts.add_option(cmdoptions.install_options())
    cmd_opts.add_option(cmdoptions.global_options())
    cmd_opts.add_option(cmdoptions.use_wheel())
    cmd_opts.add_option(cmdoptions.no_use_wheel())
    cmd_opts.add_option(cmdoptions.no_binary())
    cmd_opts.add_option(cmdoptions.only_binary())
    cmd_opts.add_option(cmdoptions.pre())
    cmd_opts.add_option(cmdoptions.require_hashes())

    index_opts = cmdoptions.make_option_group(
    cmdoptions.index_group,
    self.parser,
    )

    self.parser.insert_option_group(0, index_opts)
    self.parser.insert_option_group(0, cmd_opts)

    def run(self, options, args):
    cmdoptions.resolve_wheel_no_use_binary(options)
    cmdoptions.check_install_build_global(options)

    with self._build_session(options) as session:
    finder = self._build_package_finder(options, session)

    # do what you please with the finder object here... ;)
    for pkg in args:
    logger.info(
    '%s: %s', pkg,
    ', '.join(
    sorted(
    set(str(c.version) for c in finder.find_all_candidates(pkg)),
    key=parse_version,
    )
    )
    )


    commands_dict[ListPkgVersionsCommand.name] = ListPkgVersionsCommand

    if __name__ == '__main__':
    sys.exit(main())