Skip to content

Commit d959af4

Browse files
committed
feat: support jinja in dbt vars
1 parent 4c94ee1 commit d959af4

File tree

5 files changed

+22
-5
lines changed

5 files changed

+22
-5
lines changed

sqlmesh/dbt/context.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ def add_variables(self, variables: t.Dict[str, t.Any]) -> None:
101101
self._jinja_environment = None
102102

103103
def set_and_render_variables(self, variables: t.Dict[str, t.Any], package: str) -> None:
104-
jinja_environment = self.jinja_macros.build_environment(**self.jinja_globals)
104+
package_macros = self.jinja_macros.copy(
105+
update={"top_level_packages": [*self.jinja_macros.top_level_packages, package]}
106+
)
107+
jinja_environment = package_macros.build_environment(**self.jinja_globals)
105108

106109
def _render_var(value: t.Any) -> t.Any:
107110
if isinstance(value, str):

tests/dbt/test_config.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from pytest_mock import MockerFixture
99

1010
from sqlglot import exp
11+
12+
from sqlmesh import Context
1113
from sqlmesh.core.audit import StandaloneAudit
1214
from sqlmesh.core.config import Config, ModelDefaultsConfig
1315
from sqlmesh.core.dialect import jinja_query
@@ -360,7 +362,7 @@ def test_variables(assert_exp_eq, sushi_test_project):
360362
# Finally, check that variable scoping & overwriting (some_var) works as expected
361363
expected_sushi_variables = {
362364
"yet_another_var": 1,
363-
"top_waiters:limit": 10,
365+
"top_waiters:limit": "{{ get_top_waiters_limit() }}",
364366
"top_waiters:revenue": "revenue",
365367
"customers:boo": ["a", "b"],
366368
"nested_vars": {
@@ -389,6 +391,11 @@ def test_variables(assert_exp_eq, sushi_test_project):
389391
assert sushi_test_project.packages["customers"].variables == expected_customer_variables
390392

391393

394+
@pytest.mark.slow
395+
def test_jinja_in_dbt_variables(sushi_test_dbt_context: Context):
396+
assert sushi_test_dbt_context.render("sushi.top_waiters").sql().endswith("LIMIT 10")
397+
398+
392399
@pytest.mark.slow
393400
def test_nested_variables(sushi_test_project):
394401
model_config = ModelConfig(

tests/dbt/test_manifest.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ def test_manifest_helper(caplog):
3434
refs={"sushi.waiter_revenue_by_day", "waiter_revenue_by_day"},
3535
variables={"top_waiters:revenue", "top_waiters:limit"},
3636
model_attrs={"columns", "config"},
37-
macros=[MacroReference(name="ref"), MacroReference(name="var")],
37+
macros=[
38+
MacroReference(name="get_top_waiters_limit"),
39+
MacroReference(name="ref"),
40+
MacroReference(name="var"),
41+
],
3842
)
3943
assert models["top_waiters"].materialized == "view"
4044
assert models["top_waiters"].dialect_ == "postgres"
@@ -181,7 +185,7 @@ def test_variable_override():
181185
profile.target,
182186
model_defaults=ModelDefaultsConfig(start="2020-01-01"),
183187
)
184-
assert helper.models()["top_waiters"].limit_value == 10
188+
assert helper.models()["top_waiters"].limit_value.strip() == "10"
185189

186190
helper = ManifestHelper(
187191
project_path,

tests/fixtures/dbt/sushi_test/dbt_project.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ sources:
3939
identifier: false
4040

4141
vars:
42-
top_waiters:limit: 10
42+
top_waiters:limit: "{{ get_top_waiters_limit() }}"
4343
'top_waiters:revenue': "revenue"
4444

4545
# The following are only used for testing purposes
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{% macro get_top_waiters_limit() %}
2+
10
3+
{% endmacro %}

0 commit comments

Comments
 (0)