Notebooks: Adding Change Kernel API, 3 Integration Tests (#5287)

* Notebook change kernel

* Fix notifying of k change too many times add tests

* Fix broken unit test

* Deal with comment
This commit is contained in:
Chris LaFreniere
2019-06-03 14:49:40 -07:00
committed by GitHub
parent 4b6214c9a4
commit 8d70544374
10 changed files with 130 additions and 17 deletions

View File

@@ -163,6 +163,10 @@ export class ExtHostNotebookEditor implements azdata.nb.NotebookEditor, IDisposa
return this._proxy.$clearAllOutputs(this._id);
}
public changeKernel(kernel: azdata.nb.IKernelSpec): Thenable<boolean> {
return this._proxy.$changeKernel(this._id, kernel);
}
public edit(callback: (editBuilder: azdata.nb.NotebookEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable<boolean> {
if (this._disposed) {
return Promise.reject(new Error('NotebookEditor#edit not possible on closed editors'));

View File

@@ -36,11 +36,14 @@ import { localize } from 'vs/nls';
class MainThreadNotebookEditor extends Disposable {
private _contentChangedEmitter = new Emitter<NotebookContentChange>();
public readonly contentChanged: Event<NotebookContentChange> = this._contentChangedEmitter.event;
private _providerInfo: IProviderInfo;
private _providerId: string = '';
private _providers: string[] = [];
constructor(public readonly editor: INotebookEditor) {
super();
editor.modelReady.then(model => {
this._providerId = model.providerId;
this._register(model.contentChanged((e) => this._contentChangedEmitter.fire(e)));
this._register(model.kernelChanged((e) => {
let changeEvent: NotebookContentChange = {
@@ -48,9 +51,12 @@ class MainThreadNotebookEditor extends Disposable {
};
this._contentChangedEmitter.fire(changeEvent);
}));
this._register(model.onProviderIdChange((provider) => {
this._providerId = provider;
}));
});
editor.notebookParams.providerInfo.then(info => {
this._providerInfo = info;
this._providers = info.providers;
});
}
@@ -67,11 +73,11 @@ class MainThreadNotebookEditor extends Disposable {
}
public get providerId(): string {
return this._providerInfo ? this._providerInfo.providerId : undefined;
return this._providerId;
}
public get providers(): string[] {
return this._providerInfo ? this._providerInfo.providers : [];
return this._providers;
}
public get cells(): ICellModel[] {
@@ -306,7 +312,7 @@ class MainThreadNotebookDocumentAndEditorStateComputer extends Disposable {
export class MainThreadNotebookDocumentsAndEditors extends Disposable implements MainThreadNotebookDocumentsAndEditorsShape {
private _proxy: ExtHostNotebookDocumentsAndEditorsShape;
private _notebookEditors = new Map<string, MainThreadNotebookEditor>();
private _modelToDisposeMap = new Map<string, IDisposable>();
private _modelToDisposeMap = new Map<string, IDisposable[]>();
constructor(
extHostContext: IExtHostContext,
@IUntitledEditorService private _untitledEditorService: IUntitledEditorService,
@@ -385,6 +391,14 @@ export class MainThreadNotebookDocumentsAndEditors extends Disposable implements
return editor.clearAllOutputs();
}
$changeKernel(id: string, kernel: azdata.nb.IKernelSpec): Promise<boolean> {
let editor = this.getEditor(id);
if (!editor) {
return Promise.reject(disposed(`TextEditor(${id})`));
}
return this.doChangeKernel(editor, kernel.display_name);
}
//#endregion
private async doOpenEditor(resource: UriComponents, options: INotebookShowOptions): Promise<string> {
@@ -500,9 +514,11 @@ export class MainThreadNotebookDocumentsAndEditors extends Disposable implements
return;
}
removedDocuments.forEach(removedDoc => {
let listener = this._modelToDisposeMap.get(removedDoc.toString());
if (listener) {
listener.dispose();
let listeners = this._modelToDisposeMap.get(removedDoc.toString());
if (listeners && listeners.length) {
listeners.forEach(listener => {
listener.dispose();
});
this._modelToDisposeMap.delete(removedDoc.toString());
}
});
@@ -514,9 +530,9 @@ export class MainThreadNotebookDocumentsAndEditors extends Disposable implements
}
addedEditors.forEach(editor => {
let modelUrl = editor.uri;
this._modelToDisposeMap.set(editor.uri.toString(), editor.contentChanged((e) => {
this._modelToDisposeMap.set(editor.uri.toString(), [editor.contentChanged((e) => {
this._proxy.$acceptModelChanged(modelUrl, this._toNotebookChangeData(e, editor));
}));
})]);
});
}
@@ -591,4 +607,15 @@ export class MainThreadNotebookDocumentsAndEditors extends Disposable implements
}
return notebookCells;
}
private async doChangeKernel(editor: MainThreadNotebookEditor, displayName: string): Promise<boolean> {
let listeners = this._modelToDisposeMap.get(editor.id);
editor.model.changeKernel(displayName);
return new Promise((resolve) => {
listeners.push(editor.model.kernelChanged((kernel) => {
resolve(true);
}));
this._modelToDisposeMap.set(editor.id, listeners);
});
}
}

View File

@@ -900,6 +900,7 @@ export interface MainThreadNotebookDocumentsAndEditorsShape extends IDisposable
$runCell(id: string, cellUri: UriComponents): Promise<boolean>;
$runAllCells(id: string): Promise<boolean>;
$clearAllOutputs(id: string): Promise<boolean>;
$changeKernel(id: string, kernel: azdata.nb.IKernelInfo): Promise<boolean>;
}
export interface ExtHostExtensionManagementShape {