Coverage for frappe_manager / commands / code.py: 61%

23 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-07-02 18:13 +0530

1from typing import Annotated 

2 

3import typer 

4from typer_examples import example 

5 

6from frappe_manager import DEFAULT_EXTENSIONS 

7from frappe_manager.commands import check_bench_migration_required 

8from frappe_manager.output_manager import get_global_output_handler 

9from frappe_manager.site_manager.site import Bench 

10from frappe_manager.utils.callbacks import ( 

11 code_command_extensions_callback, 

12 sitename_callback, 

13 sites_autocompletion_callback, 

14) 

15 

16 

17@example( 

18 "Open bench in VSCode", 

19 "{benchname}", 

20 detail="Opens the bench workspace in VSCode and attaches the recommended extensions and settings.", 

21 benchname="mybench", 

22) 

23@example( 

24 "Open bench with debugger config", 

25 "{benchname} --debugger", 

26 detail="Launches VSCode with debugger configuration prepared for the Frappe app.", 

27 benchname="mybench", 

28) 

29@example( 

30 "Force start bench before opening", 

31 "{benchname} --force-start", 

32 detail="Starts the bench containers before opening VSCode if they are not running.", 

33 benchname="mybench", 

34) 

35@example( 

36 "Add custom VSCode extension", 

37 "{benchname} --extension vscodevim.vim", 

38 detail="Installs or enables additional VSCode extensions inside the development container.", 

39 benchname="mybench", 

40) 

41@example( 

42 "Open with custom working directory", 

43 "{benchname} --work-dir /workspace", 

44 detail="Overrides the default working directory used within the VSCode container.", 

45 benchname="mybench", 

46) 

47def code( 

48 ctx: typer.Context, 

49 benchname: Annotated[ 

50 str | None, 

51 typer.Argument( 

52 help="Name of the bench.", 

53 autocompletion=sites_autocompletion_callback, 

54 callback=sitename_callback, 

55 ), 

56 ] = None, 

57 user: Annotated[str, typer.Option(help="User to connect as")] = "frappe", 

58 extensions: Annotated[ 

59 list[str], 

60 typer.Option( 

61 "--extension", 

62 "-e", 

63 help="VSCode extensions to install (e.g., ms-python.python)", 

64 callback=code_command_extensions_callback, 

65 show_default=False, 

66 ), 

67 ] = DEFAULT_EXTENSIONS, 

68 force_start: Annotated[bool, typer.Option("--force-start", "-f", help="Start bench before opening VSCode")] = False, 

69 debugger: Annotated[bool, typer.Option("--debugger", "-d", help="Setup debugger config")] = False, 

70 workdir: Annotated[ 

71 str, 

72 typer.Option("--work-dir", "-w", help="Working directory in VSCode"), 

73 ] = "/workspace/frappe-bench", 

74): 

75 """ 

76 Open bench in VSCode. 

77 

78 Attaches VSCode to the bench container with recommended extensions and optional debugger support. 

79 """ 

80 

81 check_bench_migration_required(benchname) 

82 

83 services_manager = ctx.obj["services"] 

84 verbose = ctx.obj["verbose"] 

85 

86 output = get_global_output_handler() 

87 logger = ctx.obj.get("logger") 

88 bench = Bench.get_object(benchname, services_manager, logger=logger, output_handler=output) 

89 

90 if force_start: 

91 bench.start() 

92 

93 bench.attach_to_bench(user=user, extensions=extensions, workdir=workdir, debugger=debugger)