Skip to content

Commit 9a7fc7d

Browse files
SNOW-2020306: Add tracking for notebook application
1 parent ed2e886 commit 9a7fc7d

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

src/snowflake/snowpark/_internal/server_connection.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ def _add_application_parameters(self) -> None:
222222
applications.append("streamlit")
223223
if importlib.util.find_spec("snowflake.ml"):
224224
applications.append("SnowparkML")
225+
if importlib.util.find_spec("snowbook"):
226+
applications.append("notebook")
225227
self._lower_case_parameters[PARAM_APPLICATION] = (
226228
":".join(applications) or get_application_name()
227229
)

tests/unit/test_server_connection.py

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44

55
import io
66
import logging
7+
import os
78
from unittest import mock
8-
from unittest.mock import MagicMock
9+
from unittest.mock import MagicMock, patch
910

1011
import pytest
1112

@@ -169,3 +170,71 @@ def test_run_query_when_ignore_results_true(mock_server_connection):
169170
)
170171
mock_server_connection._to_data_or_iter.assert_called()
171172
assert "sfqid" in result and result["sfqid"] == "ignore_results is False"
173+
174+
175+
def test_snowbook_detection_adds_notebook_application(mock_server_connection):
176+
"""Test that 'notebook' is added when snowbook is available."""
177+
with patch("importlib.util.find_spec") as mock_find_spec:
178+
mock_find_spec.side_effect = (
179+
lambda name: mock.MagicMock() if name == "snowbook" else None
180+
)
181+
182+
mock_server_connection._lower_case_parameters = {}
183+
mock_server_connection._add_application_parameters()
184+
185+
assert (
186+
"notebook" in mock_server_connection._lower_case_parameters["application"]
187+
)
188+
189+
190+
def test_snowbook_detection_without_snowbook(mock_server_connection):
191+
"""Test that 'notebook' is not added when snowbook is not available."""
192+
with patch("importlib.util.find_spec", return_value=None):
193+
mock_server_connection._lower_case_parameters = {}
194+
mock_server_connection._add_application_parameters()
195+
196+
assert (
197+
"notebook"
198+
not in mock_server_connection._lower_case_parameters["application"]
199+
)
200+
201+
202+
def test_snowbook_detection_with_multiple_applications(mock_server_connection):
203+
"""Test that snowbook works alongside other application detections."""
204+
with patch("importlib.util.find_spec") as mock_find_spec:
205+
mock_find_spec.side_effect = (
206+
lambda name: mock.MagicMock()
207+
if name in ["streamlit", "snowflake.ml", "snowbook"]
208+
else None
209+
)
210+
211+
mock_server_connection._lower_case_parameters = {}
212+
mock_server_connection._add_application_parameters()
213+
214+
app_param = mock_server_connection._lower_case_parameters["application"]
215+
assert app_param == "streamlit:SnowparkML:notebook"
216+
217+
218+
def test_env_var_partner_takes_precedence(mock_server_connection):
219+
"""Test that ENV_VAR_PARTNER takes precedence over module detection."""
220+
with patch.dict(os.environ, {"SF_PARTNER": "custom_partner"}):
221+
with patch("importlib.util.find_spec", return_value=mock.MagicMock()):
222+
mock_server_connection._lower_case_parameters = {}
223+
mock_server_connection._add_application_parameters()
224+
225+
assert (
226+
mock_server_connection._lower_case_parameters["application"]
227+
== "custom_partner"
228+
)
229+
230+
231+
def test_existing_application_param_not_overwritten(mock_server_connection):
232+
"""Test that existing application parameter is preserved."""
233+
with patch("importlib.util.find_spec", return_value=mock.MagicMock()):
234+
mock_server_connection._lower_case_parameters = {"application": "existing_app"}
235+
mock_server_connection._add_application_parameters()
236+
237+
assert (
238+
mock_server_connection._lower_case_parameters["application"]
239+
== "existing_app"
240+
)

0 commit comments

Comments
 (0)