Created
April 28, 2024 21:03
-
-
Save moyix/915b7bf7e3ef5117990020c32e519a97 to your computer and use it in GitHub Desktop.
Script to list the most recent version of a PyPI package released before a particular date
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import sys | |
import requests | |
from datetime import datetime, timezone | |
# Ok I'll be honest ChatGPT wrote the vast majority of this | |
# Use at your own risk | |
def get_latest_version_before_date(package_name, cutoff_date): | |
""" | |
Fetch the latest version of the package that was released before the specified cutoff_date. | |
Args: | |
package_name (str): The name of the package on PyPI. | |
cutoff_date (str): The cutoff date in ISO 8601 format (YYYY-MM-DD). | |
Returns: | |
str: The version of the latest release before the cutoff date or None if no release matches. | |
""" | |
# Convert cutoff_date to a datetime object for comparison | |
cutoff_datetime = datetime.fromisoformat(cutoff_date).replace(tzinfo=timezone.utc) | |
# Request package information from PyPI | |
response = requests.get(f'https://pypi.org/pypi/{package_name}/json') | |
if response.status_code != 200: | |
return None | |
data = response.json() | |
releases = data.get('releases', {}) | |
# Initialize variables to find the latest version before the cutoff date | |
latest_version = None | |
latest_release_date = datetime.min.replace(tzinfo=timezone.utc) | |
# Iterate over all versions and their releases | |
for version, release_info in releases.items(): | |
for release in release_info: | |
release_date = datetime.fromisoformat(release['upload_time_iso_8601'].replace('Z', '+00:00')) | |
# Check if this release is before the cutoff and after the last found release | |
if release_date < cutoff_datetime and release_date > latest_release_date: | |
latest_version = version | |
latest_release_date = release_date | |
return latest_version | |
# Example usage | |
cutoff_date = sys.argv[1] | |
for package_name in sys.argv[2:]: | |
latest_version = get_latest_version_before_date(package_name, cutoff_date) | |
print(f"{package_name}=={latest_version}") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment