Files
linux-workspace/bin/gws
Martin Blazik 65826828ba Tuning gws script
Work correctly with modules
2022-01-10 15:37:06 +01:00

161 lines
3.4 KiB
Python
Executable File

#!/usr/bin/env python3
"""
TODO
- could load shortcuts from environment
"""
import os
from sys import argv, exit
from typing import Tuple, List, Generator, Iterable, Iterator, Sequence, Callable
from itertools import chain
Args = Sequence[str]
StrIter = Iterable[str]
GwCommand = 'gw'
DEBUG = False
actions = (
'clean',
'build',
'compileTestKotlin',
# todo only if there no -x prefix
'test',
'componentTest',
'shadowJar'
)
shortcuts = {
'c': ['clean'],
'b': ['build'],
't': ['test'],
'bt': ['compileTestKotlin'],
'ct': ['componentTest'],
'tct': ['test', 'componentTest'],
'cb': ['clean', 'build'],
'cbx': ['clean', 'build', '-x', 'test'],
'cbt': ['clean', 'build', 'compileTestKotlin', '-x', 'test'],
'cct': ['cleanComponentTest'],
'rt': ['cleanTest', 'test'],
'rct': ['cleanComponentTest', 'componentTest'],
'nd': ['-x', 'detekt'],
'-nd': ['-x', 'detekt'],
'xt': ['-x', 'test'],
'-nt': ['-x', 'test'],
'br': ['bootRun'],
'rb': ['bootRun'],
'jar': ['shadowJar'],
'-nc': ['--no-build-cache'],
'-rr': ['--rerun-tasks'],
'-rt': ['--rerun-tasks'],
'-wl': ['--write-locks'],
'-ef': ['-Penvironment=free'],
'-el': ['-Penvironment=licensed'],
'-lic': ['-Penvironment=licensed']
}
help_text = """\
Support functionality for gw application
Use cases
gws cbx :tests :tools
gws cb ct
gws cbt
gws cbx :microservices:afm-exec-api
Options
--show doesn't start gw app
--debug show details about processing
"""
def show_help():
print(help_text)
show_shortcuts()
print()
exit(1)
def show_shortcuts():
print('Shortcuts')
for key, value in shortcuts.items():
print(f" {key} ... {' '.join(value)}")
def log(name, obj):
if DEBUG:
print(name + str(obj))
def is_module(arg: str):
return arg.startswith(':')
def flatten(lst):
return list(chain(*lst))
def replace_shortcut(arg: str) -> List[str]:
if arg in shortcuts:
return shortcuts[arg]
else:
return [arg]
def split_on_condition(lst: Sequence, condtion):
good = []
bad = []
for item in lst:
(bad, good)[condtion(item)].append(item)
return good, bad
def pair_module_with_action(args: Args) -> List[str]:
modules, rest_args = split_on_condition(args, is_module)
log("modules", modules)
log("args", rest_args)
if modules:
_args = []
for arg in rest_args:
if arg in actions:
for module in modules:
_args.append(module + ':' + arg)
else:
_args.append(arg)
return _args
else:
return args
def prepare_args(args: Args) -> List[str]:
args = flatten(map(replace_shortcut, args))
args = pair_module_with_action(args)
return args
def prepare_command(args: Args) -> str:
return GwCommand + ' ' + ' '.join(prepare_args(args))
def try_remove(lst: Sequence, value) -> Tuple[bool, Sequence]:
filtered = list(filter(lambda x: x != value, lst))
return len(lst) != len(filtered), filtered
def main(args: List[str]):
if not args:
show_help()
global DEBUG
DEBUG, args = try_remove(args, '--debug')
just_show, args = try_remove(args, '--show')
cmd = prepare_command(args)
print(cmd)
if not just_show:
print()
os.system(cmd)
if __name__ == '__main__':
main(argv[1:])