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))