Skip to content

Commit 36634c7

Browse files
committed
responding to PR comments
1 parent dd02020 commit 36634c7

File tree

1 file changed

+91
-2
lines changed

1 file changed

+91
-2
lines changed

src/posit/connect/external/databricks.py

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,45 @@ def __call__(self) -> Dict[str, str]:
9898

9999

100100
class PositContentCredentialsStrategy(CredentialsStrategy):
101-
"""CredentialsStrategy implementation which returns a PositContentCredentialsProvider when called."""
101+
"""`CredentialsStrategy` implementation which supports interacting with Service Account OAuth integrations on Connect.
102+
103+
This strategy callable class returns a `PositContentCredentialsProvider` when hosted on Connect, and
104+
its `local_strategy` strategy otherwise.
105+
106+
Example
107+
-------
108+
from posit.connect.external.databricks import PositContentCredentialsStrategy
109+
110+
import pandas as pd
111+
import requests
112+
113+
from databricks import sql
114+
from databricks.sdk.core import ApiClient, Config, databricks_cli
115+
from databricks.sdk.service.iam import CurrentUserAPI
116+
117+
# env vars
118+
DATABRICKS_HOST = "<REDACTED>"
119+
DATABRICKS_HOST_URL = f"https://{DATABRICKS_HOST}"
120+
SQL_HTTP_PATH = "<REDACTED>"
121+
122+
posit_strategy = PositContentCredentialsStrategy(local_strategy=databricks_cli)
123+
124+
cfg = Config(host=DATABRICKS_HOST_URL, credentials_strategy=posit_strategy)
125+
126+
databricks_user_info = CurrentUserAPI(ApiClient(cfg)).me()
127+
print(f"Hello, {databricks_user_info.display_name}!")
128+
129+
query = "SELECT * FROM samples.nyctaxi.trips LIMIT 10;"
130+
with sql.connect(
131+
server_hostname=DATABRICKS_HOST,
132+
http_path=SQL_HTTP_PATH,
133+
credentials_provider=posit_strategy.sql_credentials_provider(cfg),
134+
) as connection:
135+
with connection.cursor() as cursor:
136+
cursor.execute(query)
137+
rows = cursor.fetchall()
138+
print(pd.DataFrame([row.asDict() for row in rows]))
139+
"""
102140

103141
def __init__(
104142
self,
@@ -135,7 +173,58 @@ def __call__(self, *args, **kwargs) -> CredentialsProvider:
135173

136174

137175
class PositCredentialsStrategy(CredentialsStrategy):
138-
"""CredentialsStrategy implementation which returns a PositContentCredentialsProvider when called."""
176+
"""`CredentialsStrategy` implementation which supports interacting with Viewer OAuth integrations on Connect.
177+
178+
This strategy callable class returns a `PositCredentialsProvider` when hosted on Connect, and
179+
its `local_strategy` strategy otherwise.
180+
181+
Example
182+
-------
183+
import os
184+
185+
import pandas as pd
186+
from databricks import sql
187+
from databricks.sdk.core import ApiClient, Config, databricks_cli
188+
from databricks.sdk.service.iam import CurrentUserAPI
189+
from posit.connect.external.databricks import PositCredentialsStrategy
190+
from shiny import App, Inputs, Outputs, Session, render, ui
191+
192+
# env vars
193+
DATABRICKS_HOST = "<REDACTED>"
194+
DATABRICKS_HOST_URL = f"https://{DATABRICKS_HOST}"
195+
SQL_HTTP_PATH = "<REDACTED>"
196+
197+
app_ui = ui.page_fluid(ui.output_text("text"), ui.output_data_frame("result"))
198+
199+
def server(i: Inputs, o: Outputs, session: Session):
200+
session_token = session.http_conn.headers.get("Posit-Connect-User-Session-Token")
201+
posit_strategy = PositCredentialsStrategy(
202+
local_strategy=databricks_cli, user_session_token=session_token
203+
)
204+
cfg = Config(host=DATABRICKS_HOST_URL, credentials_strategy=posit_strategy)
205+
206+
@render.data_frame
207+
def result():
208+
query = "SELECT * FROM samples.nyctaxi.trips LIMIT 10;"
209+
210+
with sql.connect(
211+
server_hostname=DATABRICKS_HOST,
212+
http_path=SQL_HTTP_PATH,
213+
credentials_provider=posit_strategy.sql_credentials_provider(cfg),
214+
) as connection:
215+
with connection.cursor() as cursor:
216+
cursor.execute(query)
217+
rows = cursor.fetchall()
218+
df = pd.DataFrame(rows, columns=[col[0] for col in cursor.description])
219+
return df
220+
221+
@render.text
222+
def text():
223+
databricks_user_info = CurrentUserAPI(ApiClient(cfg)).me()
224+
return f"Hello, {databricks_user_info.display_name}!"
225+
226+
app = App(app_ui, server)
227+
"""
139228

140229
def __init__(
141230
self,

0 commit comments

Comments
 (0)