Added command decorator.

This commit is contained in:
Sleepy Monax 2023-11-10 13:29:32 +01:00
parent 6822bb2352
commit d912e7d4ce

View file

@ -1,8 +1,9 @@
from dataclasses import dataclass
import os import os
import logging import logging
import sys import sys
from typing import Callable, cast, Optional, NoReturn from typing import Callable, Unpack, cast, Optional, NoReturn
from cutekit import context, shell, const, vt100, builder, graph, project from cutekit import context, shell, const, vt100, builder, graph, project
from cutekit.args import Args from cutekit.args import Args
@ -15,25 +16,14 @@ Callback = Callable[[Args], None]
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@dataclass
class Cmd: class Cmd:
shortName: Optional[str] shortName: Optional[str] = None
longName: str longName: Optional[str] = None
helpText: str helpText: Optional[str] = None
callback: Callable[[Args], NoReturn] callback: Optional[Callable[[Args], None]] = None
isPlugin: bool = False isPlugin: bool = False
def __init__(
self,
shortName: Optional[str],
longName: str,
helpText: str,
callback: Callable[[Args], NoReturn],
):
self.shortName = shortName
self.longName = longName
self.helpText = helpText
self.callback = callback
cmds: list[Cmd] = [] cmds: list[Cmd] = []
@ -44,6 +34,19 @@ def append(cmd: Cmd):
cmds.sort(key=lambda c: c.shortName or c.longName) cmds.sort(key=lambda c: c.shortName or c.longName)
def command(**kwargs: Unpack[Cmd]):
def wrapper(callback):
cmds.append(Cmd(**kwargs, callback=callback))
return wrapper
@command(
shortName="p",
longName="project",
helpText="Show project information",
isPlugin=False,
)
def runCmd(args: Args): def runCmd(args: Args):
project.chdir() project.chdir()
@ -64,9 +67,12 @@ def runCmd(args: Args):
shell.exec(component.outfile(), *args.args) shell.exec(component.outfile(), *args.args)
cmds += [Cmd("r", "run", "Run the target", runCmd)] @command(
shortName="t",
longName="test",
helpText="Run all test targets",
isPlugin=False,
)
def testCmd(args: Args): def testCmd(args: Args):
project.chdir() project.chdir()
@ -74,9 +80,12 @@ def testCmd(args: Args):
builder.testAll(targetSpec) builder.testAll(targetSpec)
cmds += [Cmd("t", "test", "Run all test targets", testCmd)] @command(
shortName="d",
longName="debug",
helpText="Debug the target",
isPlugin=False,
)
def debugCmd(args: Args): def debugCmd(args: Args):
project.chdir() project.chdir()
@ -97,9 +106,12 @@ def debugCmd(args: Args):
shell.exec("lldb", "-o", "run", component.outfile(), *args.args) shell.exec("lldb", "-o", "run", component.outfile(), *args.args)
cmds += [Cmd("d", "debug", "Debug the target", debugCmd)] @command(
shortName="b",
longName="build",
helpText="Build a component or all components",
isPlugin=False,
)
def buildCmd(args: Args): def buildCmd(args: Args):
project.chdir() project.chdir()
@ -113,9 +125,12 @@ def buildCmd(args: Args):
builder.build(componentSpec, targetSpec, props) builder.build(componentSpec, targetSpec, props)
cmds += [Cmd("b", "build", "Build the target", buildCmd)] @command(
shortName="l",
longName="list",
helpText="List all targets and components",
isPlugin=False,
)
def listCmd(args: Args): def listCmd(args: Args):
project.chdir() project.chdir()
@ -139,25 +154,34 @@ def listCmd(args: Args):
print() print()
cmds += [Cmd("l", "list", "List the targets", listCmd)] @command(
shortName="c",
longName="clean",
helpText="Remove all build files",
isPlugin=False,
)
def cleanCmd(args: Args): def cleanCmd(args: Args):
project.chdir() project.chdir()
shell.rmrf(const.BUILD_DIR) shell.rmrf(const.BUILD_DIR)
cmds += [Cmd("c", "clean", "Clean the build directory", cleanCmd)] @command(
shortName="n",
longName="nuke",
helpText="Clean all build files and caches",
isPlugin=False,
)
def nukeCmd(args: Args): def nukeCmd(args: Args):
project.chdir() project.chdir()
shell.rmrf(const.PROJECT_CK_DIR) shell.rmrf(const.PROJECT_CK_DIR)
cmds += [Cmd("n", "nuke", "Clean the build directory and cache", nukeCmd)] @command(
shortName="h",
longName="help",
helpText="Show this help message",
isPlugin=False,
)
def helpCmd(args: Args): def helpCmd(args: Args):
usage() usage()
@ -184,16 +208,22 @@ def helpCmd(args: Args):
print(f" - {const.GLOBAL_LOG_FILE}") print(f" - {const.GLOBAL_LOG_FILE}")
cmds += [Cmd("h", "help", "Show this help message", helpCmd)] @command(
shortName="v",
longName="version",
helpText="Show current version",
isPlugin=False,
)
def versionCmd(args: Args): def versionCmd(args: Args):
print(f"CuteKit v{const.VERSION_STR}") print(f"CuteKit v{const.VERSION_STR}")
cmds += [Cmd("v", "version", "Show current version", versionCmd)] @command(
shortName="g",
longName="graph",
helpText="Show dependency graph",
isPlugin=False,
)
def graphCmd(args: Args): def graphCmd(args: Args):
project.chdir() project.chdir()
@ -208,9 +238,6 @@ def graphCmd(args: Args):
graph.view(context, scope=scope, showExe=not onlyLibs, showDisabled=showDisabled) graph.view(context, scope=scope, showExe=not onlyLibs, showDisabled=showDisabled)
cmds += [Cmd("g", "graph", "Show dependency graph", graphCmd)]
def grabExtern(extern: dict[str, Extern]): def grabExtern(extern: dict[str, Extern]):
for extSpec, ext in extern.items(): for extSpec, ext in extern.items():
extPath = os.path.join(const.EXTERN_DIR, extSpec) extPath = os.path.join(const.EXTERN_DIR, extSpec)
@ -228,6 +255,12 @@ def grabExtern(extern: dict[str, Extern]):
grabExtern(context.loadProject(extPath).extern) grabExtern(context.loadProject(extPath).extern)
@command(
shortName="i",
longName="install",
helpText="Install all external packages",
isPlugin=False,
)
def installCmd(args: Args): def installCmd(args: Args):
project.chdir() project.chdir()
@ -235,9 +268,12 @@ def installCmd(args: Args):
grabExtern(pj.extern) grabExtern(pj.extern)
cmds += [Cmd("i", "install", "Install all the external packages", installCmd)] @command(
shortName="I",
longName="init",
helpText="Initialize a new project",
isPlugin=False,
)
def initCmd(args: Args): def initCmd(args: Args):
import requests import requests
@ -292,9 +328,6 @@ def initCmd(args: Args):
) )
cmds += [Cmd("I", "init", "Initialize a new project", initCmd)]
def usage(): def usage():
print(f"Usage: {const.ARGV0} <command> [args...]") print(f"Usage: {const.ARGV0} <command> [args...]")