Coverage for frappe_manager / commands / self / compose.py: 43%
28 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-07-02 18:13 +0530
« prev ^ index » next coverage.py v7.13.5, created at 2026-07-02 18:13 +0530
1import typer
2from typer_examples import example
4from frappe_manager import CLI_BENCHES_DIRECTORY
5from frappe_manager.output_manager import get_global_output_handler
6from frappe_manager.utils.callbacks import sitename_callback
9@example(
10 "Show running containers for a bench",
11 "{benchname} ps",
12 detail="Runs 'docker compose ps' for the bench using all discovered compose files.",
13 benchname="mybench",
14)
15@example(
16 "Start containers in detached mode",
17 "{benchname} up -d",
18 detail="Starts containers in detached mode using the bench's compose files.",
19 benchname="mybench",
20)
21@example(
22 "Follow logs for frappe service",
23 "{benchname} logs -f frappe",
24 detail="Runs 'docker compose logs -f frappe' to stream logs for the frappe service.",
25 benchname="mybench",
26)
27@example(
28 "Execute bash in frappe container",
29 "{benchname} exec frappe bash",
30 detail="Executes an interactive bash shell in the frappe container.",
31 benchname="mybench",
32)
33@example(
34 "Restart specific service",
35 "{benchname} restart frappe",
36 detail="Restarts a single service using docker compose for targeted debugging.",
37 benchname="mybench",
38)
39@example(
40 "View container resource usage",
41 "{benchname} stats",
42 detail="Runs 'docker compose stats' to view resource usage for bench containers.",
43 benchname="mybench",
44)
45def compose(
46 ctx: typer.Context,
47 benchname: str = typer.Argument(..., help="Name of the bench"),
48):
49 """
50 Run docker compose commands with auto-detected compose files.
52 Automatically finds and includes all docker-compose*.yml files in the bench directory.
53 """
54 bench_name = sitename_callback(benchname)
55 bench_path = CLI_BENCHES_DIRECTORY / bench_name
56 output = get_global_output_handler()
58 compose_files = sorted(bench_path.glob("docker-compose*.yml"))
60 if not compose_files:
61 output.display_error(f"No docker-compose files found in {bench_path}")
62 raise typer.Exit(1)
64 compose_cmd = ["docker", "compose"]
66 for compose_file in compose_files:
67 compose_cmd.extend(["-f", compose_file.name])
69 if ctx.args:
70 compose_cmd.extend(ctx.args)
72 output.change_head(f"Running docker compose {' '.join(ctx.args or [])}")
74 import os
76 os.chdir(bench_path)
77 os.execvp(compose_cmd[0], compose_cmd)