schon/lessy.py
fureunoir 42b40627de Features: 1) Introduce CLI utility lessy.py to streamline project management tasks (e.g., install, run, restart, test); 2) Add Unix and Windows script commands for make-messages and compile-messages to improve translation workflow; 3) Include shared utility libraries (utils.sh, utils.ps1) for reusable functions across scripts.
Fixes: 1) Remove obsolete `reboot` scripts for Unix and Windows to prevent redundancy; 2) Update Windows `test.ps1` to handle omitted coverage patterns and improve error feedback.

Extra: 1) Refactor Windows scripts (`make-messages.ps1`, `compile-messages.ps1`, `backup.ps1`) to use shared utilities for better consistency and output formatting; 2) Add spinner-based progress indicators to enhance user experience in interactive environments.
2026-01-04 19:18:27 +03:00

129 lines
3.3 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()