from JJMumbleBot.lib.utils.print_utils import rprint, dprint from JJMumbleBot.lib.resources.strings import L_DEPENDENCIES from requests import get from subprocess import call import pkg_resources import sys def check_pypi_version(package_name): resp = get(f"https://pypi.org/pypi/{package_name}/json") if resp is not None: data = resp.json() return data['info']['version'] return None def update_package(package_name, pip_cmd): if call([sys.executable, '-m', pip_cmd, 'install', '--upgrade', package_name]) == 0: return True return False def update_available(package_name): packages = [dist.project_name for dist in pkg_resources.working_set] if package_name not in packages: dprint(f"The package: [{package_name}] is not a dependency of this software.", origin=L_DEPENDENCIES) return None vers = check_pypi_version(package_name) if vers is not None: dprint(f"{package_name} available: {vers}", origin=L_DEPENDENCIES) dprint(f"{package_name} current: {pkg_resources.get_distribution(package_name).version}", origin=L_DEPENDENCIES) if vers != pkg_resources.get_distribution(package_name).version: dprint(f"There is a newer version of: [{package_name}({vers})] available.", origin=L_DEPENDENCIES) return True return False def check_and_update(package_name, pip_cmd): vers = check_pypi_version(package_name) if vers != pkg_resources.get_distribution(package_name).version: dprint(f"There is a newer version of: [{package_name}({vers})] available. Updating...", origin=L_DEPENDENCIES) if update_package(package_name, pip_cmd): return vers return None