diff --git a/app.json b/app.json index fa64b4a..404fbeb 100644 --- a/app.json +++ b/app.json @@ -12,7 +12,7 @@ ], "name": "Assemblr", "slug": "Assemblr", - "version": "1.0.0", + "version": "1.1.7", "orientation": "portrait", "icon": "./src/assets/icon.png", "userInterfaceStyle": "light", @@ -46,4 +46,4 @@ } } } -} +} \ No newline at end of file diff --git a/build.py b/build.py new file mode 100644 index 0000000..106e0ee --- /dev/null +++ b/build.py @@ -0,0 +1,114 @@ +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': file_path} + 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()