diff --git a/data_studio_jupyter_extensions/configurables/kernelspecs.py b/data_studio_jupyter_extensions/configurables/kernelspecs.py index 530d3e3087..d99fb62085 100644 --- a/data_studio_jupyter_extensions/configurables/kernelspecs.py +++ b/data_studio_jupyter_extensions/configurables/kernelspecs.py @@ -75,8 +75,14 @@ def _fetch_kernel_specs(self): self._cache = response for spec in self._cache.values(): - language = spec["language"] - spec["resource_dir"] = os.path.join(DEFAULT_KERNEL_RESOURCES_PATH, language) + # If resourceDir is set, use it. + if spec.get("resourceDir", ""): + spec["resource_dir"] = spec["resourceDir"] + else: + language = spec["language"] + spec["resource_dir"] = os.path.join( + DEFAULT_KERNEL_RESOURCES_PATH, language + ) self._cache_time = time.time() return self._cache diff --git a/data_studio_jupyter_extensions/tests/configurables/test_kernelspecs.py b/data_studio_jupyter_extensions/tests/configurables/test_kernelspecs.py index 7f2c73ce16..f6612c3745 100644 --- a/data_studio_jupyter_extensions/tests/configurables/test_kernelspecs.py +++ b/data_studio_jupyter_extensions/tests/configurables/test_kernelspecs.py @@ -1,3 +1,5 @@ +import os + import pytest from jupyter_client.kernelspec import NoSuchKernel @@ -7,6 +9,7 @@ NotebookServiceClient, ) from data_studio_jupyter_extensions.tests.mock.client import MockNotebookServiceClient +from data_studio_jupyter_extensions.utils import DEFAULT_KERNEL_RESOURCES_PATH @pytest.fixture @@ -30,8 +33,14 @@ def test_init_kernelspec_manager(project_id, notebook_id, app_base_url, datastud def test_fetch_kernel_specs(notebook_service_client): ksm = DSKernelSpecManager(nbservice_client=notebook_service_client) specs = ksm._fetch_kernel_specs() + assert "python3" in specs + resource_dir = os.path.join(DEFAULT_KERNEL_RESOURCES_PATH, "python") + assert resource_dir == specs["python3"]["resource_dir"] + assert "spark" in specs + assert "/usr/local/share/jupyter/kernels/scala" == specs["spark"]["resource_dir"] + # This method should cache the kernelspecs. assert ksm._cache == specs diff --git a/data_studio_jupyter_extensions/tests/mock/client.py b/data_studio_jupyter_extensions/tests/mock/client.py index 8e6733dfbe..c8c77d2ff4 100644 --- a/data_studio_jupyter_extensions/tests/mock/client.py +++ b/data_studio_jupyter_extensions/tests/mock/client.py @@ -11,12 +11,13 @@ def kernelspec_model(name, spec_dict): - # Taken from https://github.pie.apple.com/zsailer/notebook_service_gateway/blob/main/notebook_service_gateway/handlers.py + # Taken from https://github.pie.apple.com/pie-data-studio/notebook_service_gateway/blob/main/data_studio_notebook_service_gateway/handlers/kernels.py # because notebook-service's OpenAPI spec is outdated. d = spec_dict d["interruptMode"] = d["interrupt_mode"] del d["interrupt_mode"] - d["resourceDir"] = "" + if "resourceDir" not in d: + d["resourceDir"] = "" d["metadata"].update({"datastudio": ["id", name]}) return d diff --git a/data_studio_jupyter_extensions/tests/mock/notebook-service-spec.yaml b/data_studio_jupyter_extensions/tests/mock/notebook-service-spec.yaml index 282517a752..3541105df8 100644 --- a/data_studio_jupyter_extensions/tests/mock/notebook-service-spec.yaml +++ b/data_studio_jupyter_extensions/tests/mock/notebook-service-spec.yaml @@ -232,6 +232,8 @@ components: display_name: Spark 3 language: scala interrupt_mode: message + # TODO (andreyvelich): We should use resource_dir in the future. + resourceDir: /usr/local/share/jupyter/kernels/scala metadata: datastudio: spec_id: 15756161