from __future__ import absolute_import, division, print_function import json import os import requests from ..backend_api.session import Session from ..backend_config import EnvEntry from .version import Version class CheckPackageUpdates(object): _package_version_checked = False @classmethod def check_new_package_available(cls, only_once=False): """ :return: true if there is a newer package in PyPI """ if only_once and cls._package_version_checked: return None # noinspection PyBroadException try: cls._package_version_checked = True client, version = Session._client[0] version = Version(version) is_demo = 'https://demoapi.trains.allegro.ai/'.startswith(Session.get_api_server_host()) update_server_releases = requests.get( 'https://updates.trains.allegro.ai/updates', json={"demo": is_demo, "versions": {c: str(v) for c, v in Session._client}, "CI": str(os.environ.get('CI', ''))}, timeout=3.0 ) if update_server_releases.ok: update_server_releases = update_server_releases.json() else: return None client_answer = update_server_releases.get(client, {}) if "version" not in client_answer: return None # do not output upgrade message if we are running inside a CI process. if EnvEntry("CI", type=bool, ignore_errors=True).get(): return None latest_version = Version(client_answer["version"]) if version >= latest_version: return None not_patch_upgrade = latest_version.release[:2] == version.release[:2] return str(latest_version), not_patch_upgrade, client_answer.get("description").split("\r\n") except Exception: return None @staticmethod def get_version_from_updates_server(cur_version): """ Get the latest version for trains from updates server :param cur_version: The current running version of trains :type cur_version: Version """ try: _ = requests.get('https://updates.trains.allegro.ai/updates', data=json.dumps({"versions": {"trains": str(cur_version)}}), timeout=1.0) return except Exception: pass