import re import textwrap from collections import defaultdict from urllib import request def get_supported_versions(url): with request.urlopen(url) as response: response_content = response.read() content = response_content.decode("utf-8") def parse_supported_versions(content): def cut_by_content(content, cut_from, cut_to): return content.split(cut_from)[1].split(cut_to)[0] def keys_from_content(content): return re.findall(r"(.*?)", content) content = cut_by_content( content, '', "", ) content = cut_by_content(content, '', "") versions = keys_from_content(content) version_dict = dict(zip(versions[::2], versions[1::2])) django_to_python = { version_to_tuple(python_version): [ version_to_tuple(version_string) for version_string in re.findall( r"(?={b},<{c}" for a, b, c in lines] return "deps = \n" + textwrap.indent("\n".join(lines), prefix=" ") def build_pypi_classifiers(python_to_django): classifiers = [] all_python_versions = python_to_django.keys() for python_version in all_python_versions: classifiers.append( f"Programming Language :: Python :: {env_format(python_version, divider='.')}" ) all_django_versions = set() for django_versions in python_to_django.values(): for django_version in django_versions: all_django_versions.add(django_version) classifiers.append("...") for django_version in all_django_versions: classifiers.append( f"Programming Language :: Django :: {env_format(django_version, divider='.')}" ) return "classifiers=[\n" + textwrap.indent( "\n".join(classifiers), prefix=" " ) def build_readme(python_to_django): print( textwrap.dedent( """\ | Python version | Django version | |----------------|--------------------------| """.rstrip() ) ) lines = [ ( env_format(python_version, divider="."), ", ".join( env_format(version, divider=".") for version in django_versions ), ) for python_version, django_versions in python_to_django.items() ] lines = [f"| {a: <14} | {b: <24} |" for a, b in lines] version_lines = "\n".join([version for version in lines]) return version_lines def main(): django_to_python = get_supported_versions( "https://docs.djangoproject.com/en/dev/faq/install/" ) latest_version = get_latest_version( "https://www.djangoproject.com/download/" ) python_to_django = build_python_to_django(django_to_python, latest_version) tox_envlist = build_tox_envlist(python_to_django) print("Add this to tox.ini:\n") print("[tox]") print(tox_envlist) print() gh_actions_envlist = build_gh_actions_envlist(python_to_django) print("[gh-actions]") print(gh_actions_envlist) print() deps_envlist = build_deps_envlist(python_to_django) print("[testenv]") print(deps_envlist) print() print() print("Add this to setup.py:\n") pypi_classifiers = build_pypi_classifiers(python_to_django) print(pypi_classifiers) print() print() print("Add this to README:\n") readme = build_readme(python_to_django) print(readme) print() if __name__ == "__main__": main()