| # 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." | |
| ) |