From d73004270d570f60d42a963b36046294999745cc Mon Sep 17 00:00:00 2001 From: codeking Date: Sat, 21 Sep 2024 00:03:41 +0200 Subject: [PATCH] Update the reference implementation --- README.md | 38 +++++++++++++++++++++-- main.py | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 124 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 47cedb9..dc7b9e4 100644 --- a/README.md +++ b/README.md @@ -37,10 +37,10 @@ python3 main.py get connection ```bash # Example 1 -python3 main.py set connection system +python3 main.py set connection 'system' # Example 2 -python3 main.py set connection tor +python3 main.py set connection 'tor' ``` ### Sync @@ -111,6 +111,40 @@ python3 main.py profile disable -i 4 python3 main.py profile disable -i 4 -f ``` +### Applications + +#### List Applications + +```bash +# Example 1 +python3 main.py application list + +# Example 2 +python3 main.py application list -c 'firefox' +``` + +#### Show Application + +```bash +python3 main.py application show -a 'chromium:122.0.6261.94-1' +``` + +#### Install Application + +```bash +# Install (halt in case the application is already installed). +python3 main.py application install -a 'firefox:123.0' + +# Install (reinstall the application if it already exists). +python3 main.py application install -a 'firefox:123.0' -r +``` + +#### Uninstall Application + +```bash +python3 main.py application uninstall -a 'brave:1.63.165' +``` + ### Version Information ```bash diff --git a/main.py b/main.py index 3d914c2..711c2e4 100644 --- a/main.py +++ b/main.py @@ -9,6 +9,7 @@ from core.controllers.LocationController import LocationController from core.controllers.ProfileController import ProfileController from core.controllers.SubscriptionController import SubscriptionController from core.controllers.SubscriptionPlanController import SubscriptionPlanController +from core.models.session.Application import Application from core.models.session.SessionConnection import SessionConnection from core.models.session.SessionProfile import SessionProfile from core.models.system.SystemConnection import SystemConnection @@ -19,8 +20,10 @@ from core.observers.ConnectionObserver import ConnectionObserver from core.observers.InvoiceObserver import InvoiceObserver from core.observers.ProfileObserver import ProfileObserver from pathlib import Path +from typing import Optional import argparse import pprint +import re if __name__ == '__main__': @@ -46,6 +49,18 @@ if __name__ == '__main__': profile_observer.subscribe('disabled', lambda event: pprint.pp((event.subject, 'Disabled')) if event.meta.get('explicitly') else None) profile_observer.subscribe('enabled', lambda event: pprint.pp((event.subject, 'Enabled'))) + def __parse_application_string(application_string: Optional[str] = None): + + if application_string is None: + return dict(application_code='', version_number='') + + parsed_application_string = re.match('^(?P.*?):(?P.*?)$', application_string) + + if parsed_application_string is None: + return dict(application_code='', version_number='') + else: + return parsed_application_string.groupdict() + pristine_parser = argparse.ArgumentParser(add_help=False) pristine_parser.add_argument('--pristine', '-p', action='store_true') @@ -89,6 +104,22 @@ if __name__ == '__main__': profile_subparsers.add_parser('enable', parents=[profile_base_parser, pristine_parser, safe_parser]) profile_subparsers.add_parser('disable', parents=[profile_base_parser, safe_parser]) + application_parser = main_subparsers.add_parser('application') + application_subparsers = application_parser.add_subparsers(title='subcommands', dest='subcommand') + + application_base_parser = argparse.ArgumentParser(add_help=False) + application_base_parser.add_argument('--application', '-a', required=True) + + application_list_parser = application_subparsers.add_parser('list') + application_list_parser.add_argument('--code', '-c') + + application_show_parser = application_subparsers.add_parser('show', parents=[application_base_parser]) + + application_install_parser = application_subparsers.add_parser('install', parents=[application_base_parser]) + application_install_parser.add_argument('--reinstall', '-r', action='store_true') + + application_uninstall_parser = application_subparsers.add_parser('uninstall', parents=[application_base_parser]) + get_parser = main_subparsers.add_parser('get') get_subparsers = get_parser.add_subparsers(title='subcommands', dest='subcommand') @@ -127,11 +158,8 @@ if __name__ == '__main__': if arguments.profile_type == 'session': - if not arguments.application: - arguments.application = ':' - - application_details = arguments.application.split(':', 1) - application_version = ApplicationVersionController.get(application_details[0], application_details[1]) + application_details = __parse_application_string(arguments.application) + application_version = ApplicationVersionController.get(application_details.get('application_code'), application_details.get('version_number')) if application_version is None: main_parser.error('the following argument should be a valid reference: --application/-a') @@ -248,15 +276,70 @@ if __name__ == '__main__': else: main_parser.error('the following argument should be a valid reference: --id/-i') + elif arguments.command == 'application': + + if arguments.subcommand is None: + application_parser.print_help() + + if arguments.subcommand == 'list': + + if arguments.code: + + application = Application.find(arguments.code) + + if application is not None: + pprint.pp(ApplicationVersionController.get_all(application)) + else: + main_parser.error('the following argument should be a valid reference: --code/-c') + + else: + pprint.pp(ApplicationVersionController.get_all()) + + elif arguments.subcommand == 'show': + + application_details = __parse_application_string(arguments.application) + application_version = ApplicationVersionController.get(application_details.get('application_code'), application_details.get('version_number')) + + if application_version is not None: + pprint.pp(application_version) + else: + main_parser.error('the following argument should be a valid reference: --application/-a') + + elif arguments.subcommand == 'install': + + application_details = __parse_application_string(arguments.application) + application_version = ApplicationVersionController.get(application_details.get('application_code'), application_details.get('version_number')) + + if application_version is not None: + ApplicationVersionController.install(application_version, arguments.reinstall, application_version_observer=application_version_observer, connection_observer=connection_observer) + else: + main_parser.error('the following argument should be a valid reference: --application/-a') + + elif arguments.subcommand == 'uninstall': + + application_details = __parse_application_string(arguments.application) + application_version = ApplicationVersionController.get(application_details.get('application_code'), application_details.get('version_number')) + + if application_version is not None: + ApplicationVersionController.uninstall(application_version) + else: + main_parser.error('the following argument should be a valid reference: --application/-a') + elif arguments.command == 'sync': ClientController.sync(client_observer=client_observer, connection_observer=connection_observer) elif arguments.command == 'get': + if arguments.subcommand is None: + get_parser.print_help() + if arguments.subcommand == 'connection': print(ConfigurationController.get_connection()) elif arguments.command == 'set': + if arguments.subcommand is None: + set_parser.print_help() + if arguments.subcommand == 'connection': ConfigurationController.set_connection(arguments.connection_type)