Compare commits

..

No commits in common. "b193d1d61e9c0da86237bbe252aef8341cf1cda2" and "0f1b426f9475ab46761457ba81de1be0f7109b9a" have entirely different histories.

10 changed files with 59 additions and 141 deletions

View File

@ -68,10 +68,7 @@ var optionsConfigFile = argparse.Options{
// Parst cli flags. // Parst cli flags.
func ParseCli(args []string) (*types.CliArguments, error) { func ParseCli(args []string) (*types.CliArguments, error) {
var err error var err error
Parser = argparse.NewParser( Parser = argparse.NewParser("cli parser", "Liest Optionen + Flags von Kommandozeile.")
"cli parser",
"\033[93;2mEin Programm zur Ausführung verschiedener Algorithmen aus dem Kurs AlgoDat I.\033[0m",
)
arguments := types.CliArguments{ arguments := types.CliArguments{
ModeHelp: Parser.NewCommand("help", "Hilfsanleitung anzeigen"), ModeHelp: Parser.NewCommand("help", "Hilfsanleitung anzeigen"),
ModeVersion: Parser.NewCommand("version", "Version anzeigen."), ModeVersion: Parser.NewCommand("version", "Version anzeigen."),

View File

@ -38,7 +38,7 @@ func ReadAsset(key string) string {
} }
/* ---------------------------------------------------------------- * /* ---------------------------------------------------------------- *
* METHODS assets * METHODS templates
* ---------------------------------------------------------------- */ * ---------------------------------------------------------------- */
func Help() string { func Help() string {

View File

@ -38,11 +38,9 @@ var (
* ---------------------------------------------------------------- */ * ---------------------------------------------------------------- */
func main() { func main() {
var err error
var arguments *types.CliArguments var arguments *types.CliArguments
var ( var (
err1 error
err2 error
err3 error
cmdMissing bool cmdMissing bool
showChecks bool showChecks bool
) )
@ -52,12 +50,12 @@ func main() {
setup.Assets = assets setup.Assets = assets
// cli arguments parsen // cli arguments parsen
arguments, err1 = cli.ParseCli(os.Args) arguments, err = cli.ParseCli(os.Args)
cmdMissing = cli.ParseCliCommandMissing(err1) cmdMissing = cli.ParseCliCommandMissing(err)
// Programmeinstellungen initialisieren // initialisiere basic optionen wie Logging
showChecks = false showChecks = false
if err1 == nil { if err == nil {
if !(arguments.ModeRun.Happened() && arguments.InteractiveMode()) { if !(arguments.ModeRun.Happened() && arguments.InteractiveMode()) {
logging.SetQuietMode(arguments.QuietModeOn()) logging.SetQuietMode(arguments.QuietModeOn())
logging.SetDebugMode(arguments.DebugModeOn()) logging.SetDebugMode(arguments.DebugModeOn())
@ -65,39 +63,34 @@ func main() {
logging.SetAnsiMode(arguments.ShowColour()) logging.SetAnsiMode(arguments.ShowColour())
showChecks = arguments.ShowChecks() showChecks = arguments.ShowChecks()
} }
err2 = setup.AppConfigInitialise()
// app config (intern) intialisieren
err = setup.AppConfigInitialise()
setup.SetAppConfigPerformChecks(showChecks) setup.SetAppConfigPerformChecks(showChecks)
// Fehler melden (fatal) if err == nil {
if err1 != nil && !cmdMissing { if arguments.ModeVersion.Happened() {
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() endpoints_print.Version()
return return
} else if arguments.ModeRun.Happened() { } else if arguments.ModeRun.Happened() {
if arguments.InteractiveMode() { if arguments.InteractiveMode() {
endpoints_run.RunInteractive() endpoints_run.RunInteractive()
} else { } else {
err3 = endpoints_run.RunNonInteractive(arguments.GetConfigFile()) err = endpoints_run.RunNonInteractive(arguments.GetConfigFile())
if err3 != nil { if err != nil {
logging.Fatal(err3) logging.Fatal(err)
} }
} }
return return
} else if arguments.ModeHelp.Happened() {
endpoints_print.Help()
return
} else { } else {
endpoints_run.RunInteractive() endpoints_run.RunInteractive()
} }
} else if cmdMissing {
endpoints_run.RunInteractive()
} else {
logging.Fatal(err)
}
} }

View File

@ -17,7 +17,6 @@ import sys;
sys.path.insert(0, os.path.abspath(os.path.join(os.path.abspath(__file__), '..'))); sys.path.insert(0, os.path.abspath(os.path.join(os.path.abspath(__file__), '..')));
from src.setup.cli import *; from src.setup.cli import *;
from src.endpoints.exports import *;
from src.main import enter; from src.main import enter;
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -25,18 +24,10 @@ from src.main import enter;
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if __name__ == '__main__': if __name__ == '__main__':
sys.tracebacklimit = 0;
sys.tracebacklimit = 0; sys.tracebacklimit = 0;
try: try:
args = GetArgumentsFromCli(*sys.argv[1:]); args = GetArgumentsFromCli(sys.argv[1:]);
except: except:
endpoint_help();
exit(1); exit(1);
enter( enter(quiet=args.quiet, debug=args.debug, mode=args.mode[0], path=args.path);
mode=args.mode,
it=args.it,
quiet=args.quiet,
debug=args.debug,
checks=args.checks,
colour=args.colour,
config=args.config,
);

View File

@ -6,14 +6,17 @@
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from src.core.log import *; from src.core.log import *;
from src.setup import assets; from src.setup.cli import GetArgumentsFromCli;
from src.setup.cli import GetArgumentParser;
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ENDPOINT version # ENDPOINT version
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def version(): def version():
logPlain(assets.Version()); with open('assets/VERSION', 'r') as fp:
version = ('\n'.join(fp.readlines())).strip();
logPlain(version);
return; return;
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -21,5 +24,6 @@ def version():
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def help(): def help():
logPlain(assets.Help()); parser = GetArgumentParser();
parser.print_help();
return; return;

View File

@ -8,7 +8,6 @@
from src.core.log import *; from src.core.log import *;
from src.core.config import *; from src.core.config import *;
from src.setup.display import *; from src.setup.display import *;
from src.setup import assets;
from src.algorithms.exports import *; from src.algorithms.exports import *;
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -19,7 +18,6 @@ def runInteractive():
''' '''
Startet Programm im interaktiven Modus (Konsole). Startet Programm im interaktiven Modus (Konsole).
''' '''
logPlain(assets.Logo());
logWarn('Interaktiver Modus noch nicht implementiert.'); logWarn('Interaktiver Modus noch nicht implementiert.');
return; return;
@ -33,7 +31,6 @@ def runNonInteractive(path: str):
''' '''
config = ReadConfigFile(path); config = ReadConfigFile(path);
cases = GetAttribute(config, 'parts', 'cases', expectedtype=list, default=[]); cases = GetAttribute(config, 'parts', 'cases', expectedtype=list, default=[]);
logPlain(assets.Logo());
for caseindex, case in enumerate(cases): for caseindex, case in enumerate(cases):
command = GetAttribute(case, 'command', expectedtype=str, default=''); command = GetAttribute(case, 'command', expectedtype=str, default='');
descr = GetAttribute(case, 'description', expectedtype=str, default=''); descr = GetAttribute(case, 'description', expectedtype=str, default='');

View File

@ -13,6 +13,8 @@ sys.path.insert(0, _path_to_python_project);
os.chdir(_path_to_python_project); os.chdir(_path_to_python_project);
from src.core.log import *; 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.cli import *;
from src.setup import appconfig; from src.setup import appconfig;
from src.endpoints.exports import *; from src.endpoints.exports import *;
@ -28,16 +30,14 @@ PATH_TO_CONFIG: str = '../config.yml';
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def enter( def enter(
mode: Union[str, None], mode: str,
it: bool, it: bool,
quiet: bool, quiet: bool,
debug: bool, debug: bool,
checks: bool, checks: bool,
colour: bool, colour: bool,
config: Union[str, None], config: Any, **_
**_
): ):
# Programmeinstellungen initialisieren
if not (mode == 'run' and it): if not (mode == 'run' and it):
SetQuietMode(quiet); SetQuietMode(quiet);
SetDebugMode(debug); SetDebugMode(debug);
@ -46,15 +46,7 @@ def enter(
config = config if isinstance(config, str) else PATH_TO_CONFIG; config = config if isinstance(config, str) else PATH_TO_CONFIG;
# Wenn der Artefakt ohne Argument aufgerufen wird, keinen Fehler melden, sondern im it-Modus ausführen if mode == 'version':
if mode is None:
endpoint_runInteractive();
return;
# Sonst Commands behandeln
if mode == 'help':
endpoint_help();
return;
elif mode == 'version':
endpoint_version(); endpoint_version();
return; return;
elif mode == 'run': elif mode == 'run':
@ -62,9 +54,8 @@ def enter(
endpoint_runInteractive(); endpoint_runInteractive();
else: else:
endpoint_runNonInteractive(path=config); endpoint_runNonInteractive(path=config);
return; else: # elif mode
else: endpoint_help();
endpoint_runInteractive();
return; return;
return; return;
@ -80,11 +71,11 @@ if __name__ == '__main__':
endpoint_help(); endpoint_help();
exit(1); exit(1);
enter( enter(
mode=args.mode, mode=args.mode[0],
it=args.it, it=args.it,
quiet=args.quiet, quiet=args.quiet,
debug=args.debug, debug=args.debug,
checks=args.checks, checks=IsTrue(args.checks[0]),
colour=args.colour, colour=IsTrue(args.colour[0]),
config=args.config, config=args.config,
); );

View File

@ -1,38 +0,0 @@
#!/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;

View File

@ -10,8 +10,6 @@ from src.local.typing import *;
from src.core.log import *; from src.core.log import *;
from src.core.utils import DedentIgnoreFirstLast; from src.core.utils import DedentIgnoreFirstLast;
from src.core.utils import IsTrue;
from src.core.utils import IsFalse;
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# GLOBAL VARIABLES # GLOBAL VARIABLES
@ -30,12 +28,12 @@ def GetArgumentParser() -> argparse.ArgumentParser:
prog='code/main.py', prog='code/main.py',
description=DedentIgnoreFirstLast(''' description=DedentIgnoreFirstLast('''
\033[93;1mBeschreibung:\033[0m \033[93;1mBeschreibung:\033[0m
\033[93;2mEin Programm zur Ausführung verschiedener Algorithmen aus dem Kurs AlgoDat I.\033[0m \033[93;2mEin Programm, das verschiedene Algorithmen aus dem Kurs AlgoDat I testet.\033[0m
'''), '''),
formatter_class=argparse.RawTextHelpFormatter, formatter_class=argparse.RawTextHelpFormatter,
); );
parser.add_argument('mode', parser.add_argument('mode',
nargs='?', nargs=1,
choices=['version', 'help', 'run'], choices=['version', 'help', 'run'],
help=DedentIgnoreFirstLast(''' help=DedentIgnoreFirstLast('''
help = Hilfsanleitung anzeigen. help = Hilfsanleitung anzeigen.
@ -58,7 +56,4 @@ def GetArgumentParser() -> argparse.ArgumentParser:
def GetArgumentsFromCli(*cli_args: str) -> argparse.Namespace: def GetArgumentsFromCli(*cli_args: str) -> argparse.Namespace:
parser = GetArgumentParser(); parser = GetArgumentParser();
args = parser.parse_args(cli_args); return parser.parse_args(cli_args);
args.checks=IsTrue(args.checks[0]);
args.colour=IsTrue(args.colour[0]);
return args;

View File

@ -2,25 +2,13 @@
## Agenda ## ## Agenda ##
- Gruppe 1: - [ ]
- Verkettete Listen - [ ]
- basic methods/attributes
- Stacks + Queues
- LIFO=FILO vs. FIFO=LILO
- PseudoCode-Algorithmus für NextGreaterElement mittels Stacks erarbeitet und diskutiert
- ACHTUNG: im code-Ordner ([go-Variante](../code/golang/pkg/algorithms/stacks/next_greater_element/next_greater_element.go) und [python-Variante](../code/python/src/algorithms/stacks/next_greater_element.py)) habe ich einen vereinfachten Algorithmus implementiert.
- Gruppe 2:
- PseudoCode-Algorithmus für NextGreaterElement mittels Stacks erarbeitet und diskutiert
- ACHTUNG: im code-Ordner ([go-Variante](../code/golang/pkg/algorithms/stacks/next_greater_element/next_greater_element.go) und [python-Variante](../code/python/src/algorithms/stacks/next_greater_element.py)) habe ich einen vereinfachten Algorithmus implementiert.
- Grundkonzepte für gerichtete/ungerichtete Graphen und Bäume besprochen
## Nächste Woche ## ## Nächste Woche ##
- ab selbstorganisierende Listen und Sortierungsalgorithmen -
### TODOs (Studierende) ### ### TODOs (Studierende) ###
- VL-Inhalte aus Wochen 3 + 4 durchgehen -
- jeden Sortierungsalgorithmus und MaxHeap verstehen
- Darstellung von Daten als Bäume verstehen
- freiwillige ÜB 4 + Pflichtserie 2