66from pathlib import Path
77from typing import TextIO
88
9- from sqlbuild .cli . commands . _helpers . runtime . adapter_context import (
10- resolve_adapter_connection_context ,
11- )
9+ from sqlbuild .adapter . contract . classes . base_adapter import BaseAdapter
10+ from sqlbuild . cli . commands . _helpers . runtime . adapters import resolve_adapter
11+ from sqlbuild . cli . commands . _helpers . runtime . connection import resolve_project_connection_config
1212from sqlbuild .cli .commands .exceptions import CliUserError
1313from sqlbuild .cli .commands .models import (
14- AdapterConnectionContext ,
1514 BuildCommandRequest ,
1615 BuildInvocation ,
1716)
2322from sqlbuild .compiler .discovery .main .discover import discover_project_inputs
2423from sqlbuild .compiler .discovery .models import DiscoveredProjectInputs
2524from sqlbuild .presentation .main .supports_color import supports_color
25+ from sqlbuild .spec .contracts .main .resolve_effective_adapter_name import (
26+ resolve_effective_adapter_name ,
27+ )
2628from sqlbuild .spec .contracts .main .resolve_target_config import resolve_target_config
2729from sqlbuild .spec .contracts .main .resolve_target_name import resolve_target_name
2830from sqlbuild .spec .contracts .models import ExecutionLimitsConfig , TargetConfig
@@ -44,17 +46,35 @@ def resolve_build_invocation(*, request: BuildCommandRequest) -> BuildInvocation
4446 )
4547 if request .defer_to is not None and effective_defer_clone_from is not None :
4648 raise CliUserError ("--defer-clone-from cannot be used with --defer-to" , code = "C408" )
47- adapter_context : AdapterConnectionContext = resolve_adapter_connection_context (
49+ adapter_name : str = resolve_effective_adapter_name (
50+ project_config = discovered_inputs .project_config ,
51+ local_config = discovered_inputs .local_config ,
52+ )
53+ adapter : BaseAdapter = resolve_adapter (
54+ adapter_name = adapter_name , project_dir = effective_project_dir
55+ )
56+ effective_target_name : str | None = resolve_target_name (
57+ project_config = discovered_inputs .project_config ,
58+ local_config = discovered_inputs .local_config ,
59+ selected_target = request .selected_target ,
60+ )
61+ execution_limits : ExecutionLimitsConfig = _resolve_execution_limits (
4862 discovered_inputs = discovered_inputs ,
49- effective_project_dir = effective_project_dir ,
63+ target_name = effective_target_name ,
64+ adapter_name = adapter_name ,
65+ adapter = adapter ,
66+ )
67+ connection_config : dict [str , object ] = resolve_project_connection_config (
68+ discovered_inputs = discovered_inputs ,
69+ project_dir = effective_project_dir ,
5070 selected_target = request .selected_target ,
5171 cli_vars = request .cli_vars ,
5272 )
5373 machine_output : bool = request .json_output
5474 use_color : bool = not request .no_color and not machine_output and supports_color ()
5575 progress_stream : TextIO = sys .stderr if request .debug or machine_output else sys .stdout
5676 reporters : CommandProgressReporters = build_command_progress_reporters (
57- adapter_name = adapter_context . adapter_name ,
77+ adapter_name = adapter_name ,
5878 stream = progress_stream ,
5979 use_color = use_color ,
6080 )
@@ -63,59 +83,65 @@ def resolve_build_invocation(*, request: BuildCommandRequest) -> BuildInvocation
6383 if request .load_sources is not None
6484 else build_effective_settings_config (discovered_inputs = discovered_inputs ).auto_load_sources
6585 )
66- effective_target_name : str | None = resolve_target_name (
67- project_config = discovered_inputs .project_config ,
68- local_config = discovered_inputs .local_config ,
69- selected_target = request .selected_target ,
86+ return BuildInvocation (
87+ effective_project_dir = effective_project_dir ,
88+ discovered_inputs = discovered_inputs ,
89+ effective_defer_clone_from = effective_defer_clone_from ,
90+ adapter_name = adapter_name ,
91+ adapter = adapter ,
92+ connection_config = connection_config ,
93+ use_color = use_color ,
94+ progress_stream = progress_stream ,
95+ connection_progress = reporters .connection ,
96+ planning_progress = reporters .planning ,
97+ should_load_sources = should_load_sources ,
98+ effective_target_name = effective_target_name ,
99+ execution_limits = execution_limits ,
70100 )
101+
102+
103+ def _resolve_execution_limits (
104+ * ,
105+ discovered_inputs : DiscoveredProjectInputs ,
106+ target_name : str | None ,
107+ adapter_name : str ,
108+ adapter : BaseAdapter ,
109+ ) -> ExecutionLimitsConfig :
110+ """Resolve the target's execution limits and validate them against the project adapter."""
111+
71112 execution_limits : ExecutionLimitsConfig = (
72113 resolve_target_config (
73114 project_config = discovered_inputs .project_config ,
74115 local_config = discovered_inputs .local_config ,
75- target_name = effective_target_name ,
116+ target_name = target_name ,
76117 ).execution_limits
77- if effective_target_name is not None
118+ if target_name is not None
78119 else ExecutionLimitsConfig ()
79120 )
121+ target_label : str = target_name or "default"
80122 if (
81123 execution_limits .max_duration is not None
82- and adapter_context . adapter .execution_duration_limit_seconds is None
124+ and adapter .execution_duration_limit_seconds is None
83125 ):
84- target_label : str = effective_target_name or "default"
85126 raise CliUserError (
86127 f"Target '{ target_label } ' configures max_duration, but adapter "
87- f"'{ adapter_context . adapter_name } ' cannot cancel active statements safely" ,
128+ f"'{ adapter_name } ' cannot cancel active statements safely" ,
88129 code = "C415" ,
89130 help = execution_limits .remediation ,
90131 )
91- maximum_duration_seconds : int | None = adapter_context . adapter .execution_duration_limit_seconds
132+ maximum_duration_seconds : int | None = adapter .execution_duration_limit_seconds
92133 if (
93134 execution_limits .max_duration_seconds is not None
94135 and maximum_duration_seconds is not None
95136 and execution_limits .max_duration_seconds > maximum_duration_seconds
96137 ):
97- target_label = effective_target_name or "default"
98138 raise CliUserError (
99139 f"Target '{ target_label } ' max_duration exceeds the largest duration supported by "
100- f"adapter '{ adapter_context . adapter_name } ' ({ maximum_duration_seconds } seconds)" ,
140+ f"adapter '{ adapter_name } ' ({ maximum_duration_seconds } seconds)" ,
101141 code = "C416" ,
102142 help = execution_limits .remediation ,
103143 )
104- return BuildInvocation (
105- effective_project_dir = effective_project_dir ,
106- discovered_inputs = discovered_inputs ,
107- effective_defer_clone_from = effective_defer_clone_from ,
108- adapter_name = adapter_context .adapter_name ,
109- adapter = adapter_context .adapter ,
110- connection_config = adapter_context .connection_config ,
111- use_color = use_color ,
112- progress_stream = progress_stream ,
113- connection_progress = reporters .connection ,
114- planning_progress = reporters .planning ,
115- should_load_sources = should_load_sources ,
116- effective_target_name = effective_target_name ,
117- execution_limits = execution_limits ,
118- )
144+ return execution_limits
119145
120146
121147def _resolve_defer_clone_from (
0 commit comments