Skip to content

Commit 164727a

Browse files
authored
Add support for ipywidgets (#10606)
* Widgets * Fixes * Misc * Crap * Include requirejs
1 parent f8f9b86 commit 164727a

35 files changed

+2257
-122
lines changed

.vscodeignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ data/**
6565
debug_coverage*/**
6666
images/**/*.gif
6767
images/**/*.png
68+
ipywidgets/**
6869
news/**
6970
node_modules/**
7071
obj/**

build/webpack/webpack.datascience-ui.config.builder.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,11 @@ function buildConfiguration(isNotebook) {
181181
{ from: './**/*.png', to: '.' },
182182
{ from: './**/*.svg', to: '.' },
183183
{ from: './**/*.css', to: '.' },
184-
{ from: './**/*theme*.json', to: '.' }
184+
{ from: './**/*theme*.json', to: '.' },
185+
{
186+
from: path.join(constants.ExtensionRootDir, 'node_modules/requirejs/require.js'),
187+
to: path.join(constants.ExtensionRootDir, 'out', 'datascience-ui', bundleFolder)
188+
}
185189
],
186190
{ context: 'src' }
187191
),

package-lock.json

Lines changed: 794 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2968,6 +2968,9 @@
29682968
"@blueprintjs/select": "^3.11.2",
29692969
"@enonic/fnv-plus": "^1.3.0",
29702970
"@istanbuljs/nyc-config-typescript": "^0.1.3",
2971+
"@jupyter-widgets/base": "^2.0.1",
2972+
"@jupyter-widgets/controls": "^1.5.2",
2973+
"@jupyter-widgets/html-manager": "^0.18.3",
29712974
"@nteract/plotly": "^1.48.3",
29722975
"@nteract/transform-dataresource": "^4.3.5",
29732976
"@nteract/transform-geojson": "^3.2.3",
@@ -2993,7 +2996,6 @@
29932996
"@types/glob": "^5.0.35",
29942997
"@types/html-webpack-plugin": "^3.2.0",
29952998
"@types/iconv-lite": "^0.0.1",
2996-
"@types/jquery": "^1.10.35",
29972999
"@types/jsdom": "^11.12.0",
29983000
"@types/koa": "^2.11.0",
29993001
"@types/koa-compress": "^2.0.9",
@@ -3111,6 +3113,7 @@
31113113
"redux-logger": "^3.0.6",
31123114
"relative": "^3.0.2",
31133115
"remove-files-webpack-plugin": "^1.4.0",
3116+
"requirejs": "^2.3.6",
31143117
"rewiremock": "^3.13.0",
31153118
"sass-loader": "^7.1.0",
31163119
"serialize-javascript": "^2.1.2",
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
'use strict';
5+
6+
/**
7+
* Serialize ArraBuffer and ArrayBufferView into a fomat such that they are json serializable.
8+
*
9+
* @export
10+
* @param {(undefined | (ArrayBuffer | ArrayBufferView)[])} buffers
11+
* @returns
12+
*/
13+
export function serializeDataViews(buffers: undefined | (ArrayBuffer | ArrayBufferView)[]) {
14+
if (!buffers || !Array.isArray(buffers) || buffers.length === 0) {
15+
return;
16+
}
17+
// tslint:disable-next-line: no-any
18+
const newBufferView: any[] = [];
19+
// tslint:disable-next-line: prefer-for-of
20+
for (let i = 0; i < buffers.length; i += 1) {
21+
const item = buffers[i];
22+
if ('buffer' in item && 'byteOffset' in item) {
23+
// It is an ArrayBufferView
24+
// tslint:disable-next-line: no-any
25+
const buffer = Array.apply(null, new Uint8Array(item.buffer as any) as any);
26+
newBufferView.push({
27+
...item,
28+
byteLength: item.byteLength,
29+
byteOffset: item.byteOffset,
30+
buffer
31+
// tslint:disable-next-line: no-any
32+
} as any);
33+
} else {
34+
// tslint:disable-next-line: no-any
35+
newBufferView.push(Array.apply(null, new Uint8Array(item as any) as any) as any);
36+
}
37+
}
38+
39+
// tslint:disable-next-line: no-any
40+
return newBufferView;
41+
}
42+
43+
/**
44+
* Deserializes ArrayBuffer and ArrayBufferView from a format that was json serializable into actual ArrayBuffer and ArrayBufferViews.
45+
*
46+
* @export
47+
* @param {(undefined | (ArrayBuffer | ArrayBufferView)[])} buffers
48+
* @returns
49+
*/
50+
export function deserializeDataViews(buffers: undefined | (ArrayBuffer | ArrayBufferView)[]) {
51+
if (!Array.isArray(buffers) || buffers.length === 0) {
52+
return buffers;
53+
}
54+
const newBufferView: (ArrayBuffer | ArrayBufferView)[] = [];
55+
// tslint:disable-next-line: prefer-for-of
56+
for (let i = 0; i < buffers.length; i += 1) {
57+
const item = buffers[i];
58+
if ('buffer' in item && 'byteOffset' in item) {
59+
const buffer = new Uint8Array(item.buffer).buffer;
60+
// It is an ArrayBufferView
61+
// tslint:disable-next-line: no-any
62+
const bufferView = new DataView(buffer, item.byteOffset, item.byteLength);
63+
newBufferView.push(bufferView);
64+
} else {
65+
const buffer = new Uint8Array(item).buffer;
66+
// tslint:disable-next-line: no-any
67+
newBufferView.push(buffer);
68+
}
69+
}
70+
return newBufferView;
71+
}

