This commit is contained in:
Vinícius Moreira
2020-04-13 11:49:28 -03:00
parent 83aab1ff55
commit 01a60ea686
165 changed files with 12778 additions and 6171 deletions

3
bauh/cli/__init__.py Normal file
View File

@@ -0,0 +1,3 @@
from bauh import __app_name__
__app_name__ = '{}-cli'.format(__app_name__)

56
bauh/cli/app.py Normal file
View File

@@ -0,0 +1,56 @@
import os
import urllib3
from bauh import ROOT_DIR
from bauh.api.abstract.context import ApplicationContext
from bauh.api.http import HttpClient
from bauh.cli import __app_name__, cli_args
from bauh.cli.controller import CLIManager
from bauh.view.core import config, gems
from bauh.view.core.controller import GenericSoftwareManager
from bauh.view.core.downloader import AdaptableFileDownloader
from bauh.view.util import logs, util
from bauh.view.util.cache import DefaultMemoryCacheFactory
from bauh.view.util.disk import DefaultDiskCacheLoaderFactory
from bauh.view.util.translation import I18n
def main():
if not os.getenv('PYTHONUNBUFFERED'):
os.environ['PYTHONUNBUFFERED'] = '1'
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
args = cli_args.read()
logger = logs.new_logger(__app_name__, False)
app_config = config.read_config(update_file=True)
http_client = HttpClient(logger)
empty_i18n = I18n('en', {}, 'en', {})
cache_factory = DefaultMemoryCacheFactory(expiration_time=0)
context = ApplicationContext(i18n=empty_i18n,
http_client=http_client,
download_icons=bool(app_config['download']['icons']),
app_root_dir=ROOT_DIR,
cache_factory=cache_factory,
disk_loader_factory=DefaultDiskCacheLoaderFactory(logger),
logger=logger,
distro=util.get_distro(),
file_downloader=AdaptableFileDownloader(logger, bool(app_config['download']['multithreaded']),
empty_i18n, http_client),
app_name=__app_name__)
managers = gems.load_managers(context=context, locale=empty_i18n.current_key, config=app_config, default_locale='en')
cli = CLIManager(GenericSoftwareManager(managers, context=context, config=app_config))
if args.command == 'updates':
cli.list_updates(args.format)
if __name__ == '__main__':
main()

15
bauh/cli/cli_args.py Normal file
View File

@@ -0,0 +1,15 @@
import argparse
from argparse import Namespace
from bauh import __app_name__, __version__
def read() -> Namespace:
parser = argparse.ArgumentParser(prog='{}-cli'.format(__app_name__), description="CLI for Linux software management")
parser.add_argument('-v', '--version', action='version', version='%(prog)s {}'.format(__version__))
sub_parsers = parser.add_subparsers(dest='command', help='commands')
updates_parser = sub_parsers.add_parser('updates', help='List available software updates')
updates_parser.add_argument('-f', '--format', help='Command output format. Default: %(default)s', choices=['text', 'json'], default='text')
return parser.parse_args()

30
bauh/cli/controller.py Normal file
View File

@@ -0,0 +1,30 @@
import json
from bauh.cli import __app_name__
from bauh.view.core.controller import GenericSoftwareManager
class CLIManager:
def __init__(self, manager: GenericSoftwareManager):
self.manager = manager
def _print(self, msg: str):
print('[{}] {}'.format(__app_name__, msg))
def list_updates(self, output_format: str):
updates = self.manager.list_updates()
json_output = output_format == 'json'
if not updates and not json_output:
self._print('No updates available')
return
if not json_output:
self._print('There are {} updates available:\n'.format(len(updates)))
for idx, u in enumerate(updates):
print('{}. Name: {}\tVersion: {}\tType: {}'.format(idx+1, u.name, u.version, u.type))
else:
print(json.dumps([u.__dict__ for u in updates]))