2024-01-01 19:48:57 +03:00
|
|
|
from os import environ
|
|
|
|
import requests
|
|
|
|
from functools import cached_property
|
|
|
|
from importlib.metadata import version as get_package_version, PackageNotFoundError
|
|
|
|
from subprocess import check_output, CalledProcessError, PIPE
|
|
|
|
from .errors import VersionNotFoundError
|
|
|
|
|
2024-01-14 09:45:41 +03:00
|
|
|
def get_pypi_version(package_name: str) -> str:
|
|
|
|
"""
|
|
|
|
Get the latest version of a package from PyPI.
|
|
|
|
|
|
|
|
:param package_name: The name of the package.
|
|
|
|
:return: The latest version of the package as a string.
|
|
|
|
"""
|
2024-01-13 17:37:36 +03:00
|
|
|
try:
|
2024-01-14 09:45:41 +03:00
|
|
|
response = requests.get(f"https://pypi.org/pypi/{package_name}/json").json()
|
2024-01-13 17:37:36 +03:00
|
|
|
return response["info"]["version"]
|
2024-01-14 09:45:41 +03:00
|
|
|
except requests.RequestException as e:
|
|
|
|
raise VersionNotFoundError(f"Failed to get PyPI version: {e}")
|
|
|
|
|
|
|
|
def get_github_version(repo: str) -> str:
|
|
|
|
"""
|
|
|
|
Get the latest release version from a GitHub repository.
|
|
|
|
|
|
|
|
:param repo: The name of the GitHub repository.
|
|
|
|
:return: The latest release version as a string.
|
|
|
|
"""
|
|
|
|
try:
|
|
|
|
response = requests.get(f"https://api.github.com/repos/{repo}/releases/latest").json()
|
2024-01-13 17:37:36 +03:00
|
|
|
return response["tag_name"]
|
2024-01-14 09:45:41 +03:00
|
|
|
except requests.RequestException as e:
|
|
|
|
raise VersionNotFoundError(f"Failed to get GitHub release version: {e}")
|
|
|
|
|
|
|
|
def get_latest_version():
|
|
|
|
"""
|
|
|
|
Get the latest release version from PyPI or the GitHub repository.
|
2024-01-01 19:48:57 +03:00
|
|
|
|
2024-01-14 09:45:41 +03:00
|
|
|
:return: The latest release version as a string.
|
|
|
|
"""
|
|
|
|
try:
|
|
|
|
# Is installed via package manager?
|
|
|
|
get_package_version("g4f")
|
|
|
|
return get_pypi_version("g4f")
|
|
|
|
except PackageNotFoundError:
|
|
|
|
# Else use Github version:
|
|
|
|
return get_github_version("xtekky/gpt4free")
|
|
|
|
|
|
|
|
class VersionUtils:
|
|
|
|
"""
|
|
|
|
Utility class for managing and comparing package versions.
|
|
|
|
"""
|
2024-01-01 19:48:57 +03:00
|
|
|
@cached_property
|
|
|
|
def current_version(self) -> str:
|
2024-01-14 09:45:41 +03:00
|
|
|
"""
|
|
|
|
Get the current version of the g4f package.
|
|
|
|
|
|
|
|
:return: The current version as a string.
|
|
|
|
"""
|
2024-01-01 19:48:57 +03:00
|
|
|
# Read from package manager
|
|
|
|
try:
|
|
|
|
return get_package_version("g4f")
|
|
|
|
except PackageNotFoundError:
|
|
|
|
pass
|
2024-01-14 09:45:41 +03:00
|
|
|
|
2024-01-01 19:48:57 +03:00
|
|
|
# Read from docker environment
|
|
|
|
version = environ.get("G4F_VERSION")
|
|
|
|
if version:
|
|
|
|
return version
|
2024-01-14 09:45:41 +03:00
|
|
|
|
2024-01-01 19:48:57 +03:00
|
|
|
# Read from git repository
|
|
|
|
try:
|
|
|
|
command = ["git", "describe", "--tags", "--abbrev=0"]
|
|
|
|
return check_output(command, text=True, stderr=PIPE).strip()
|
|
|
|
except CalledProcessError:
|
|
|
|
pass
|
2024-01-14 09:45:41 +03:00
|
|
|
|
2024-01-01 19:48:57 +03:00
|
|
|
raise VersionNotFoundError("Version not found")
|
2024-01-14 09:45:41 +03:00
|
|
|
|
2024-01-01 19:48:57 +03:00
|
|
|
@cached_property
|
|
|
|
def latest_version(self) -> str:
|
2024-01-14 09:45:41 +03:00
|
|
|
"""
|
|
|
|
Get the latest version of the g4f package.
|
|
|
|
|
|
|
|
:return: The latest version as a string.
|
|
|
|
"""
|
2024-01-13 17:37:36 +03:00
|
|
|
return get_latest_version()
|
2024-01-14 09:45:41 +03:00
|
|
|
|
2024-01-13 17:37:36 +03:00
|
|
|
def check_version(self) -> None:
|
2024-01-14 09:45:41 +03:00
|
|
|
"""
|
|
|
|
Check if the current version is up to date with the latest version.
|
|
|
|
"""
|
2024-01-01 19:48:57 +03:00
|
|
|
try:
|
|
|
|
if self.current_version != self.latest_version:
|
2024-01-13 17:37:36 +03:00
|
|
|
print(f'New g4f version: {self.latest_version} (current: {self.current_version}) | pip install -U g4f')
|
2024-01-01 19:48:57 +03:00
|
|
|
except Exception as e:
|
2024-01-13 17:37:36 +03:00
|
|
|
print(f'Failed to check g4f version: {e}')
|
2024-01-14 09:45:41 +03:00
|
|
|
|
2024-01-01 19:48:57 +03:00
|
|
|
utils = VersionUtils()
|