66import typing as t
77
88import click
9- from rich .prompt import Prompt
109from sqlmesh import configure_logging , remove_excess_logs
1110from sqlmesh .cli import error_handler
1211from sqlmesh .cli import options as opt
13- from sqlmesh .cli .example_project import ProjectTemplate , init_example_project , InitCliMode
12+ from sqlmesh .cli .example_project import (
13+ ProjectTemplate ,
14+ init_example_project ,
15+ InitCliMode ,
16+ interactive_init ,
17+ )
1418from sqlmesh .core .analytics import cli_analytics
1519from sqlmesh .core .console import configure_console , get_console
1620from sqlmesh .utils import Verbosity
1721from sqlmesh .core .config import load_configs
18- from sqlmesh .core .config .connection import INIT_DISPLAY_INFO_TO_TYPE
1922from sqlmesh .core .context import Context
2023from sqlmesh .utils .date import TimeLike
2124from sqlmesh .utils .errors import MissingDependencyError , SQLMeshError
2225from pathlib import Path
2326
2427logger = logging .getLogger (__name__ )
2528
26- if t .TYPE_CHECKING :
27- from rich .console import Console
2829
2930SKIP_LOAD_COMMANDS = (
3031 "clean" ,
@@ -194,7 +195,7 @@ def init(
194195
195196 console = srich .console
196197
197- project_template , engine_type , cli_mode = _interactive_init (ctx .obj , console , project_template )
198+ project_template , engine_type , cli_mode = interactive_init (ctx .obj , console , project_template )
198199
199200 config_path = init_example_project (
200201 path = ctx .obj ,
@@ -206,8 +207,11 @@ def init(
206207 )
207208
208209 engine_install_text = ""
209- if engine_type and engine_type not in ("duckdb" , "motherduck" , "spark" ):
210- engine_install_text = f'• Run command in CLI to install your SQL engine\' s Python dependencies: pip install "sqlmesh\\ [{ engine_type .replace ("_" , "" )} ]"\n '
210+ if engine_type and engine_type not in ("duckdb" , "motherduck" ):
211+ install_text = (
212+ "pyspark" if engine_type == "spark" else f"sqlmesh\\ [{ engine_type .replace ('_' , '' )} ]"
213+ )
214+ engine_install_text = f'• Run command in CLI to install your SQL engine\' s Python dependencies: pip install "{ install_text } "\n '
211215 # interactive init does not support DLT template
212216 next_step_text = {
213217 ProjectTemplate .DEFAULT : f"{ engine_install_text } • Update your gateway connection settings (e.g., username/password) in the project configuration file:\n { config_path } " ,
@@ -1259,115 +1263,6 @@ def state_import(obj: Context, input_file: Path, replace: bool, no_confirm: bool
12591263 obj .import_state (input_file = input_file , clear = replace , confirm = confirm )
12601264
12611265
1262- def _interactive_init (
1263- path : Path ,
1264- console : Console ,
1265- project_template : t .Optional [ProjectTemplate ] = None ,
1266- ) -> t .Tuple [ProjectTemplate , t .Optional [str ], t .Optional [InitCliMode ]]:
1267- console .print ("──────────────────────────────" )
1268- console .print ("Welcome to SQLMesh!" )
1269-
1270- project_template = _init_template_prompt (console ) if not project_template else project_template
1271-
1272- if project_template == ProjectTemplate .DBT :
1273- return (project_template , None , None )
1274-
1275- engine_type = _init_engine_prompt (console )
1276- cli_mode = _init_cli_mode_prompt (console )
1277-
1278- return (project_template , engine_type , cli_mode )
1279-
1280-
1281- def _init_integer_prompt (
1282- console : Console , err_msg_entity : str , num_options : int , retry_func : t .Callable [[t .Any ], t .Any ]
1283- ) -> int :
1284- err_msg = "\n ERROR: '{option_str}' is not a valid {err_msg_entity} number - please enter a number between 1 and {num_options} or exit with control+c\n "
1285- while True :
1286- option_str = Prompt .ask ("Enter a number" , console = console )
1287-
1288- value_error = False
1289- try :
1290- option_num = int (option_str )
1291- except ValueError :
1292- value_error = True
1293-
1294- if value_error or option_num < 1 or option_num > num_options :
1295- console .print (
1296- err_msg .format (
1297- option_str = option_str , err_msg_entity = err_msg_entity , num_options = num_options
1298- ),
1299- style = "red" ,
1300- )
1301- continue
1302- console .print ("" )
1303- return option_num
1304-
1305-
1306- def _init_display_choices (values_dict : t .Dict [str , str ], console : Console ) -> t .Dict [int , str ]:
1307- display_num_to_value = {}
1308- for i , value_str in enumerate (values_dict .keys ()):
1309- console .print (f" \[{ i + 1 } ] { value_str } { values_dict [value_str ]} " )
1310- display_num_to_value [i + 1 ] = value_str
1311- console .print ("" )
1312- return display_num_to_value
1313-
1314-
1315- def _init_template_prompt (console : Console ) -> ProjectTemplate :
1316- console .print ("──────────────────────────────\n " )
1317- console .print ("What type of project do you want to set up?\n " )
1318-
1319- # These are ordered for user display - do not reorder
1320- template_descriptions = {
1321- ProjectTemplate .DEFAULT .name : "- Create SQLMesh example project models and files" ,
1322- ProjectTemplate .DBT .value : " - You have an existing dbt project and want to run it with SQLMesh" ,
1323- ProjectTemplate .EMPTY .name : " - Create a SQLMesh configuration file and project directories only" ,
1324- }
1325-
1326- display_num_to_template = _init_display_choices (template_descriptions , console )
1327-
1328- template_num = _init_integer_prompt (
1329- console , "project type" , len (template_descriptions ), _init_template_prompt
1330- )
1331-
1332- return ProjectTemplate (display_num_to_template [template_num ].lower ())
1333-
1334-
1335- def _init_engine_prompt (console : Console ) -> str :
1336- console .print ("──────────────────────────────\n " )
1337- console .print ("Choose your SQL engine:\n " )
1338-
1339- # INIT_DISPLAY_INFO_TO_TYPE is a dict of {engine_type: (display_order, display_name)}
1340- DISPLAY_NAME_TO_TYPE = {v [1 ]: k for k , v in INIT_DISPLAY_INFO_TO_TYPE .items ()}
1341- ordered_engine_display_names = {
1342- info [1 ]: "" for info in sorted (INIT_DISPLAY_INFO_TO_TYPE .values (), key = lambda x : x [0 ])
1343- }
1344- display_num_to_display_name = _init_display_choices (ordered_engine_display_names , console )
1345-
1346- engine_num = _init_integer_prompt (
1347- console , "engine" , len (ordered_engine_display_names ), _init_engine_prompt
1348- )
1349-
1350- return DISPLAY_NAME_TO_TYPE [display_num_to_display_name [engine_num ]]
1351-
1352-
1353- def _init_cli_mode_prompt (console : Console ) -> InitCliMode :
1354- console .print ("──────────────────────────────\n " )
1355- console .print ("Choose your SQLMesh CLI experience:\n " )
1356-
1357- cli_mode_descriptions = {
1358- InitCliMode .DEFAULT .name : "- See and control every detail" ,
1359- InitCliMode .SIMPLE .name : " - Automatically run changes and show summary output" ,
1360- }
1361-
1362- display_num_to_cli_mode = _init_display_choices (cli_mode_descriptions , console )
1363-
1364- cli_mode_num = _init_integer_prompt (
1365- console , "config" , len (cli_mode_descriptions ), _init_cli_mode_prompt
1366- )
1367-
1368- return InitCliMode (display_num_to_cli_mode [cli_mode_num ].lower ())
1369-
1370-
13711266def _check_engine_installed (console : Console , engine_type : t .Optional [str ] = None ) -> None :
13721267 if not engine_type :
13731268 return
0 commit comments