"""
Entry into the program.
"""
import argparse
import logging
import sys
from argparse import ArgumentParser
from pathlib import Path
from unidown import static_data, tools
from unidown.core import manager
from unidown.core.settings import Settings
from unidown.plugin.a_plugin import APlugin
[docs]class PluginListAction(argparse.Action):
"""
Lists all plugins which are available. Extension for the argparser.
"""
def __init__(self, option_strings, dest, **kwargs):
super().__init__(option_strings, dest, nargs=0, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
tools.print_plugin_list(APlugin.get_plugins())
parser.exit()
[docs]def main(argv=None):
"""
Entry point into the program. Gets the arguments from the console and proceed them with :class:`~argparse.ArgumentParser`.
Returns if its success successful 0 else 1.
"""
if sys.version_info[0] < 3 or sys.version_info[1] < 8:
sys.exit('Only Python 3.8 or greater is supported. You are using:' + sys.version)
if argv is None:
argv = sys.argv[1:]
parser = ArgumentParser(prog=static_data.LONG_NAME, description=static_data.DESCRIPTION)
parser.add_argument('-v', '--version', action='version', version=f"{static_data.NAME} {static_data.VERSION}")
parser.add_argument('--list-plugins', action=PluginListAction, help="show plugin list and exit")
parser.add_argument('-p', '--plugin', dest='plugin', default="", type=str, required=True, metavar='name',
help='plugin to execute')
parser.add_argument('-o', '--option', action='append', nargs='+', dest='options', type=str, metavar='option',
help='options passed to the plugin, e.g. `-o username=South American coati -o password=Nasua Nasua`')
parser.add_argument('-r', '--root', dest='root_dir', default=None, type=str, metavar='path',
help='main directory where all files will be created (default: %(default)s)')
parser.add_argument('--logfile', dest='logfile', default=None, type=str, metavar='path',
help='log filepath relativ to the main dir (default: %(default)s)')
parser.add_argument('-l', '--log', dest='log_level', choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], default='INFO',
help='set the logging level (default: %(default)s)')
args = parser.parse_args(argv)
try:
root_dir = args.root_dir
if args.root_dir is not None:
root_dir = Path(args.root_dir)
log_file = args.logfile
if args.logfile is not None:
log_file = Path(args.logfile)
settings = Settings(root_dir, log_file, args.log_level)
settings.mkdir()
manager.init_logging(settings)
except PermissionError:
logging.critical('Cant create needed folders. Make sure you have write permissions.')
sys.exit(1)
except FileExistsError:
logging.exception("")
sys.exit(1)
except Exception:
logging.exception("Something went wrong")
sys.exit(1)
manager.check_update()
manager.run(settings, args.plugin, args.options)
manager.shutdown()
sys.exit(0)