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

1import typer 

2from typer_examples import example 

3 

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 

7 

8 

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. 

51 

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() 

57 

58 compose_files = sorted(bench_path.glob("docker-compose*.yml")) 

59 

60 if not compose_files: 

61 output.display_error(f"No docker-compose files found in {bench_path}") 

62 raise typer.Exit(1) 

63 

64 compose_cmd = ["docker", "compose"] 

65 

66 for compose_file in compose_files: 

67 compose_cmd.extend(["-f", compose_file.name]) 

68 

69 if ctx.args: 

70 compose_cmd.extend(ctx.args) 

71 

72 output.change_head(f"Running docker compose {' '.join(ctx.args or [])}") 

73 

74 import os 

75 

76 os.chdir(bench_path) 

77 os.execvp(compose_cmd[0], compose_cmd)