Skip to content

Commit 685fe21

Browse files
Refactors
1 parent dcd0742 commit 685fe21

6 files changed

Lines changed: 43 additions & 58 deletions

File tree

sqlmesh/core/audit/definition.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
default_catalog_validator,
1717
depends_on_validator,
1818
expression_validator,
19+
python_env_payloads,
1920
)
2021
from sqlmesh.core.model.common import make_python_env, single_value_or_tuple
2122
from sqlmesh.core.node import _Node
@@ -340,12 +341,7 @@ def render_definition(
340341
jinja_expressions = []
341342
python_expressions = []
342343
if include_python:
343-
python_env = d.PythonCode(
344-
expressions=[
345-
v.payload if v.is_import or v.is_definition else f"{k} = {v.payload}"
346-
for k, v in self.sorted_python_env
347-
]
348-
)
344+
python_env = d.PythonCode(expressions=python_env_payloads(self.sorted_python_env))
349345
if python_env.expressions:
350346
python_expressions.append(python_env)
351347

sqlmesh/core/console.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1312,8 +1312,8 @@ def show_model_difference_summary(
13121312

13131313
if context_diff.has_environment_statements_changes:
13141314
self._print("[bold]Environment statements:\n")
1315-
for changes in context_diff.environment_statements_diff():
1316-
self._print(changes)
1315+
for type, diff in context_diff.environment_statements_diff():
1316+
self._print(Syntax(diff, type, line_numbers=False))
13171317

13181318
self._show_summary_tree_for(
13191319
context_diff,
@@ -2464,8 +2464,8 @@ def show_model_difference_summary(
24642464

24652465
if context_diff.has_environment_statements_changes:
24662466
self._print("[bold]Environment statements:\n")
2467-
for changes in context_diff.environment_statements_diff():
2468-
self._print(changes)
2467+
for _, diff in context_diff.environment_statements_diff():
2468+
self._print(diff)
24692469

24702470
added_snapshots = {context_diff.snapshots[s_id] for s_id in context_diff.added}
24712471
added_snapshot_models = {s for s in added_snapshots if s.is_model}
@@ -2979,8 +2979,8 @@ def show_model_difference_summary(
29792979

29802980
if context_diff.has_environment_statements_changes:
29812981
self._write("Environment statements:\n")
2982-
for changes in context_diff.environment_statements_diff():
2983-
self._write(changes)
2982+
for _, diff in context_diff.environment_statements_diff():
2983+
self._write(diff)
29842984

29852985
for added in context_diff.new_snapshots:
29862986
self._write(f" Added: {added}")

sqlmesh/core/context_diff.py

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
import typing as t
1717
from difflib import ndiff
1818
from functools import cached_property
19-
from rich.syntax import Syntax
2019
from sqlmesh.core import constants as c
2120
from sqlmesh.core.console import get_console
2221
from sqlmesh.core.macros import RuntimeStage
22+
from sqlmesh.core.model.common import python_env_payloads
2323
from sqlmesh.core.snapshot import Snapshot, SnapshotId, SnapshotTableInfo
2424
from sqlmesh.utils.errors import SQLMeshError
2525
from sqlmesh.utils.pydantic import PydanticModel
@@ -331,58 +331,47 @@ def requirements_diff(self) -> str:
331331
)
332332
)
333333

334-
def environment_statements_diff(self) -> t.List[Syntax]:
335-
PYTHON_ENV = "python_env"
336-
337-
def extract_python_env(python_env: t.Dict[str, Executable]) -> t.List[str]:
338-
return [
339-
v.payload if v.is_import or v.is_definition else f"{k} = {v.payload}"
340-
for k, v in python_env.items()
341-
]
342-
334+
def environment_statements_diff(self) -> t.List[t.Tuple[str, str]]:
343335
def extract_statements(statements: t.List[EnvironmentStatements], attr: str) -> t.List[str]:
344336
return [
345337
expr
346338
for statement in statements
347339
for expr in (
348-
extract_python_env(statement.python_env)
349-
if attr == PYTHON_ENV
340+
python_env_payloads(
341+
sorted(statement.python_env.items(), key=lambda x: (x[1].kind, x[0]))
342+
)
343+
if attr == "python_env"
350344
else getattr(statement, attr)
351345
)
352346
]
353347

354-
def format_diff(attribute: str) -> t.Optional[Syntax]:
348+
def format_diff(attribute: str) -> t.Optional[t.Tuple[str, str]]:
355349
previous = extract_statements(self.previous_environment_statements, attribute)
356350
current = extract_statements(self.environment_statements, attribute)
357351

358352
if previous == current:
359353
return None
360354

355+
diff_lines = list(ndiff(previous, current))
361356
diff_text = (
362357
f"=== {attribute} ===\n"
363-
if not attribute == PYTHON_ENV
358+
if not attribute == "python_env"
364359
else "=== dependencies ===\n"
365360
)
366361

367-
diff_lines = list(ndiff(previous, current))
368362
if any(line.startswith(("-", "+")) for line in diff_lines):
369363
diff_text += " " + "\n ".join(diff_lines) + "\n"
370364

371-
return Syntax(
372-
diff_text, "python" if attribute == PYTHON_ENV else "sql", line_numbers=False
373-
)
365+
return "python" if attribute == "python_env" else "sql", diff_text
374366

375367
return [
376368
diff
377-
for diff in (
378-
format_diff(attribute)
379-
for attribute in [
380-
RuntimeStage.BEFORE_ALL.value,
381-
RuntimeStage.AFTER_ALL.value,
382-
PYTHON_ENV,
383-
]
384-
)
385-
if diff is not None
369+
for attribute in [
370+
RuntimeStage.BEFORE_ALL.value,
371+
RuntimeStage.AFTER_ALL.value,
372+
"python_env",
373+
]
374+
if (diff := format_diff(attribute)) is not None
386375
]
387376

388377
@property

sqlmesh/core/model/common.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,14 @@ def depends_on(cls: t.Type, v: t.Any, info: ValidationInfo) -> t.Optional[t.Set[
352352
return v
353353

354354

355+
def python_env_payloads(sorted_python_env: t.List[t.Tuple[str, Executable]]) -> t.List[str]:
356+
"""Returns the payloads of the sorted python env."""
357+
return [
358+
v.payload if v.is_import or v.is_definition else f"{k} = {v.payload}"
359+
for k, v in sorted_python_env
360+
]
361+
362+
355363
expression_validator: t.Callable = field_validator(
356364
"query",
357365
"expressions_",

sqlmesh/core/model/definition.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
expression_validator,
3030
make_python_env,
3131
parse_dependencies,
32+
python_env_payloads,
3233
single_value_or_tuple,
3334
)
3435
from sqlmesh.core.model.meta import ModelMeta, FunctionCall
@@ -257,12 +258,7 @@ def render_definition(
257258
jinja_expressions = []
258259
python_expressions = []
259260
if include_python:
260-
python_env = d.PythonCode(
261-
expressions=[
262-
v.payload if v.is_import or v.is_definition else f"{k} = {v.payload}"
263-
for k, v in self.sorted_python_env
264-
]
265-
)
261+
python_env = d.PythonCode(expressions=python_env_payloads(self.sorted_python_env))
266262
if python_env.expressions:
267263
python_expressions.append(python_env)
268264

tests/core/test_plan.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2921,22 +2921,18 @@ def test_plan_environment_statements_diff(make_snapshot):
29212921
assert context_diff.has_environment_statements_changes
29222922

29232923
console_output, terminal_console = create_test_console()
2924-
2925-
for stmt in context_diff.environment_statements_diff():
2926-
terminal_console._print(stmt)
2924+
for _, diff in context_diff.environment_statements_diff():
2925+
terminal_console._print(diff)
29272926
output = console_output.getvalue()
29282927
stripped = strip_ansi_codes(output)
2929-
29302928
expected_output = (
2931-
"=== before_all === \n"
2932-
" + CREATE OR REPLACE TABLE table_1 AS SELECT 1 \n"
2933-
" + @test_macro() \n"
2934-
" \n"
2935-
"=== after_all === \n"
2936-
" + CREATE OR REPLACE TABLE table_2 AS SELECT 2 \n"
2937-
" \n"
2938-
"=== dependencies === \n"
2939-
" + def test_macro(evaluator): \n"
2929+
"=== before_all ===\n"
2930+
" + CREATE OR REPLACE TABLE table_1 AS SELECT 1\n"
2931+
" + @test_macro()\n\n"
2932+
"=== after_all ===\n"
2933+
" + CREATE OR REPLACE TABLE table_2 AS SELECT 2\n\n"
2934+
"=== dependencies ===\n"
2935+
" + def test_macro(evaluator):\n"
29402936
" return 'one'"
29412937
)
29422938
assert stripped == expected_output

0 commit comments

Comments
 (0)