Source code for pyrcareworld.entry_points

import os
import sys
import tempfile
import zipfile
from sys import platform
import argparse
import requests
import pyrcareworld
from pyrcareworld.utils.version import Version


[docs] def pyrcareworld_entry_points(): print("pyrcareworld entry points") parser = argparse.ArgumentParser(description='rcareworld entry points') subparsers = parser.add_subparsers(dest='command', help='download/etc') parser_download = subparsers.add_parser('download', help='Download rcareworld release') parser_download.add_argument('-s', '--savepath', type=str, help='rcareworld release save path') parser_download.add_argument('-v', '--version', type=str, help='rcareworld release Version') args = parser.parse_args() if args.command == 'download': download(args)
[docs] def download(args): if args.savepath is None: save_path = os.path.expanduser(r"~/rcareworld") else: save_path = args.savepath releases_url = f"https://api.github.com/repos/empriselab/RCareWorld/releases" response = requests.get(releases_url) releases = response.json() last_version = None if args.version is None: current_version = Version(pyrcareworld.__version__) for i in releases: if "v" not in i["tag_name"] and "." not in i["tag_name"]: continue version = Version(i["tag_name"].replace("v", "")) if version[0] == current_version[0] and version[1] == current_version[1] and version[2] == current_version[2]: if last_version is None: last_version = version elif version[3] > current_version[3]: last_version = version else: current_version = Version(args.version) for i in releases: if "v" not in i["tag_name"] and "." not in i["tag_name"]: continue version = Version(i["tag_name"].replace("v", "")) if version == current_version: last_version = version if last_version is None: print("No available version found") return if platform == "win32": platform_string = "Windows" suffix = ".exe" elif platform == "linux": platform_string = "Linux" suffix = ".x86_64" else: raise EnvironmentError(f"Unsupported systems: {platform}") download_url = None for i in releases: if i["tag_name"] == f"v{last_version}": for asset in i["assets"]: if platform_string in asset["name"]: download_url = asset["browser_download_url"] download_size = asset["size"] break break if download_url is None: print("No available version found") return temp_path = os.path.join(tempfile.gettempdir(), "temp_rfu_release.zip") with requests.get(download_url, stream=True) as response: print(f"Downloading: {download_url}") print(f"---") length = 0 with open(temp_path, 'wb') as f: for chunk in response.iter_content(chunk_size=1024000): length = length + 1024000 f.write(chunk) sys.stdout.write("\033[F") sys.stdout.write("\033[K") print(f"{length}/{download_size}---{int(length * 100 / download_size)}%") os.makedirs(save_path, exist_ok=True) with zipfile.ZipFile(temp_path, 'r') as zipObject: zipObject.extractall(save_path) folder_name = os.path.splitext(os.path.basename(download_url))[0] folder_path = os.path.join(save_path, folder_name) print(fr"Unzip Done: {folder_path}") executable_file = os.path.abspath(os.path.join(folder_path, f"RCareWorld{suffix}")) pyrcareworld.config["executable_file"] = executable_file pyrcareworld.save_config(pyrcareworld.config) if platform == "linux": os.system(f"chmod +x {executable_file}") print(fr"Write config executable_file: {executable_file}")