115 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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()
 |