diff --git a/packages/script-debugger/src/index.ts b/packages/script-debugger/src/index.ts index 04338d1bc..d83cbbae7 100644 --- a/packages/script-debugger/src/index.ts +++ b/packages/script-debugger/src/index.ts @@ -93,10 +93,8 @@ const scriptEditorDebuggerExtension: JupyterFrontEndPlugin = { activeSessions[sessionModel.id] = sessionConnection; } if (sessionModel.kernel?.name !== kernelSelection) { - // New kernel selection detected, restart session connection for new kernel - await shutdownSession(sessionConnection); - - sessionConnection = await startSession(kernelSelection, path); + // New kernel selection detected, update session connection + await changeKernel(sessionConnection, kernelSelection); sessionModel = await sessions.findByPath(path); if (sessionConnection && sessionModel) { activeSessions[sessionModel.id] = sessionConnection; @@ -177,15 +175,16 @@ const scriptEditorDebuggerExtension: JupyterFrontEndPlugin = { return sessionConnection; }; - const shutdownSession = async ( - sessionConnection: Session.ISessionConnection + const changeKernel = async ( + sessionConnection: Session.ISessionConnection, + kernelSelection: string ): Promise => { try { - const kernelName = sessionConnection.kernel?.name; - await sessionConnection.shutdown(); - console.log(`${kernelName} kernel shut down.`); + const prev = sessionConnection.kernel?.name; + await sessionConnection.changeKernel({ name: kernelSelection }); + console.log(`Kernel change from ${prev} to ${kernelSelection}`); } catch (error) { - console.warn('Exception: shutdown = ' + JSON.stringify(error)); + console.warn('Exception: change kernel = ' + JSON.stringify(error)); } }; } diff --git a/packages/script-editor/src/ScriptEditorController.ts b/packages/script-editor/src/ScriptEditorController.ts index c6043b30a..7c52ca3ce 100644 --- a/packages/script-editor/src/ScriptEditorController.ts +++ b/packages/script-editor/src/ScriptEditorController.ts @@ -75,13 +75,18 @@ export class ScriptEditorController { return kernelSpecs.default; } + return this.getFirstKernelName(language); + }; + + getFirstKernelName = async (language: string): Promise => { const specsByLang = await this.getKernelSpecsByLanguage(language); - const first = (k: any): any => k[Object.keys(k)[0]]; - let kernelName = ''; + + const empty = ''; if (specsByLang && Object.keys(specsByLang.kernelspecs).length !== 0) { - kernelName = first(specsByLang.kernelspecs.name); + const [key, value]: any = Object.entries(specsByLang.kernelspecs)[0]; + return value.name ?? key; } - return kernelName; + return empty; }; /** diff --git a/packages/script-editor/src/ScriptRunner.ts b/packages/script-editor/src/ScriptRunner.ts index 8da74e551..f3bdce55b 100644 --- a/packages/script-editor/src/ScriptRunner.ts +++ b/packages/script-editor/src/ScriptRunner.ts @@ -203,6 +203,7 @@ export class ScriptRunner { kernel && (await KernelAPI.interruptKernel(kernel.id, kernel.serverSettings)); console.log(kernel?.name + ' kernel interrupted.'); + this.disableButton(false); } catch (e) { console.log('Exception: kernel interrupt = ' + JSON.stringify(e)); } diff --git a/packages/script-editor/src/test/script-editor.spec.ts b/packages/script-editor/src/test/script-editor.spec.ts index e954c35b2..0e2a9f546 100644 --- a/packages/script-editor/src/test/script-editor.spec.ts +++ b/packages/script-editor/src/test/script-editor.spec.ts @@ -18,6 +18,7 @@ import { JupyterServer } from '@jupyterlab/testutils'; import { ScriptEditorController } from '../ScriptEditorController'; import { ScriptRunner } from '../ScriptRunner'; + jest.setTimeout(3 * 60 * 1000); const server = new JupyterServer(); @@ -33,16 +34,28 @@ afterAll(async () => { describe('@elyra/script-editor', () => { describe('ScriptEditorController', () => { - describe('#getKernelSpecs', () => { + let controller: ScriptEditorController; + + beforeEach(async () => { + controller = new ScriptEditorController(); + }); + + describe('#kernelSpecs', () => { it('should get Python kernel specs', async () => { - const controller = new ScriptEditorController(); const kernelSpecs = await controller.getKernelSpecsByLanguage(language); - for (const [key, value] of Object.entries( - kernelSpecs?.kernelspecs ?? [] - )) { - expect(key).toContain(language); - expect(value?.language).toContain(language); - } + Object.entries(kernelSpecs?.kernelspecs ?? []).forEach(([, value]) => + expect(value?.language).toContain(language) + ); + }); + }); + + describe('#debuggerAvailable', () => { + it('should return true for kernels that have support for debugging', async () => { + let available = await controller.debuggerAvailable('python3'); + expect(available).toBe(true); + + available = await controller.debuggerAvailable('test'); + expect(available).toBe(false); }); }); }); @@ -56,9 +69,7 @@ describe('@elyra/script-editor', () => { beforeEach(async () => { runner = new ScriptRunner((x: boolean): void => console.log(x)); const controller = new ScriptEditorController(); - const kernelSpecs = await controller.getKernelSpecsByLanguage(language); - kernelName = - Object.values(kernelSpecs?.kernelspecs ?? [])[0]?.name || ''; + kernelName = await controller.getDefaultKernel(language); }); it('should start a kernel session', async () => {