Refactor function to list django versions

This commit is contained in:
Bruno Alla 2021-11-09 11:52:54 +00:00
parent d886e68af6
commit 1a962b5ad9

View File

@ -9,15 +9,13 @@ to keep up to date.
from __future__ import annotations from __future__ import annotations
import os import os
from typing import NamedTuple, Sequence, TYPE_CHECKING
import requests
import sys import sys
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING, Any, Iterable, NamedTuple
import requests
from github import Github from github import Github
if TYPE_CHECKING: if TYPE_CHECKING:
from github.Issue import Issue from github.Issue import Issue
@ -34,6 +32,7 @@ class DjVersion(NamedTuple):
Only keeps track on (major, minor) versions, excluding patches and pre-releases. Only keeps track on (major, minor) versions, excluding patches and pre-releases.
""" """
major: int major: int
minor: int minor: int
@ -49,6 +48,7 @@ class DjVersion(NamedTuple):
def get_package_info(package: str) -> dict: def get_package_info(package: str) -> dict:
"""Get package metadata using PyPI API."""
# "django" converts to "Django" on redirect # "django" converts to "Django" on redirect
r = requests.get(f"https://pypi.org/pypi/{package}/json", allow_redirects=True) r = requests.get(f"https://pypi.org/pypi/{package}/json", allow_redirects=True)
if not r.ok: if not r.ok:
@ -57,17 +57,18 @@ def get_package_info(package: str) -> dict:
return r.json() return r.json()
def get_package_versions(package_info: dict, reverse=True, *, include_pre=False): def get_django_versions() -> Iterable[DjVersion]:
# Mostly used for the Django check really... to get the latest """List all django versions."""
# package version, you could simple do get_package_info()["info"]["version"] django_package_info: dict[str, Any] = get_package_info("django")
releases: Sequence[str] = package_info["releases"].keys() releases = django_package_info["releases"].keys()
if not include_pre: for release_str in releases:
releases = [r for r in releases if r.replace(".", "").isdigit()] if release_str.replace(".", "").isdigit():
return sorted(releases, reverse=reverse) # Exclude pre-releases with non-numeric characters in version
yield DjVersion.parse(release_str)
def get_name_and_version(requirements_line: str) -> tuple[str, ...]: def get_name_and_version(requirements_line: str) -> tuple[str, ...]:
"""Get the name a verion of a package from a line in the requirement file.""" """Get the name a version of a package from a line in the requirement file."""
full_name, version = requirements_line.split(" ", 1)[0].split("==") full_name, version = requirements_line.split(" ", 1)[0].split("==")
name_without_extras = full_name.split("[", 1)[0] name_without_extras = full_name.split("[", 1)[0]
return name_without_extras, version return name_without_extras, version
@ -92,12 +93,10 @@ def get_all_latest_django_versions() -> tuple[DjVersion, list[DjVersion]]:
_, current_version_str = get_name_and_version(line) _, current_version_str = get_name_and_version(line)
# Get a tuple of (major, minor) - ignoring patch version # Get a tuple of (major, minor) - ignoring patch version
current_minor_version = DjVersion.parse(current_version_str) current_minor_version = DjVersion.parse(current_version_str)
all_django_versions = get_package_versions(get_package_info("django"))
newer_versions: set[DjVersion] = set() newer_versions: set[DjVersion] = set()
for version_str in all_django_versions: for django_version in get_django_versions():
released_minor_version = DjVersion.parse(version_str) if django_version > current_minor_version:
if released_minor_version > current_minor_version: newer_versions.add(django_version)
newer_versions.add(released_minor_version)
return current_minor_version, sorted(newer_versions, reverse=True) return current_minor_version, sorted(newer_versions, reverse=True)