import os import subprocess import sys import requests from pathlib import Path import json import time APP_PATH = os.path.dirname(sys.executable) if getattr(sys, 'frozen', False) else os.path.dirname(__file__) class ApplicationApi: def __init__(self, api_url: str, api_key: str, application_name: str): self.api_url = api_url self.api_key = api_key self.application_name = application_name def method(self, http_method: str, method: str, data=None, files=None) -> dict: url = self.api_url + f'/{self.application_name}/{method}' headers = {'Authorization': self.api_key} return requests.request(http_method, url, headers=headers, data=data, files=files).json() def get_current_version(self): response = self.method('GET', 'version') return response.get('latest_version') def upload(self, version: str, file_path: str): data = {'version': version} files = {'file': open(file_path, 'rb')} return self.method('POST', 'upload', data=data, files=files) def find_latest_modified_file(path, file_extension='*.py'): """ Находит файл с самой поздней датой изменения в указанной директории. """ app_path = Path(path) files = app_path.glob(file_extension) max_time_file = max(files, key=lambda file: file.stat().st_atime, default=None) return max_time_file def parse_version(version_str): """Преобразует строку версии в кортеж чисел.""" return tuple(map(int, version_str.split('.'))) def is_valid_version(new_version, current_version): """Проверяет, является ли новая версия больше текущей.""" return parse_version(new_version) > parse_version(current_version) def prompt_new_version(current_version, app_name): print(f"Current version of {app_name} is \"{current_version}\".") print("Please specify the new version (greater than current) in the format: major.minor.patch (e.g., 1.2.3)") while True: new_version = input("New version: ") if new_version and is_valid_version(new_version, current_version): return new_version else: print("Invalid version, it must be greater than the current version. Please try again.") def update_version_in_expo(version: str): file_path = os.path.join(APP_PATH, 'app.json') with open(file_path, 'r+') as config_file: data = json.loads(config_file.read()) data['expo']['version'] = version config_file.seek(0) config_file.write(json.dumps(data, indent=2, ensure_ascii=False)) def main(): API_URL = 'http://192.168.1.101:5000/application' API_KEY = 'AF9A20DD9264C134CDA0ADACED834368' APPLICATION_NAME = 'assemblr' BUILD_COMMAND = 'eas build -p android --profile preview --local' application_api = ApplicationApi(api_url=API_URL, api_key=API_KEY, application_name=APPLICATION_NAME) current_version = application_api.get_current_version() new_version = prompt_new_version(current_version, APPLICATION_NAME) update_version_in_expo(new_version) print('Starting building...') subprocess.run(BUILD_COMMAND, shell=True, text=True, capture_output=False) print('Build ended successfully.') apk_file = find_latest_modified_file(APP_PATH, '*.apk') if not apk_file: print(f'Failed to find the update APK file in the directory: {APP_PATH}') return # Получение времени последней модификации файла last_modified_time = apk_file.stat().st_atime formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(last_modified_time)) print(f'The APK file "{apk_file.name}" was last modified on: {formatted_time}') # Запрос подтверждения у пользователя user_confirmation = input("Are you sure you want to upload this update? (yes/no): ") if user_confirmation.lower() != 'yes': print("Upload cancelled.") return upload_response = application_api.upload(new_version, str(apk_file)) error = upload_response.get('error') if error: print(f"Error occurred while trying to upload the update: {error}") return filename = upload_response.get('filename') version = upload_response.get('version') print(f"Update version '{version}' successfully uploaded. File name: '{filename}'.") if __name__ == '__main__': main()