src/client/datascience/interactive-common/interactiveBase.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1070,7 +1070,8 @@ export abstract class InteractiveBase extends WebViewHost<IInteractiveWindowMapp
10701070

10711071
// ensureNotebook can be called apart from ensureNotebookAndServer and it needs
10721072
// the same protection to not be called twice
1073-
private async ensureNotebook(server: INotebookServer): Promise<void> {
1073+
// tslint:disable-next-line: member-ordering
1074+
protected async ensureNotebook(server: INotebookServer): Promise<void> {
10741075
if (!this.notebookPromise) {
10751076
this.notebookPromise = this.ensureNotebookImpl(server);
10761077
}

src/client/datascience/interactive-common/interactiveWindowTypes.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import * as monacoEditor from 'monaco-editor/esm/vs/editor/editor.api';
55
import { Uri } from 'vscode';
66
import { IServerState } from '../../../datascience-ui/interactive-common/mainState';
7+
8+
import { KernelMessage } from '@jupyterlab/services';
79
import { CommonActionType, IAddCellAction } from '../../../datascience-ui/interactive-common/redux/reducers/types';
810
import { PythonInterpreter } from '../../interpreter/contracts';
911
import { LiveKernelModel } from '../jupyter/kernels/types';
@@ -101,6 +103,18 @@ export enum InteractiveWindowMessages {
101103
OpenSettings = 'open_settings'
102104
}
103105

106+
export enum IPyWidgetMessages {
107+
IPyWidgets_display_data_msg = 'IPyWidgets_display_data_msg',
108+
IPyWidgets_comm_msg = 'IPyWidgets_comm_msg',
109+
IPyWidgets_comm_open = 'IPyWidgets_comm_open',
110+
IPyWidgets_ShellSend = 'IPyWidgets_ShellSend',
111+
IPyWidgets_ShellCommOpen = 'IPyWidgets_ShellCommOpen',
112+
IPyWidgets_registerCommTarget = 'IPyWidgets_registerCommTarget',
113+
IPyWidgets_ShellSend_onIOPub = 'IPyWidgets_ShellSend_onIOPub',
114+
IPyWidgets_ShellSend_reply = 'IPyWidgets_ShellSend_reply',
115+
IPyWidgets_ShellSend_resolve = 'IPyWidgets_ShellSend_resolve',
116+
IPyWidgets_ShellSend_reject = 'IPyWidgets_ShellSend_reject'
117+
}
104118
export enum NativeCommandType {
105119
AddToEnd = 0,
106120
ArrowDown,
@@ -448,6 +462,31 @@ export type NotebookModelChange =
448462

449463
// Map all messages to specific payloads
450464
export class IInteractiveWindowMapping {
465+
// tslint:disable-next-line: no-any
466+
public [IPyWidgetMessages.IPyWidgets_ShellSend]: {
467+
// tslint:disable-next-line: no-any
468+
data: any;
469+
// tslint:disable-next-line: no-any
470+
metadata: any;
471+
commId: string;
472+
requestId: string;
473+
// tslint:disable-next-line: no-any
474+
buffers?: any[];
475+
disposeOnDone?: boolean;
476+
targetName?: string;
477+
msgType: string;
478+
};
479+
// tslint:disable-next-line: no-any
480+
public [IPyWidgetMessages.IPyWidgets_ShellSend_onIOPub]: { requestId: string; msg: KernelMessage.IIOPubMessage };
481+
public [IPyWidgetMessages.IPyWidgets_ShellSend_reply]: { requestId: string; msg: KernelMessage.IShellMessage };
482+
public [IPyWidgetMessages.IPyWidgets_ShellSend_resolve]: { requestId: string; msg?: KernelMessage.IShellMessage };
483+
// tslint:disable-next-line: no-any
484+
public [IPyWidgetMessages.IPyWidgets_ShellSend_reject]: { requestId: string; msg?: any };
485+
public [IPyWidgetMessages.IPyWidgets_registerCommTarget]: string;
486+
public [IPyWidgetMessages.IPyWidgets_comm_open]: KernelMessage.ICommOpenMsg;
487+
public [IPyWidgetMessages.IPyWidgets_comm_msg]: KernelMessage.ICommMsgMsg;
488+
public [IPyWidgetMessages.IPyWidgets_display_data_msg]: KernelMessage.IDisplayDataMsg;
489+
451490
public [InteractiveWindowMessages.StartCell]: ICell;
452491
public [InteractiveWindowMessages.FinishCell]: ICell;
453492
public [InteractiveWindowMessages.UpdateCell]: ICell;

src/client/datascience/interactive-common/synchronization.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
CommonActionTypeMapping
44
} from '../../../datascience-ui/interactive-common/redux/reducers/types';
55
import { CssMessages, SharedMessages } from '../messages';
6-
import { IInteractiveWindowMapping, InteractiveWindowMessages } from './interactiveWindowTypes';
6+
import { IInteractiveWindowMapping, InteractiveWindowMessages, IPyWidgetMessages } from './interactiveWindowTypes';
77

88
// Copyright (c) Microsoft Corporation. All rights reserved.
99
// Licensed under the MIT License.
@@ -175,7 +175,18 @@ const messageWithMessageTypes: MessageMapping<IInteractiveWindowMapping> & Messa
175175
// Types from Shared Messages
176176
[SharedMessages.LocInit]: MessageType.userAction,
177177
[SharedMessages.Started]: MessageType.userAction,
178-
[SharedMessages.UpdateSettings]: MessageType.userAction
178+
[SharedMessages.UpdateSettings]: MessageType.userAction,
179+
// IpyWidgets
180+
// [IPyWidgetMessages.IPyWidgets_ShellCommOpen]: MessageType.noIdea,
181+
[IPyWidgetMessages.IPyWidgets_ShellSend]: MessageType.noIdea,
182+
[IPyWidgetMessages.IPyWidgets_ShellSend_onIOPub]: MessageType.noIdea,
183+
[IPyWidgetMessages.IPyWidgets_ShellSend_reject]: MessageType.noIdea,
184+
[IPyWidgetMessages.IPyWidgets_ShellSend_reply]: MessageType.noIdea,
185+
[IPyWidgetMessages.IPyWidgets_ShellSend_resolve]: MessageType.noIdea,
186+
[IPyWidgetMessages.IPyWidgets_comm_msg]: MessageType.noIdea,
187+
[IPyWidgetMessages.IPyWidgets_comm_open]: MessageType.noIdea,
188+
[IPyWidgetMessages.IPyWidgets_display_data_msg]: MessageType.noIdea,
189+
[IPyWidgetMessages.IPyWidgets_registerCommTarget]: MessageType.noIdea
179190
};
180191

181192
/**

0 commit comments

Comments
 (0)