Skip to content

Commit 31d590c

Browse files
authored
Retry DatabricksCredentials._connection_keys to show only meaningful configs (databricks#145)
### Description Retry: `DatabricksCredentials._connection_keys` to show only meaningful configs (databricks#138). Assuming `DatabricksCredentials.connection_info(self, *, with_aliases: bool = False)` is called from only: - `Profile` with `with_aliases=True` - `DebugTask` without `with_aliases` (`False` by default) Thus, if `with_aliases` is `True`, `DatabricksCredentials._connection_keys` should return the same tuple as the current one for the internal use; otherwise it can use `catalog` to show in the debug output.
1 parent 249de67 commit 31d590c

File tree

2 files changed

+76
-3
lines changed

2 files changed

+76
-3
lines changed

dbt/adapters/databricks/connections.py

+37-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
11
from contextlib import contextmanager
22
from dataclasses import dataclass
3+
import itertools
34
import re
45
import time
5-
from typing import Any, Callable, ClassVar, Dict, Iterator, List, Optional, Sequence, Tuple
6+
from typing import (
7+
Any,
8+
Callable,
9+
ClassVar,
10+
Dict,
11+
Iterable,
12+
Iterator,
13+
List,
14+
Optional,
15+
Sequence,
16+
Tuple,
17+
)
618

719
from agate import Table
820

@@ -97,8 +109,30 @@ def type(self) -> str:
97109
def unique_field(self) -> str:
98110
return self.host
99111

100-
def _connection_keys(self) -> Tuple[str, ...]:
101-
connection_keys = ["host", "http_path", "database", "schema"]
112+
def connection_info(self, *, with_aliases: bool = False) -> Iterable[Tuple[str, Any]]:
113+
as_dict = self.to_dict(omit_none=False)
114+
connection_keys = set(self._connection_keys(with_aliases=with_aliases))
115+
aliases: List[str] = []
116+
if with_aliases:
117+
aliases = [k for k, v in self._ALIASES.items() if v in connection_keys]
118+
for key in itertools.chain(self._connection_keys(with_aliases=with_aliases), aliases):
119+
if key in as_dict:
120+
yield key, as_dict[key]
121+
122+
def _connection_keys(self, *, with_aliases: bool = False) -> Tuple[str, ...]:
123+
# Assuming `DatabricksCredentials.connection_info(self, *, with_aliases: bool = False)`
124+
# is called from only:
125+
#
126+
# - `Profile` with `with_aliases=True`
127+
# - `DebugTask` without `with_aliases` (`False` by default)
128+
#
129+
# Thus, if `with_aliases` is `True`, `DatabricksCredentials._connection_keys` should return
130+
# the internal key names; otherwise it can use aliases to show in `dbt debug`.
131+
connection_keys = ["host", "http_path", "schema"]
132+
if with_aliases:
133+
connection_keys.insert(2, "database")
134+
elif self.database:
135+
connection_keys.insert(2, "catalog")
102136
if self.session_properties:
103137
connection_keys.append("session_properties")
104138
return tuple(connection_keys)

tests/integration/debug/test_debug.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from io import StringIO
2+
from unittest import mock
3+
4+
from tests.integration.base import DBTIntegrationTest, use_profile
5+
6+
7+
class TestDebug(DBTIntegrationTest):
8+
@property
9+
def schema(self):
10+
return "debug"
11+
12+
@property
13+
def models(self):
14+
return "models"
15+
16+
def run_and_test(self, contains_catalog: bool):
17+
with mock.patch("sys.stdout", new=StringIO()) as fake_out:
18+
self.run_dbt(["debug"])
19+
stdout = fake_out.getvalue()
20+
self.assertIn("host: ", stdout)
21+
self.assertIn("http_path: ", stdout)
22+
self.assertIn("schema: ", stdout)
23+
(self.assertIn if contains_catalog else self.assertNotIn)("catalog: ", stdout)
24+
25+
@use_profile("databricks_cluster")
26+
def test_debug_databricks_cluster(self):
27+
self.run_and_test(contains_catalog=False)
28+
29+
@use_profile("databricks_sql_endpoint")
30+
def test_debug_databricks_sql_endpoint(self):
31+
self.run_and_test(contains_catalog=False)
32+
33+
@use_profile("databricks_uc_cluster")
34+
def test_debug_databricks_uc_cluster(self):
35+
self.run_and_test(contains_catalog=True)
36+
37+
@use_profile("databricks_uc_sql_endpoint")
38+
def test_debug_databricks_uc_sql_endpoint(self):
39+
self.run_and_test(contains_catalog=True)

0 commit comments

Comments
 (0)