Skip to content

Commit 57729f8

Browse files
Decouple environment and model difference summary
1 parent c7ef114 commit 57729f8

4 files changed

Lines changed: 96 additions & 45 deletions

File tree

sqlmesh/core/console.py

Lines changed: 76 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -282,13 +282,20 @@ def stop_env_migration_progress(self, success: bool = True) -> None:
282282
"""Stop the environment migration progress."""
283283

284284
@abc.abstractmethod
285-
def show_difference_summary(
285+
def show_environment_difference_summary(
286+
self,
287+
context_diff: ContextDiff,
288+
no_diff: bool = True,
289+
) -> None:
290+
"""Displays a summary of differences for the environment."""
291+
292+
@abc.abstractmethod
293+
def show_model_difference_summary(
286294
self,
287295
context_diff: ContextDiff,
288296
environment_naming_info: EnvironmentNamingInfo,
289297
default_catalog: t.Optional[str],
290298
no_diff: bool = True,
291-
show_environment_statements: bool = True,
292299
) -> None:
293300
"""Displays a summary of differences for the given models."""
294301

@@ -552,14 +559,19 @@ def update_state_import_progress(
552559
def stop_state_import(self, success: bool, input_file: Path) -> None:
553560
pass
554561

555-
def show_difference_summary(
562+
def show_environment_difference_summary(
563+
self,
564+
context_diff: ContextDiff,
565+
no_diff: bool = True,
566+
) -> None:
567+
pass
568+
569+
def show_model_difference_summary(
556570
self,
557571
context_diff: ContextDiff,
558572
environment_naming_info: EnvironmentNamingInfo,
559573
default_catalog: t.Optional[str],
560574
no_diff: bool = True,
561-
show_environment_statements: bool = True,
562-
ignored_snapshot_ids: t.Optional[t.Set[SnapshotId]] = None,
563575
) -> None:
564576
pass
565577

@@ -1326,21 +1338,16 @@ def stop_state_import(self, success: bool, input_file: Path) -> None:
13261338
else:
13271339
self.log_error("State import failed!")
13281340

1329-
def show_difference_summary(
1341+
def show_environment_difference_summary(
13301342
self,
13311343
context_diff: ContextDiff,
1332-
environment_naming_info: EnvironmentNamingInfo,
1333-
default_catalog: t.Optional[str],
13341344
no_diff: bool = True,
1335-
show_environment_statements: bool = True,
13361345
) -> None:
1337-
"""Shows a summary of the differences.
1346+
"""Shows a summary of the environment differences.
13381347
13391348
Args:
13401349
context_diff: The context diff to use to print the summary
1341-
environment_naming_info: The environment naming info to reference when printing model names
1342-
default_catalog: The default catalog to reference when deciding to remove catalog from display names
1343-
no_diff: Hide the actual SQL differences.
1350+
no_diff: Hide the actual environment statement differences.
13441351
"""
13451352
if context_diff.is_new_environment:
13461353
msg = (
@@ -1375,13 +1382,28 @@ def show_difference_summary(
13751382
if context_diff.has_requirement_changes:
13761383
self._print(f"[bold]Requirements:\n{context_diff.requirements_diff()}")
13771384

1378-
if context_diff.has_environment_statements_changes and show_environment_statements:
1385+
if context_diff.has_environment_statements_changes and not no_diff:
13791386
self._print("[bold]Environment statements:\n")
13801387
for type, diff in context_diff.environment_statements_diff(
13811388
include_python_env=not context_diff.is_new_environment
13821389
):
13831390
self._print(Syntax(diff, type, line_numbers=False))
13841391

1392+
def show_model_difference_summary(
1393+
self,
1394+
context_diff: ContextDiff,
1395+
environment_naming_info: EnvironmentNamingInfo,
1396+
default_catalog: t.Optional[str],
1397+
no_diff: bool = True,
1398+
) -> None:
1399+
"""Shows a summary of the model differences.
1400+
1401+
Args:
1402+
context_diff: The context diff to use to print the summary
1403+
environment_naming_info: The environment naming info to reference when printing model names
1404+
default_catalog: The default catalog to reference when deciding to remove catalog from display names
1405+
no_diff: Hide the actual SQL differences.
1406+
"""
13851407
self._show_summary_tree_for(
13861408
context_diff,
13871409
"Models",
@@ -1557,13 +1579,18 @@ def _prompt_categorize(
15571579
"""Get the user's change category for the directly modified models."""
15581580
plan = plan_builder.build()
15591581

1560-
self.show_difference_summary(
1582+
self.show_environment_difference_summary(
15611583
plan.context_diff,
1562-
plan.environment_naming_info,
1563-
default_catalog=default_catalog,
1564-
show_environment_statements=not no_diff,
1584+
no_diff=no_diff,
15651585
)
15661586

1587+
if plan.context_diff.has_changes:
1588+
self.show_model_difference_summary(
1589+
plan.context_diff,
1590+
plan.environment_naming_info,
1591+
default_catalog=default_catalog,
1592+
)
1593+
15671594
if not no_diff:
15681595
self._show_categorized_snapshots(plan, default_catalog)
15691596

@@ -2503,21 +2530,16 @@ class MarkdownConsole(CaptureTerminalConsole):
25032530
def __init__(self, **kwargs: t.Any) -> None:
25042531
super().__init__(**{**kwargs, "console": RichConsole(no_color=True)})
25052532

2506-
def show_difference_summary(
2533+
def show_environment_difference_summary(
25072534
self,
25082535
context_diff: ContextDiff,
2509-
environment_naming_info: EnvironmentNamingInfo,
2510-
default_catalog: t.Optional[str],
25112536
no_diff: bool = True,
2512-
show_environment_statements: bool = True,
25132537
) -> None:
2514-
"""Shows a summary of the differences.
2538+
"""Shows a summary of the environment differences.
25152539
25162540
Args:
25172541
context_diff: The context diff to use to print the summary.
2518-
environment_naming_info: The environment naming info to reference when printing model names
2519-
default_catalog: The default catalog to reference when deciding to remove catalog from display names
2520-
no_diff: Hide the actual SQL differences.
2542+
no_diff: Hide the actual environment statements differences.
25212543
"""
25222544
if context_diff.is_new_environment:
25232545
self._print(
@@ -2535,13 +2557,28 @@ def show_difference_summary(
25352557
if context_diff.has_requirement_changes:
25362558
self._print(f"Requirements:\n{context_diff.requirements_diff()}")
25372559

2538-
if context_diff.has_environment_statements_changes and show_environment_statements:
2560+
if context_diff.has_environment_statements_changes and not no_diff:
25392561
self._print("[bold]Environment statements:\n")
25402562
for _, diff in context_diff.environment_statements_diff(
25412563
include_python_env=not context_diff.is_new_environment
25422564
):
25432565
self._print(diff)
25442566

2567+
def show_model_difference_summary(
2568+
self,
2569+
context_diff: ContextDiff,
2570+
environment_naming_info: EnvironmentNamingInfo,
2571+
default_catalog: t.Optional[str],
2572+
no_diff: bool = True,
2573+
) -> None:
2574+
"""Shows a summary of the model differences.
2575+
2576+
Args:
2577+
context_diff: The context diff to use to print the summary.
2578+
environment_naming_info: The environment naming info to reference when printing model names
2579+
default_catalog: The default catalog to reference when deciding to remove catalog from display names
2580+
no_diff: Hide the actual SQL differences.
2581+
"""
25452582
added_snapshots = {context_diff.snapshots[s_id] for s_id in context_diff.added}
25462583
added_snapshot_models = {s for s in added_snapshots if s.is_model}
25472584
if added_snapshot_models:
@@ -3044,26 +3081,32 @@ def update_env_migration_progress(self, num_tasks: int) -> None:
30443081
def stop_env_migration_progress(self, success: bool = True) -> None:
30453082
self._write(f"Stopping environment migration with success={success}")
30463083

3047-
def show_difference_summary(
3084+
def show_environment_difference_summary(
30483085
self,
30493086
context_diff: ContextDiff,
3050-
environment_naming_info: EnvironmentNamingInfo,
3051-
default_catalog: t.Optional[str],
30523087
no_diff: bool = True,
3053-
show_environment_statements: bool = True,
30543088
) -> None:
3055-
self._write("Model Difference Summary:")
3089+
self._write("Environment Difference Summary:")
30563090

30573091
if context_diff.has_requirement_changes:
30583092
self._write(f"Requirements:\n{context_diff.requirements_diff()}")
30593093

3060-
if context_diff.has_environment_statements_changes and show_environment_statements:
3094+
if context_diff.has_environment_statements_changes and not no_diff:
30613095
self._write("Environment statements:\n")
30623096
for _, diff in context_diff.environment_statements_diff(
30633097
include_python_env=not context_diff.is_new_environment
30643098
):
30653099
self._write(diff)
30663100

3101+
def show_model_difference_summary(
3102+
self,
3103+
context_diff: ContextDiff,
3104+
environment_naming_info: EnvironmentNamingInfo,
3105+
default_catalog: t.Optional[str],
3106+
no_diff: bool = True,
3107+
) -> None:
3108+
self._write("Model Difference Summary:")
3109+
30673110
for added in context_diff.new_snapshots:
30683111
self._write(f" Added: {added}")
30693112
for removed in context_diff.removed_snapshots:

sqlmesh/core/context.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,18 +1533,22 @@ def diff(self, environment: t.Optional[str] = None, detailed: bool = False) -> b
15331533
environment = environment or self.config.default_target_environment
15341534
environment = Environment.sanitize_name(environment)
15351535
context_diff = self._context_diff(environment)
1536-
self.console.show_difference_summary(
1536+
self.console.show_environment_difference_summary(
15371537
context_diff,
1538-
EnvironmentNamingInfo.from_environment_catalog_mapping(
1539-
self.config.environment_catalog_mapping,
1540-
name=environment,
1541-
suffix_target=self.config.environment_suffix_target,
1542-
normalize_name=context_diff.normalize_environment_name,
1543-
),
1544-
self.default_catalog,
15451538
no_diff=not detailed,
1546-
show_environment_statements=detailed,
15471539
)
1540+
if context_diff.has_changes:
1541+
self.console.show_model_difference_summary(
1542+
context_diff,
1543+
EnvironmentNamingInfo.from_environment_catalog_mapping(
1544+
self.config.environment_catalog_mapping,
1545+
name=environment,
1546+
suffix_target=self.config.environment_suffix_target,
1547+
normalize_name=context_diff.normalize_environment_name,
1548+
),
1549+
self.default_catalog,
1550+
no_diff=not detailed,
1551+
)
15481552
return context_diff.has_changes
15491553

15501554
@python_api_analytics

sqlmesh/integrations/github/cicd/controller.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,12 +457,15 @@ def get_plan_summary(self, plan: Plan) -> str:
457457
try:
458458
# Clear out any output that might exist from prior steps
459459
self._console.clear_captured_outputs()
460-
self._console.show_difference_summary(
460+
self._console.show_environment_difference_summary(
461+
context_diff=plan.context_diff,
462+
no_diff=False,
463+
)
464+
self._console.show_model_difference_summary(
461465
context_diff=plan.context_diff,
462466
environment_naming_info=plan.environment_naming_info,
463467
default_catalog=self._context.default_catalog,
464468
no_diff=False,
465-
show_environment_statements=True,
466469
)
467470
difference_summary = self._console.consume_captured_output()
468471
self._console._show_missing_dates(plan, self._context.default_catalog)

tests/core/test_context.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,8 @@ def test_diff(sushi_context: Context, mocker: MockerFixture):
287287

288288
sushi_context.upsert_model("sushi.customers", query=parse_one("select 1 as customer_id"))
289289
sushi_context.diff("test")
290-
assert mock_console.show_difference_summary.called
290+
assert mock_console.show_environment_difference_summary.called
291+
assert mock_console.show_model_difference_summary.called
291292
assert success
292293

293294

0 commit comments

Comments
 (0)