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.
Packages versions
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))
requests
packaging
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment