diff --git a/src/notebooks/controllers/ipywidgets/scriptSourceProvider/nbExtensionsPathProvider.node.ts b/src/notebooks/controllers/ipywidgets/scriptSourceProvider/nbExtensionsPathProvider.node.ts index 986e28515fb..a5833ed94f1 100644 --- a/src/notebooks/controllers/ipywidgets/scriptSourceProvider/nbExtensionsPathProvider.node.ts +++ b/src/notebooks/controllers/ipywidgets/scriptSourceProvider/nbExtensionsPathProvider.node.ts @@ -25,6 +25,18 @@ export class NbExtensionsPathProvider implements INbExtensionsPathProvider { } return Uri.joinPath(Uri.file(sysPrefix), 'share', 'jupyter'); } + case 'startUsingLocalKernelSpec': { + // If this local kernelspec has an associated Python interpreter, use its sysPrefix + if (kernel.kernelConnectionMetadata.interpreter) { + const sysPrefix = await getSysPrefix(kernel.kernelConnectionMetadata.interpreter); + if (!sysPrefix) { + return; + } + return Uri.joinPath(Uri.file(sysPrefix), 'share', 'jupyter'); + } + // If no interpreter is associated, we can't determine the nbextensions path + return; + } default: { // We haven't come across scenarios with non-python kernels that use widgets // & have custom widget sources. If we do, we can implement that as we come across them. diff --git a/src/notebooks/controllers/ipywidgets/scriptSourceProvider/nbExtensionsPathProvider.unit.test.ts b/src/notebooks/controllers/ipywidgets/scriptSourceProvider/nbExtensionsPathProvider.unit.test.ts index acc8b0f542c..3c32dbcfe02 100644 --- a/src/notebooks/controllers/ipywidgets/scriptSourceProvider/nbExtensionsPathProvider.unit.test.ts +++ b/src/notebooks/controllers/ipywidgets/scriptSourceProvider/nbExtensionsPathProvider.unit.test.ts @@ -36,6 +36,17 @@ import { dispose } from '../../../../platform/common/utils/lifecycle'; id: 'interpreterId' } as any }); + const localKernelSpecWithInterpreter = LocalKernelSpecConnectionMetadata.create({ + id: 'localKernelSpecWithInterpreter', + kernelSpec: mock(), + interpreter: { + id: 'interpreterIdForKernelSpec' + } as any + }); + const localKernelSpecWithoutInterpreter = LocalKernelSpecConnectionMetadata.create({ + id: 'localKernelSpecWithoutInterpreter', + kernelSpec: mock() + }); const serverProviderHandle = { handle: 'handle', id: 'id', extensionId: '' }; const remoteKernelSpec = RemoteKernelSpecConnectionMetadata.create({ id: '', @@ -64,6 +75,9 @@ import { dispose } from '../../../../platform/common/utils/lifecycle'; when(environments.resolveEnvironment(localPythonKernelSpec.interpreter.id)).thenResolve({ executable: { sysPrefix: __dirname } } as any); + when(environments.resolveEnvironment(localKernelSpecWithInterpreter.interpreter!.id)).thenResolve({ + executable: { sysPrefix: __dirname } + } as any); }); teardown(() => { disposables = dispose(disposables); @@ -92,5 +106,19 @@ import { dispose } from '../../../../platform/common/utils/lifecycle'; const baseUrl = await provider.getNbExtensionsParentPath(instance(kernel)); assert.strictEqual(baseUrl?.toString(), Uri.parse(remoteLiveKernel.baseUrl).toString()); }); + test('Returns base url for local kernelspec with interpreter', async () => { + when(kernel.kernelConnectionMetadata).thenReturn(localKernelSpecWithInterpreter); + const baseUrl = await provider.getNbExtensionsParentPath(instance(kernel)); + if (isWeb) { + assert.isUndefined(baseUrl); + } else { + assert.strictEqual(baseUrl?.toString(), Uri.file(path.join(__dirname, 'share', 'jupyter')).toString()); + } + }); + test('Returns undefined for local kernelspec without interpreter', async () => { + when(kernel.kernelConnectionMetadata).thenReturn(localKernelSpecWithoutInterpreter); + const baseUrl = await provider.getNbExtensionsParentPath(instance(kernel)); + assert.isUndefined(baseUrl); + }); }); }); diff --git a/src/notebooks/controllers/ipywidgets/scriptSourceProvider/nbExtensionsPathProvider.web.ts b/src/notebooks/controllers/ipywidgets/scriptSourceProvider/nbExtensionsPathProvider.web.ts index 118497096b1..4c6077004bd 100644 --- a/src/notebooks/controllers/ipywidgets/scriptSourceProvider/nbExtensionsPathProvider.web.ts +++ b/src/notebooks/controllers/ipywidgets/scriptSourceProvider/nbExtensionsPathProvider.web.ts @@ -17,8 +17,11 @@ export class NbExtensionsPathProvider implements INbExtensionsPathProvider { case 'startUsingRemoteKernelSpec': { return Uri.parse(kernel.kernelConnectionMetadata.baseUrl); } + case 'startUsingPythonInterpreter': + case 'startUsingLocalKernelSpec': default: { // Not possible a possible code path in web. + // In web environment, only remote kernels are supported. return; } }