# Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import time import pathlib import pkg_resources import packaging.version import requests def _get_pypi_version(package_name: str) -> str: r = requests.get(f"https://pypi.org/pypi/{package_name}/json") r.raise_for_status() return r.json()["info"]["version"] def _only_once_pls(package_name: str) -> bool: flag = pathlib.Path.home() / ".cache" / f"update-check-{package_name}" if not flag.exists(): flag.parent.mkdir(parents=True, exist_ok=True) flag.touch() return True last_check = flag.stat().st_mtime one_day_in_seconds = 60 * 60 * 24 if last_check < time.time() - one_day_in_seconds: flag.touch() return True else: return False def check_for_updates(package_name: str, print=print) -> None: if not _only_once_pls(package_name): return current_version = packaging.version.Version( pkg_resources.get_distribution(package_name).version ) pypi_version = packaging.version.Version(_get_pypi_version(package_name)) if current_version >= pypi_version: return print( f"{package_name} has a newer version available. Current version is " f"{current_version}, newest is {pypi_version}. Run `python3 -m pip " f"install --upgrade {package_name}` to update." )