Skip to content

Commit 264f6d9

Browse files
authored
Fix: Make sure that builtin dbt macros can be referenced using the 'dbt.' prefix (#2143)
1 parent 9be44c1 commit 264f6d9

File tree

4 files changed

+27
-5
lines changed

4 files changed

+27
-5
lines changed

docs/integrations/dbt.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ SQLMesh supports running dbt projects using the majority of dbt jinja methods, i
219219
The dbt jinja methods that are not currently supported are:
220220
221221
* debug
222-
* run_started_at
223222
* selected_sources
224223
* adapter.expand_target_column_types
225224
* adapter.rename_relation

sqlmesh/dbt/builtin.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from sqlmesh.dbt.target import TARGET_TYPE_TO_CONFIG_CLASS
2020
from sqlmesh.dbt.util import DBT_VERSION
2121
from sqlmesh.utils import AttributeDict, yaml
22+
from sqlmesh.utils.date import now
2223
from sqlmesh.utils.errors import ConfigError, MacroEvalError
2324
from sqlmesh.utils.jinja import JinjaMacroRegistry, MacroReference, MacroReturnVal
2425

@@ -366,6 +367,9 @@ def create_builtin_globals(
366367
}
367368
)
368369

370+
builtin_globals["run_started_at"] = jinja_globals.get("execution_dt") or now()
371+
builtin_globals["dbt"] = AttributeDict(builtin_globals)
372+
369373
return {**builtin_globals, **jinja_globals}
370374

371375

sqlmesh/utils/jinja.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,12 +267,20 @@ def build_environment(self, **kwargs: t.Any) -> Environment:
267267
if self.root_package_name is not None:
268268
package_macros[self.root_package_name].update(root_macros)
269269

270-
for top_level_package_name in self.top_level_packages:
271-
root_macros.update(package_macros.get(top_level_package_name, {}))
272-
273270
env = environment()
274271

275-
context.update(self._create_builtin_globals(kwargs))
272+
builtin_globals = self._create_builtin_globals(kwargs)
273+
for top_level_package_name in self.top_level_packages:
274+
# Make sure that the top-level package doesn't fully override the same builtin package.
275+
package_macros[top_level_package_name] = AttributeDict(
276+
{
277+
**(builtin_globals.pop(top_level_package_name, None) or {}),
278+
**(package_macros.get(top_level_package_name) or {}),
279+
}
280+
)
281+
root_macros.update(package_macros[top_level_package_name])
282+
283+
context.update(builtin_globals)
276284
context.update(root_macros)
277285
context.update(package_macros)
278286

tests/dbt/test_transformation.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from dbt.adapters.base import BaseRelation
99
from dbt.contracts.relation import Policy
1010
from dbt.exceptions import CompilationError
11+
from freezegun import freeze_time
1112
from pytest_mock.plugin import MockerFixture
1213
from sqlglot import exp, parse_one
1314

@@ -791,3 +792,13 @@ def test_snapshot_json_payload():
791792
"database": "memory",
792793
"target_name": "in_memory",
793794
}
795+
796+
797+
@freeze_time("2023-01-08 00:00:00")
798+
def test_dbt_package_macros(sushi_test_project: Project):
799+
context = sushi_test_project.context
800+
801+
# Make sure external macros are available.
802+
assert context.render("{{ dbt.current_timestamp() }}") == "now()"
803+
# Make sure builtins are available too.
804+
assert context.render("{{ dbt.run_started_at }}") == "2023-01-08 00:00:00+00:00"

0 commit comments

Comments
 (0)