schon/lessy.py
2026-01-04 20:47:52 +03:00

144 lines
3.4 KiB
Python
Executable file

#!/usr/bin/env python3
import platform
import subprocess
import sys
from pathlib import Path
import click
OS = platform.system().lower()
SCRIPT_EXT = ".ps1" if OS == "windows" else ".sh"
SCRIPT_DIR = "Windows" if OS == "windows" else "Unix"
PROJECT_ROOT = Path(__file__).parent.absolute()
SCRIPTS_PATH = PROJECT_ROOT / "scripts" / SCRIPT_DIR
def get_script_path(command: str) -> Path:
return SCRIPTS_PATH / f"{command}{SCRIPT_EXT}"
def run_script(script_name: str, *args) -> int:
script_path = get_script_path(script_name)
if not script_path.exists():
click.secho(
f"Error: Script '{script_name}' not found at {script_path}",
fg="red",
err=True,
)
return 1
if OS == "windows":
cmd = ["pwsh", "-File", str(script_path)]
else:
cmd = ["bash", str(script_path)]
cmd.extend(args)
try:
result = subprocess.run(cmd, cwd=PROJECT_ROOT)
return result.returncode
except FileNotFoundError:
shell_name = "PowerShell" if OS == "windows" else "bash"
click.secho(
f"Error: {shell_name} not found. Please ensure it's installed.",
fg="red",
err=True,
)
return 127
except KeyboardInterrupt:
click.secho("\nOperation cancelled by user.", fg="yellow")
return 130
@click.group(
context_settings={"help_option_names": ["-h", "--help"]},
invoke_without_command=True,
)
@click.pass_context
def cli(ctx):
if ctx.invoked_subcommand is None:
click.echo(ctx.get_help())
@cli.command()
def install():
return sys.exit(run_script("install"))
@cli.command()
def run():
return sys.exit(run_script("run"))
@cli.command()
def restart():
return sys.exit(run_script("restart"))
@cli.command()
@click.option(
"-r",
"--report",
type=click.Choice(["xml", "html"]),
help="Generate coverage report (xml or html)",
)
def test(report):
args = []
if report:
args.extend(["-r", report])
return sys.exit(run_script("test", *args))
@cli.command()
def uninstall():
if click.confirm(
"This will remove all Docker containers, volumes, and generated files. Continue?"
):
return sys.exit(run_script("uninstall"))
else:
click.secho("Uninstall cancelled.", fg="yellow")
return 0
@cli.command()
def backup():
return sys.exit(run_script("backup"))
@cli.command(name="generate-env")
def generate_env():
return sys.exit(run_script("generate-environment-file"))
@cli.command(name="export-env")
def export_env():
return sys.exit(run_script("export-environment-file"))
@cli.command(name="make-messages")
def make_messages():
return sys.exit(run_script("make-messages"))
@cli.command(name="compile-messages")
def compile_messages():
return sys.exit(run_script("compile-messages"))
@cli.command()
def info():
click.echo(f"{'=' * 60}")
click.secho("lessy - eVibes Project CLI", fg="cyan", bold=True)
click.echo(f"{'=' * 60}")
click.echo(f"Operating System: {platform.system()} ({platform.release()})")
click.echo(f"Python Version: {platform.python_version()}")
click.echo(f"Architecture: {platform.machine()}")
click.echo(f"Project Root: {PROJECT_ROOT}")
click.echo(f"Scripts Directory: {SCRIPTS_PATH}")
click.echo(f"Script Extension: {SCRIPT_EXT}")
click.echo(f"{'=' * 60}")
if __name__ == "__main__":
cli()