diff --git a/code/golang/internal/setup/cli/cli.go b/code/golang/internal/setup/cli/cli.go index 1804170..20e850d 100644 --- a/code/golang/internal/setup/cli/cli.go +++ b/code/golang/internal/setup/cli/cli.go @@ -68,7 +68,10 @@ var optionsConfigFile = argparse.Options{ // Parst cli flags. func ParseCli(args []string) (*types.CliArguments, error) { var err error - Parser = argparse.NewParser("cli parser", "Liest Optionen + Flags von Kommandozeile.") + Parser = argparse.NewParser( + "cli parser", + "\033[93;2mEin Programm zur Ausführung verschiedener Algorithmen aus dem Kurs AlgoDat I.\033[0m", + ) arguments := types.CliArguments{ ModeHelp: Parser.NewCommand("help", "Hilfsanleitung anzeigen"), ModeVersion: Parser.NewCommand("version", "Version anzeigen."), diff --git a/code/golang/internal/setup/setup_assets.go b/code/golang/internal/setup/setup_assets.go index 106b7f0..5b45e54 100644 --- a/code/golang/internal/setup/setup_assets.go +++ b/code/golang/internal/setup/setup_assets.go @@ -38,7 +38,7 @@ func ReadAsset(key string) string { } /* ---------------------------------------------------------------- * - * METHODS templates + * METHODS assets * ---------------------------------------------------------------- */ func Help() string { diff --git a/code/golang/main.go b/code/golang/main.go index d08dbbe..71daa9d 100644 --- a/code/golang/main.go +++ b/code/golang/main.go @@ -38,9 +38,11 @@ var ( * ---------------------------------------------------------------- */ func main() { - var err error var arguments *types.CliArguments var ( + err1 error + err2 error + err3 error cmdMissing bool showChecks bool ) @@ -50,12 +52,12 @@ func main() { setup.Assets = assets // cli arguments parsen - arguments, err = cli.ParseCli(os.Args) - cmdMissing = cli.ParseCliCommandMissing(err) + arguments, err1 = cli.ParseCli(os.Args) + cmdMissing = cli.ParseCliCommandMissing(err1) - // initialisiere basic optionen wie Logging + // Programmeinstellungen initialisieren showChecks = false - if err == nil { + if err1 == nil { if !(arguments.ModeRun.Happened() && arguments.InteractiveMode()) { logging.SetQuietMode(arguments.QuietModeOn()) logging.SetDebugMode(arguments.DebugModeOn()) @@ -63,34 +65,39 @@ func main() { logging.SetAnsiMode(arguments.ShowColour()) showChecks = arguments.ShowChecks() } - - // app config (intern) intialisieren - err = setup.AppConfigInitialise() + err2 = setup.AppConfigInitialise() setup.SetAppConfigPerformChecks(showChecks) - if err == nil { - if arguments.ModeVersion.Happened() { - endpoints_print.Version() - return - } else if arguments.ModeRun.Happened() { - if arguments.InteractiveMode() { - endpoints_run.RunInteractive() - } else { - err = endpoints_run.RunNonInteractive(arguments.GetConfigFile()) - if err != nil { - logging.Fatal(err) - } - } - return - } else if arguments.ModeHelp.Happened() { - endpoints_print.Help() - return - } else { - endpoints_run.RunInteractive() - } - } else if cmdMissing { + // Fehler melden (fatal) + if err1 != nil && !cmdMissing { + logging.Fatal(err1) + } + if err2 != nil { + logging.Fatal(err2) + } + // Wenn der Artefakt ohne Argument aufgerufen wird, keinen Fehler melden, sondern im it-Modus ausführen + if cmdMissing { endpoints_run.RunInteractive() + return + } + // Sonst Commands behandeln + if arguments.ModeHelp.Happened() { + endpoints_print.Help() + return + } else if arguments.ModeVersion.Happened() { + endpoints_print.Version() + return + } else if arguments.ModeRun.Happened() { + if arguments.InteractiveMode() { + endpoints_run.RunInteractive() + } else { + err3 = endpoints_run.RunNonInteractive(arguments.GetConfigFile()) + if err3 != nil { + logging.Fatal(err3) + } + } + return } else { - logging.Fatal(err) + endpoints_run.RunInteractive() } } diff --git a/code/python/src/__main__.py b/code/python/src/__main__.py index 02b2a5e..b766d44 100644 --- a/code/python/src/__main__.py +++ b/code/python/src/__main__.py @@ -17,6 +17,7 @@ import sys; sys.path.insert(0, os.path.abspath(os.path.join(os.path.abspath(__file__), '..'))); from src.setup.cli import *; +from src.endpoints.exports import *; from src.main import enter; # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -24,10 +25,18 @@ from src.main import enter; # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if __name__ == '__main__': - sys.tracebacklimit = 0; sys.tracebacklimit = 0; try: - args = GetArgumentsFromCli(sys.argv[1:]); + args = GetArgumentsFromCli(*sys.argv[1:]); except: + endpoint_help(); exit(1); - enter(quiet=args.quiet, debug=args.debug, mode=args.mode[0], path=args.path); + enter( + mode=args.mode, + it=args.it, + quiet=args.quiet, + debug=args.debug, + checks=args.checks, + colour=args.colour, + config=args.config, + ); diff --git a/code/python/src/endpoints/print.py b/code/python/src/endpoints/print.py index 42a9c8d..3241c88 100644 --- a/code/python/src/endpoints/print.py +++ b/code/python/src/endpoints/print.py @@ -6,17 +6,14 @@ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ from src.core.log import *; -from src.setup.cli import GetArgumentsFromCli; -from src.setup.cli import GetArgumentParser; +from src.setup import assets; # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ENDPOINT version # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def version(): - with open('assets/VERSION', 'r') as fp: - version = ('\n'.join(fp.readlines())).strip(); - logPlain(version); + logPlain(assets.Version()); return; # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -24,6 +21,5 @@ def version(): # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def help(): - parser = GetArgumentParser(); - parser.print_help(); + logPlain(assets.Help()); return; diff --git a/code/python/src/endpoints/run.py b/code/python/src/endpoints/run.py index d1fa065..54ab1c4 100644 --- a/code/python/src/endpoints/run.py +++ b/code/python/src/endpoints/run.py @@ -8,6 +8,7 @@ from src.core.log import *; from src.core.config import *; from src.setup.display import *; +from src.setup import assets; from src.algorithms.exports import *; # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -18,6 +19,7 @@ def runInteractive(): ''' Startet Programm im interaktiven Modus (Konsole). ''' + logPlain(assets.Logo()); logWarn('Interaktiver Modus noch nicht implementiert.'); return; @@ -31,6 +33,7 @@ def runNonInteractive(path: str): ''' config = ReadConfigFile(path); cases = GetAttribute(config, 'parts', 'cases', expectedtype=list, default=[]); + logPlain(assets.Logo()); for caseindex, case in enumerate(cases): command = GetAttribute(case, 'command', expectedtype=str, default=''); descr = GetAttribute(case, 'description', expectedtype=str, default=''); diff --git a/code/python/src/main.py b/code/python/src/main.py index d3ba342..647a59a 100644 --- a/code/python/src/main.py +++ b/code/python/src/main.py @@ -13,8 +13,6 @@ sys.path.insert(0, _path_to_python_project); os.chdir(_path_to_python_project); from src.core.log import *; -from src.core.utils import IsTrue; -from src.core.utils import IsFalse; from src.setup.cli import *; from src.setup import appconfig; from src.endpoints.exports import *; @@ -30,14 +28,16 @@ PATH_TO_CONFIG: str = '../config.yml'; # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def enter( - mode: str, + mode: Union[str, None], it: bool, quiet: bool, debug: bool, checks: bool, colour: bool, - config: Any, **_ + config: Union[str, None], + **_ ): + # Programmeinstellungen initialisieren if not (mode == 'run' and it): SetQuietMode(quiet); SetDebugMode(debug); @@ -46,7 +46,15 @@ def enter( config = config if isinstance(config, str) else PATH_TO_CONFIG; - if mode == 'version': + # Wenn der Artefakt ohne Argument aufgerufen wird, keinen Fehler melden, sondern im it-Modus ausführen + if mode is None: + endpoint_runInteractive(); + return; + # Sonst Commands behandeln + if mode == 'help': + endpoint_help(); + return; + elif mode == 'version': endpoint_version(); return; elif mode == 'run': @@ -54,8 +62,9 @@ def enter( endpoint_runInteractive(); else: endpoint_runNonInteractive(path=config); - else: # elif mode - endpoint_help(); + return; + else: + endpoint_runInteractive(); return; return; @@ -71,11 +80,11 @@ if __name__ == '__main__': endpoint_help(); exit(1); enter( - mode=args.mode[0], + mode=args.mode, it=args.it, quiet=args.quiet, debug=args.debug, - checks=IsTrue(args.checks[0]), - colour=IsTrue(args.colour[0]), + checks=args.checks, + colour=args.colour, config=args.config, ); diff --git a/code/python/src/setup/assets.py b/code/python/src/setup/assets.py new file mode 100644 index 0000000..2958ac8 --- /dev/null +++ b/code/python/src/setup/assets.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# IMPORTS +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +from src.local.io import *; + +from src.core.utils import DedentIgnoreFirstLast +from src.setup.cli import GetArgumentParser; + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# METHODS assets +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +def Help() -> str: + parser = GetArgumentParser(); + with io.StringIO() as fp: + parser.print_help(fp) + text = fp.getvalue(); + return text; + +def Logo() -> str: + ## NOTE: expandiert ansi nicht: + # with open('assets/LOGO', 'r') as fp: + # logo = (''.join(fp.readlines())).strip(); + logo = DedentIgnoreFirstLast(''' + +--------------------+ + | \033[32;1mAlgoDat I\033[0m | + +--------------------+ + ''') + '\n'; + return logo; + +def Version() -> str: + with open('assets/VERSION', 'r') as fp: + version = (''.join(fp.readlines())).strip(); + return version; diff --git a/code/python/src/setup/cli.py b/code/python/src/setup/cli.py index 9e8f0f1..3825b3d 100644 --- a/code/python/src/setup/cli.py +++ b/code/python/src/setup/cli.py @@ -10,6 +10,8 @@ from src.local.typing import *; from src.core.log import *; from src.core.utils import DedentIgnoreFirstLast; +from src.core.utils import IsTrue; +from src.core.utils import IsFalse; # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # GLOBAL VARIABLES @@ -28,12 +30,12 @@ def GetArgumentParser() -> argparse.ArgumentParser: prog='code/main.py', description=DedentIgnoreFirstLast(''' \033[93;1mBeschreibung:\033[0m - \033[93;2mEin Programm, das verschiedene Algorithmen aus dem Kurs AlgoDat I testet.\033[0m + \033[93;2mEin Programm zur Ausführung verschiedener Algorithmen aus dem Kurs AlgoDat I.\033[0m '''), formatter_class=argparse.RawTextHelpFormatter, ); parser.add_argument('mode', - nargs=1, + nargs='?', choices=['version', 'help', 'run'], help=DedentIgnoreFirstLast(''' help = Hilfsanleitung anzeigen. @@ -51,9 +53,12 @@ def GetArgumentParser() -> argparse.ArgumentParser: '''), ), parser.add_argument('--colour', nargs=1, type=str, default=['False'], help='(bool) Ob Logging färblich angezeigt wird.') - parser.add_argument('--config', nargs=1, type=str, help='(string) Pfad zur Configdatei (nur für run Endpunkt).'); + parser.add_argument('--config', nargs=1, type=str, help='(string) Pfad zur Configdatei (nur für run Endpunkt).'); return parser; def GetArgumentsFromCli(*cli_args: str) -> argparse.Namespace: parser = GetArgumentParser(); - return parser.parse_args(cli_args); + args = parser.parse_args(cli_args); + args.checks=IsTrue(args.checks[0]); + args.colour=IsTrue(args.colour[0]); + return args;