ayon-core/tools/get_python_packages_info.py
2022-09-14 11:36:10 +02:00

83 lines
2.4 KiB
Python

# -*- coding: utf-8 -*-
"""Get version and license information on used Python packages.
This is getting over all packages installed with Poetry and printing out
their name, version and available license information from PyPi in Markdown
table format.
Usage:
./.poetry/bin/poetry run python ./tools/get_python_packages_info.py
"""
import toml
import requests
packages = []
# define column headers
package_header = "Package"
version_header = "Version"
license_header = "License"
name_col_width = len(package_header)
version_col_width = len(version_header)
license_col_width = len(license_header)
# read lock file to get packages
with open("poetry.lock", "r") as fb:
lock_content = toml.load(fb)
for package in lock_content["package"]:
# query pypi for license information
url = f"https://pypi.org/pypi/{package['name']}/json"
response = requests.get(
f"https://pypi.org/pypi/{package['name']}/json")
package_data = response.json()
version = package.get("version") or "N/A"
try:
package_license = package_data["info"].get("license") or "N/A"
except KeyError:
package_license = "N/A"
if len(package_license) > 64:
package_license = f"{package_license[:32]}..."
packages.append(
(
package["name"],
version,
package_license
)
)
# update column width based on max string length
if len(package["name"]) > name_col_width:
name_col_width = len(package["name"])
if len(version) > version_col_width:
version_col_width = len(version)
if len(package_license) > license_col_width:
license_col_width = len(package_license)
# pad columns
name_col_width += 2
version_col_width += 2
license_col_width += 2
# print table header
print((f"|{package_header.center(name_col_width)}"
f"|{version_header.center(version_col_width)}"
f"|{license_header.center(license_col_width)}|"))
print(
"|" + ("-" * len(package_header.center(name_col_width))) +
"|" + ("-" * len(version_header.center(version_col_width))) +
"|" + ("-" * len(license_header.center(license_col_width))) + "|")
# print rest of the table
for package in packages:
print((
f"|{package[0].center(name_col_width)}"
f"|{package[1].center(version_col_width)}"
f"|{package[2].center(license_col_width)}|"
))