swydd/DESIGN.md

975 B

Swydd Design

Goals:

  • Generic task runner
  • Portable (single python module)
  • library not an exe

basic design:

tasks.py:

from swydd import taks, option, cli

@task
@option("program","name of program to compile")
def build(program: str = "hello"):
  """build a program"""
  sub < f"gcc -o {program} {program}.c"

cli()
./tasks.py build
./tasks.py build --program goodbye

Ideas

Simple shell pipelines

@task
def pipe_commands()
    """run pre-commit (and mypy)"""
    p = Pipe(Exec("find . -name file"), Exec("grep 'pattern'")).get()
    print(p.stdout)

Made even simpler with operator overloading:

@task
def run_commands():
  stdout = get < (pipe | "find . -name file" | "grep 'pattern'")
  print(stdout)

Internal CLI

./tasks.py _ swydd-subcmd
# vs
./tasks.py _swydd-subcmd
# or
./tasks.py +swydd-subcmd # <- current favorite (use a none valid function name to possibly prevent overlap)