Steven Silvester 8 лет назад
Родитель
Сommit
8588638dfb

+ 2 - 1
examples/console/package.json

@@ -9,7 +9,7 @@
     "watch": "watch 'npm run update && npm run build' ../../src src --wait 10"
   },
   "dependencies": {
-    "jupyter-js-services": "^0.16.0",
+    "jupyter-js-services": "^0.17.0",
     "jupyterlab": "file:../..",
     "phosphor-commandpalette": "^0.2.0",
     "phosphor-keymap": "^0.8.0",
@@ -19,6 +19,7 @@
   "devDependencies": {
     "concurrently": "^2.0.0",
     "css-loader": "^0.23.1",
+    "file-loader": "^0.9.0",
     "rimraf": "^2.5.2",
     "style-loader": "^0.13.1",
     "typescript": "^1.8.10",

+ 1 - 1
examples/filebrowser/package.json

@@ -9,7 +9,7 @@
     "watch": "watch 'npm run update && npm run build' ../../src src --wait 10"
   },
   "dependencies": {
-    "jupyter-js-services": "^0.16.0",
+    "jupyter-js-services": "^0.17.0",
     "jupyterlab": "file:../..",
     "phosphor-dockpanel": "^0.9.7",
     "phosphor-keymap": "^0.8.0",

+ 2 - 1
examples/notebook/package.json

@@ -9,7 +9,7 @@
     "watch": "watch 'npm run update && npm run build' ../../src src --wait 10"
   },
   "dependencies": {
-    "jupyter-js-services": "^0.16.0",
+    "jupyter-js-services": "^0.17.0",
     "jupyterlab": "file:../..",
     "phosphor-commandpalette": "^0.2.0",
     "phosphor-dragdrop": "^0.9.1",
@@ -20,6 +20,7 @@
   "devDependencies": {
     "concurrently": "^2.0.0",
     "css-loader": "^0.23.1",
+    "file-loader": "^0.9.0",
     "rimraf": "^2.5.2",
     "style-loader": "^0.13.1",
     "typescript": "^1.8.10",

+ 2 - 1
examples/terminal/package.json

@@ -9,7 +9,7 @@
     "watch": "watch 'npm run update && npm run build' ../../src src --wait 10"
   },
   "dependencies": {
-    "jupyter-js-services": "^0.16.0",
+    "jupyter-js-services": "^0.17.0",
     "jupyterlab": "file:../..",
     "phosphor-dockpanel": "^0.9.7",
     "url-loader": "^0.5.7",
@@ -17,6 +17,7 @@
   },
   "devDependencies": {
     "css-loader": "^0.23.1",
+    "file-loader": "^0.9.0",
     "rimraf": "^2.5.2",
     "style-loader": "^0.13.1",
     "typescript": "^1.8.10",

+ 0 - 1
jupyterlab/package.json

@@ -8,7 +8,6 @@
   "dependencies": {
     "es6-promise": "^3.1.2",
     "font-awesome": "^4.6.1",
-    "jupyter-js-services": "^0.16.0",
     "jupyter-js-widgets-labextension": "^0.1.0",
     "jupyterlab": "file:../",
     "material-design-icons": "^2.2.3",

+ 1 - 1
package.json

@@ -13,7 +13,7 @@
     "es6-promise": "^3.2.1",
     "jquery": "^2.2.0",
     "jquery-ui": "^1.10.5 <1.12",
-    "jupyter-js-services": "^0.16.3",
+    "jupyter-js-services": "^0.17.0",
     "leaflet": "^0.7.7",
     "marked": "^0.3.5",
     "moment": "^2.11.2",

+ 18 - 8
src/console/widget.ts

@@ -328,14 +328,13 @@ class ConsoleWidget extends Widget {
    * Initialize the banner and mimetype.
    */
   protected initialize(): void {
-    let layout = this.layout as PanelLayout;
-    let banner = layout.childAt(0) as RawCellWidget;
-    this._session.kernel.kernelInfo().then(msg => {
-      let info = msg.content;
-      banner.model.source = info.banner;
-      this._mimetype = mimetypeForLanguage(info.language_info);
-      this.prompt.mimetype = this._mimetype;
-    });
+    if (this._session.kernel.info) {
+      this._handleInfo(this._session.kernel.info);
+    } else {
+      this._session.kernel.kernelInfo().then(msg => {
+        this._handleInfo(msg.content);
+      });
+    }
   }
 
   /**
@@ -371,6 +370,17 @@ class ConsoleWidget extends Widget {
     prompt.focus();
   }
 
+  /**
+   * Update the console based on the kernel info.
+   */
+  private _handleInfo(info: KernelMessage.IInfoReply): void {
+    let layout = this.layout as PanelLayout;
+    let banner = layout.childAt(0) as RawCellWidget;
+    banner.model.source = info.banner;
+    this._mimetype = mimetypeForLanguage(info.language_info);
+    this.prompt.mimetype = this._mimetype;
+  }
+
   private _completion: CompletionWidget = null;
   private _completionHandler: CellCompletionHandler = null;
   private _inspectionHandler: InspectionHandler = null;

+ 3 - 3
src/docmanager/context.ts

@@ -462,7 +462,7 @@ class ContextManager implements IDisposable {
       contextEx.path = newPath;
       contextEx.context.pathChanged.emit(newPath);
       if (contextEx.session) {
-        let options = {
+        let options: ISession.IOptions = {
           path: newPath,
           kernelId: contextEx.session.kernel.id,
           kernelName: contextEx.session.kernel.name
@@ -538,8 +538,8 @@ class ContextManager implements IDisposable {
    * Resolve a relative url to a correct server path.
    */
   resolveUrl(id: string, url: string): string {
-    // TODO: use proper url parser here.
-    if (url.indexOf(':') !== -1) {
+    // Ignore urls that have a protocol.
+    if (utils.urlParse(url).protocol || url.indexOf('//') === 0) {
       return url;
     }
     let contextEx = this._contexts[id];

+ 1 - 1
src/filebrowser/model.ts

@@ -128,7 +128,7 @@ class FileBrowserModel implements IDisposable {
       return Promise.resolve(void 0);
     }
     let oldValue = this.path;
-    let options = { content: true };
+    let options: IContents.IFetchOptions = { content: true };
     this._pendingPath = newValue;
     if (newValue === '.') {
       newValue = this.path;

+ 1 - 1
src/notebook/cells/model.ts

@@ -245,7 +245,7 @@ class CellModel implements ICellModel {
     return {
       cell_type: this.type,
       source: this.source,
-      metadata: utils.copy(this._metadata)
+      metadata: utils.copy(this._metadata) as nbformat.IBaseCellMetadata
     };
   }
 

+ 19 - 9
src/notebook/notebook/default-toolbar.ts

@@ -243,20 +243,30 @@ namespace ToolbarItems {
   function createKernelNameItem(panel: NotebookPanel): Widget {
     let widget = new Widget();
     widget.addClass(TOOLBAR_KERNEL);
-    widget.node.textContent = 'No Kernel!';
-    if (panel.kernel) {
-      panel.kernel.getKernelSpec().then(spec => {
-        widget.node.textContent = spec.display_name;
-      });
-    }
+    updateKernelNameItem(widget, panel.kernel);
     panel.kernelChanged.connect(() => {
-      panel.kernel.getKernelSpec().then(spec => {
-        widget.node.textContent = spec.display_name;
-      });
+      updateKernelNameItem(widget, panel.kernel);
     });
     return widget;
   }
 
+  /**
+   * Update the text of the kernel name item.
+   */
+  function updateKernelNameItem(widget: Widget, kernel: IKernel): void {
+    widget.node.textContent = 'No Kernel!';
+    if (!kernel) {
+      return;
+    }
+    if (kernel.spec) {
+      widget.node.textContent = kernel.spec.display_name;
+    } else {
+      kernel.getKernelSpec().then(spec => {
+        widget.node.textContent = kernel.spec.display_name;
+      });
+    }
+  }
+
   /**
    * Create a kernel status indicator item.
    *

+ 40 - 14
src/notebook/notebook/panel.ts

@@ -2,7 +2,7 @@
 // Distributed under the terms of the Modified BSD License.
 
 import {
-  IKernel
+  IKernel, KernelMessage
 } from 'jupyter-js-services';
 
 import {
@@ -294,6 +294,10 @@ class NotebookPanel extends Widget {
         oldValue.model.stateChanged.disconnect(this.onModelStateChanged, this);
       }
     }
+    if (!newValue) {
+      this._onKernelChanged(null, null);
+      return;
+    }
     let context = newValue;
     context.kernelChanged.connect(this._onKernelChanged, this);
     let oldKernel = oldValue ? oldValue.kernel : null;
@@ -317,24 +321,46 @@ class NotebookPanel extends Widget {
    * Handle a change in the kernel by updating the document metadata.
    */
   private _onKernelChanged(context: IDocumentContext<INotebookModel>, kernel: IKernel): void {
+    this._completionHandler.kernel = kernel;
+    this.content.inspectionHandler.kernel = kernel;
+    this.kernelChanged.emit(kernel);
     if (!this.model || !kernel) {
       return;
     }
-    kernel.kernelInfo().then(msg => {
-      let infoCursor = this.model.getMetadata('language_info');
-      infoCursor.setValue(msg.content.language_info);
-    });
-    kernel.getKernelSpec().then(spec => {
-      let specCursor = this.model.getMetadata('kernelspec');
-      specCursor.setValue({
-        name: kernel.name,
-        display_name: spec.display_name,
-        language: spec.language
+    if (kernel.info) {
+      this._updateLanguage(kernel.info.language_info);
+    } else {
+      kernel.kernelInfo().then(msg => {
+        this._updateLanguage(msg.content.language_info);
       });
+    }
+    if (kernel.spec) {
+      this._updateSpec(kernel);
+    } else {
+      kernel.getKernelSpec().then(spec => {
+        this._updateSpec(kernel);
+      });
+    }
+  }
+
+  /**
+   * Update the kernel language.
+   */
+  private _updateLanguage(language: KernelMessage.ILanguageInfo): void {
+    let infoCursor = this.model.getMetadata('language_info');
+    infoCursor.setValue(language);
+  }
+
+  /**
+   * Update the kernel spec.
+   */
+  private _updateSpec(kernel: IKernel): void {
+    let specCursor = this.model.getMetadata('kernelspec');
+    specCursor.setValue({
+      name: kernel.name,
+      display_name: kernel.spec.display_name,
+      language: kernel.spec.language
     });
-    this._completionHandler.kernel = kernel;
-    this.content.inspectionHandler.kernel = kernel;
-    this.kernelChanged.emit(kernel);
   }
 
   /**

+ 6 - 10
test/src/notebook/notebook/default-toolbar.spec.ts

@@ -294,10 +294,7 @@ describe('notebook/notebook/default-toolbar', () => {
       });
 
       it("should display `'No Kernel!'` if there is no kernel", () => {
-        let model = new NotebookModel();
-        model.fromJSON(DEFAULT_CONTENT);
-        context = new MockContext<NotebookModel>(model);
-        panel.context = context;
+        panel.context = null;
         let item = ToolbarItems.createKernelNameItem(panel);
         expect(item.node.textContent).to.be('No Kernel!');
       });
@@ -312,13 +309,12 @@ describe('notebook/notebook/default-toolbar', () => {
         });
       });
 
-      it('should handle a change in context', () => {
+      it('should handle a change in context', (done) => {
         let item = ToolbarItems.createKernelNameItem(panel);
-        let model = new NotebookModel();
-        model.fromJSON(DEFAULT_CONTENT);
-        context = new MockContext<NotebookModel>(model);
-        panel.context = context;
-        expect(item.node.textContent).to.be('No Kernel!');
+        panel.kernel.getKernelSpec().then(spec => {
+          panel.context = null;
+          expect(item.node.textContent).to.be('No Kernel!');
+        }).then(done, done);
       });
 
     });