Skip to content

Instantly share code, notes, and snippets.

@leibowitz
Created December 24, 2021 12:26
Show Gist options
  • Save leibowitz/a6e843e107a6101fc9c32c272b9d855f to your computer and use it in GitHub Desktop.
Save leibowitz/a6e843e107a6101fc9c32c272b9d855f to your computer and use it in GitHub Desktop.

Revisions

  1. leibowitz created this gist Dec 24, 2021.
    67 changes: 67 additions & 0 deletions get-packages.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,67 @@
    import argparse
    import pkg_resources
    from datetime import datetime
    from distutils.version import LooseVersion

    import requests
    from packaging.version import LegacyVersion
    from packaging.specifiers import SpecifierSet


    def get_release_date(version):
    if not version:
    return None
    time = version[0]['upload_time']
    return datetime.fromisoformat(time)


    def release_date_string(d):
    return 'Release date: {}'.format(d.strftime('%d/%m/%Y'))


    def release_str(version):
    d = get_release_date(version)
    if d:
    return release_date_string(d)
    return


    def get_latest(versions):
    versions.sort(reverse=True)
    for v in versions:
    if v.pre:
    continue
    return v


    parser = argparse.ArgumentParser()
    parser.add_argument("filename")
    args = parser.parse_args()

    with open(args.filename) as f:
    requirements = pkg_resources.parse_requirements(f.read())

    for r in requirements:
    print()
    print('package {}'.format(r.name))
    rsp = requests.get("https://pypi.org/pypi/{}/json".format(r.name))
    if rsp:
    response = rsp.json()
    versions = list(response["releases"].keys())
    if not versions:
    continue
    latest_version = get_latest([LegacyVersion(v) for v in versions])
    release = release_str(response["releases"][str(latest_version)])
    print('Latest: {} {}'.format(latest_version, release))
    if r.specifier:
    s = r.specifier
    filtered_versions = s.filter(versions)
    selected = list(filtered_versions)
    if selected:
    release = release_str(response["releases"][str(selected[0])])
    print('Current: {} {}'.format(selected[0], release))
    continue

    release = release_str(response["releases"][str(versions[0])])
    print('Current: {} {}'.format(versions[0], release))

    2 changes: 2 additions & 0 deletions requirements.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,2 @@
    requests
    packaging