|
from dataclasses import dataclass |
|
from functools import wraps |
|
from textwrap import dedent |
|
from typing import Any, Callable, Optional |
|
|
|
import click |
|
|
|
|
|
def require_workspace(): |
|
def require_workspace_inner(f: Callable[..., None]): |
|
@wraps(f) |
|
@click.pass_context |
|
def new_func(ctx: click.Context, *args: Any, **kwargs: Any): |
|
if ctx.obj.is_workspace_valid: |
|
return ctx.invoke(f, *args, **kwargs) |
|
else: |
|
click.echo( |
|
"The current directory is not a valid Task Weaver project directory. " |
|
"There needs to be a `taskweaver-config.json` in the root of the project directory. " |
|
"Please change the working directory to a valid project directory or initialize a new one. " |
|
"Refer to --help for more information.", |
|
) |
|
ctx.exit(1) |
|
|
|
return new_func |
|
|
|
return require_workspace_inner |
|
|
|
|
|
@dataclass |
|
class CliContext: |
|
workspace: Optional[str] |
|
workspace_param: Optional[str] |
|
is_workspace_valid: bool |
|
is_workspace_empty: bool |
|
|
|
|
|
def get_ascii_banner() -> str: |
|
return dedent( |
|
r""" |
|
========================================================= |
|
_____ _ _ __ |
|
|_ _|_ _ ___| | _ | | / /__ ____ __ _____ _____ |
|
| |/ _` / __| |/ /| | /| / / _ \/ __ `/ | / / _ \/ ___/ |
|
| | (_| \__ \ < | |/ |/ / __/ /_/ /| |/ / __/ / |
|
|_|\__,_|___/_|\_\|__/|__/\___/\__,_/ |___/\___/_/ |
|
========================================================= |
|
""", |
|
).strip() |
|
|