|
19 | 19 | from sqlmesh.core import constants as c |
20 | 20 | from sqlmesh.core.console import get_console |
21 | 21 | from sqlmesh.core.macros import RuntimeStage |
| 22 | +from sqlmesh.core.model.common import sorted_python_env_payloads |
22 | 23 | from sqlmesh.core.snapshot import Snapshot, SnapshotId, SnapshotTableInfo |
23 | 24 | from sqlmesh.utils.errors import SQLMeshError |
24 | 25 | from sqlmesh.utils.pydantic import PydanticModel |
@@ -340,22 +341,43 @@ def requirements_diff(self) -> str: |
340 | 341 | ) |
341 | 342 | ) |
342 | 343 |
|
343 | | - def environment_statements_diff(self) -> str: |
| 344 | + def environment_statements_diff(self) -> t.List[t.Tuple[str, str]]: |
344 | 345 | def extract_statements(statements: t.List[EnvironmentStatements], attr: str) -> t.List[str]: |
345 | | - return [str(stmt) for statement in statements for stmt in getattr(statement, attr)] |
346 | | - |
347 | | - def format_diff(runtime_stage: str) -> str: |
348 | | - previous = extract_statements(self.previous_environment_statements, runtime_stage) |
349 | | - current = extract_statements(self.environment_statements, runtime_stage) |
350 | | - return ( |
351 | | - f" {runtime_stage}:\n " + "\n ".join(ndiff(previous, current)) + "\n" |
352 | | - if previous or current |
353 | | - else "" |
354 | | - ) |
| 346 | + return [ |
| 347 | + expr |
| 348 | + for statement in statements |
| 349 | + for expr in ( |
| 350 | + sorted_python_env_payloads(statement.python_env) |
| 351 | + if attr == "python_env" |
| 352 | + else getattr(statement, attr) |
| 353 | + ) |
| 354 | + ] |
355 | 355 |
|
356 | | - return format_diff(RuntimeStage.BEFORE_ALL.value) + format_diff( |
357 | | - RuntimeStage.AFTER_ALL.value |
358 | | - ) |
| 356 | + def compute_diff(attribute: str) -> t.Optional[t.Tuple[str, str]]: |
| 357 | + previous = extract_statements(self.previous_environment_statements, attribute) |
| 358 | + current = extract_statements(self.environment_statements, attribute) |
| 359 | + |
| 360 | + if previous == current: |
| 361 | + return None |
| 362 | + |
| 363 | + diff_lines = list(ndiff(previous, current)) |
| 364 | + diff_text = attribute if not attribute == "python_env" else "dependencies" |
| 365 | + diff_text += ":\n" |
| 366 | + |
| 367 | + if any(line.startswith(("-", "+")) for line in diff_lines): |
| 368 | + diff_text += " " + "\n ".join(diff_lines) + "\n" |
| 369 | + |
| 370 | + return "python" if attribute == "python_env" else "sql", diff_text |
| 371 | + |
| 372 | + return [ |
| 373 | + diff |
| 374 | + for attribute in [ |
| 375 | + RuntimeStage.BEFORE_ALL.value, |
| 376 | + RuntimeStage.AFTER_ALL.value, |
| 377 | + "python_env", |
| 378 | + ] |
| 379 | + if (diff := compute_diff(attribute)) is not None |
| 380 | + ] |
359 | 381 |
|
360 | 382 | @property |
361 | 383 | def environment_snapshots(self) -> t.List[SnapshotTableInfo]: |
|
0 commit comments