Skip to content
This repository was archived by the owner on May 17, 2024. It is now read-only.

Commit 57c150d

Browse files
authored
Merge pull request #627 from datafold/LAB-70
only render jinja in the specified profile target
2 parents 8772c47 + d293c48 commit 57c150d

File tree

3 files changed

+23
-16
lines changed

3 files changed

+23
-16
lines changed

data_diff/dbt_parser.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -258,35 +258,38 @@ def get_connection_creds(self) -> Tuple[Dict[str, str], str]:
258258
dbt_profile_var,
259259
DataDiffDbtProfileNotFoundError(f"No profile '{dbt_profile_var}' found in '{profiles_path}'."),
260260
)
261-
# values can contain env_vars
262-
rendered_profile = ProfileRenderer().render_data(profile)
263261
profile_target = get_from_dict_with_raise(
264-
rendered_profile,
262+
profile,
265263
"target",
266264
DataDiffDbtProfileNotFoundError(f"No target found in profile '{dbt_profile_var}' in '{profiles_path}'."),
267265
)
266+
267+
# some use an env var in target:
268+
rendered_profile_target = ProfileRenderer().render_data(profile_target)
269+
268270
outputs = get_from_dict_with_raise(
269-
rendered_profile,
271+
profile,
270272
"outputs",
271273
DataDiffDbtProfileNotFoundError(f"No outputs found in profile '{dbt_profile_var}' in '{profiles_path}'."),
272274
)
273275
credentials = get_from_dict_with_raise(
274276
outputs,
275-
profile_target,
277+
rendered_profile_target,
276278
DataDiffDbtProfileNotFoundError(
277-
f"No credentials found for target '{profile_target}' in profile '{dbt_profile_var}' in '{profiles_path}'."
279+
f"No credentials found for target '{rendered_profile_target}' in profile '{dbt_profile_var}' in '{profiles_path}'."
278280
),
279281
)
280282
conn_type = get_from_dict_with_raise(
281283
credentials,
282284
"type",
283285
DataDiffDbtProfileNotFoundError(
284-
f"No type found for target '{profile_target}' in profile '{dbt_profile_var}' in '{profiles_path}'."
286+
f"No type found for target '{rendered_profile_target}' in profile '{dbt_profile_var}' in '{profiles_path}'."
285287
),
286288
)
287289
conn_type = conn_type.lower()
288290

289-
return credentials, conn_type
291+
# resolve any jinja
292+
return ProfileRenderer().render_data(credentials), conn_type
290293

291294
def set_connection(self):
292295
credentials, conn_type = self.get_connection_creds()

tests/dbt_artifacts/profiles.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,7 @@ jaffle_shop:
55
type: duckdb
66
path: "./tests/dbt_artifacts/jaffle_shop.duckdb"
77
schema: dev
8+
different_dev:
9+
type: duckdb
10+
path: "./tests/dbt_artifacts/jaffle_shop.duckdb"
11+
schema: "{{ env_var('some_env_var') }}"

tests/test_dbt_parser.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -342,13 +342,13 @@ def test_get_connection_creds_success(self, mock_open, mock_profile_renderer, mo
342342
"target": "a_target",
343343
}
344344
}
345-
profile = profiles_dict["a_profile"]
345+
target = profiles_dict["a_profile"]["target"]
346346
expected_credentials = profiles_dict["a_profile"]["outputs"]["a_target"]
347347
mock_self = Mock()
348348
mock_self.profiles_dir = Path()
349349
mock_self.project_dict = {"profile": "a_profile"}
350350
mock_yaml.safe_load.return_value = profiles_dict
351-
mock_profile_renderer().render_data.return_value = profile
351+
mock_profile_renderer().render_data.side_effect = [target, expected_credentials]
352352
credentials, conn_type = DbtParser.get_connection_creds(mock_self)
353353
self.assertEqual(credentials, expected_credentials)
354354
self.assertEqual(conn_type, "type1")
@@ -420,8 +420,8 @@ def test_get_connection_no_credentials(self, mock_open, mock_profile_renderer, m
420420
mock_self.profiles_dir = Path()
421421
mock_self.project_dict = {"profile": "a_profile"}
422422
mock_yaml.safe_load.return_value = profiles_dict
423-
profile = profiles_dict["a_profile"]
424-
mock_profile_renderer().render_data.return_value = profile
423+
profile_target = profiles_dict["a_profile"]["target"]
424+
mock_profile_renderer().render_data.return_value = profile_target
425425
with self.assertRaises(DataDiffDbtProfileNotFoundError):
426426
_, _ = DbtParser.get_connection_creds(mock_self)
427427

@@ -440,8 +440,8 @@ def test_get_connection_no_target_credentials(self, mock_open, mock_profile_rend
440440
mock_self = Mock()
441441
mock_self.profiles_dir = Path()
442442
mock_self.project_dict = {"profile": "a_profile"}
443-
profile = profiles_dict["a_profile"]
444-
mock_profile_renderer().render_data.return_value = profile
443+
profile_target = profiles_dict["a_profile"]["target"]
444+
mock_profile_renderer().render_data.return_value = profile_target
445445
mock_yaml.safe_load.return_value = profiles_dict
446446
with self.assertRaises(DataDiffDbtProfileNotFoundError):
447447
_, _ = DbtParser.get_connection_creds(mock_self)
@@ -460,7 +460,7 @@ def test_get_connection_no_type(self, mock_open, mock_profile_renderer, mock_yam
460460
mock_self.profiles_dir = Path()
461461
mock_self.project_dict = {"profile": "a_profile"}
462462
mock_yaml.safe_load.return_value = profiles_dict
463-
profile = profiles_dict["a_profile"]
464-
mock_profile_renderer().render_data.return_value = profile
463+
profile_target = profiles_dict["a_profile"]["target"]
464+
mock_profile_renderer().render_data.return_value = profile_target
465465
with self.assertRaises(DataDiffDbtProfileNotFoundError):
466466
_, _ = DbtParser.get_connection_creds(mock_self)

0 commit comments

Comments
 (0)