Skip to content

Commit f8e87c3

Browse files
committed
Update the method for determining kernel language
The previous algorithm for `getNotebookType()` was based on getting the kernel spec out of the current notebook. This is a problem when format is triggered by, for example, `jupyterlab-autosave-on-focus-change`, immediately after notebook creation. In that case, the language is determined to be `null` and errors arise. Now the `onSave()` handler waits for the `sessionContext` to be ready, then `getNotebookType()` gets the same kernel spec info from the session rather than the loaded notebook.
1 parent 55a9d04 commit f8e87c3

File tree

2 files changed

+9
-28
lines changed

2 files changed

+9
-28
lines changed

src/formatter.ts

+8-28
Original file line numberDiff line numberDiff line change
@@ -92,34 +92,14 @@ export class JupyterlabNotebookCodeFormatter extends JupyterlabCodeFormatter {
9292
return codeCells;
9393
}
9494

95-
private getNotebookType() {
96-
if (!this.notebookTracker.currentWidget) {
97-
return null;
98-
}
99-
100-
const metadata =
101-
this.notebookTracker.currentWidget.content.model!.sharedModel.metadata;
102-
103-
if (!metadata) {
104-
return null;
105-
}
106-
107-
// prefer kernelspec language
108-
if (
109-
metadata.kernelspec &&
110-
metadata.kernelspec.language &&
111-
typeof metadata.kernelspec.language === 'string'
112-
) {
113-
return metadata.kernelspec.language.toLowerCase();
114-
}
115-
116-
// otherwise, check language info code mirror mode
117-
if (metadata.language_info && metadata.language_info.codemirror_mode) {
118-
const mode = metadata.language_info.codemirror_mode;
119-
if (typeof mode === 'string') {
120-
return mode.toLowerCase();
121-
} else if (typeof mode.name === 'string') {
122-
return mode.name.toLowerCase();
95+
private getNotebookType(): string | null {
96+
// Get the language from the current kernel spec
97+
const sessionContext = this.notebookTracker.currentWidget?.sessionContext;
98+
const kernelName = sessionContext?.session?.kernel?.name;
99+
if (kernelName) {
100+
const specs = sessionContext.specsManager.specs?.kernelspecs;
101+
if (specs && kernelName in specs) {
102+
return specs[kernelName]!.language;
123103
}
124104
}
125105

src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ class JupyterLabCodeFormatter
108108
state: DocumentRegistry.SaveState
109109
) {
110110
if (state === 'started' && this.config.formatOnSave) {
111+
await context.sessionContext.ready;
111112
await this.notebookCodeFormatter.formatAllCodeCells(
112113
this.config,
113114
{ saving: true },

0 commit comments

Comments
 (0)