Просмотр исходного кода

Update the doc registry api to use iterators

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

+ 11 - 15
src/docregistry/registry.ts

@@ -6,17 +6,13 @@ import {
 } from '@jupyterlab/services';
 
 import {
-  each
+  EmptyIterator, IIterator, each, iter
 } from 'phosphor/lib/algorithm/iteration';
 
 import {
   find, findIndex, indexOf
 } from 'phosphor/lib/algorithm/searching';
 
-import {
-  ISequence
-} from 'phosphor/lib/algorithm/sequence';
-
 import {
   Vector
 } from 'phosphor/lib/collections/vector';
@@ -71,15 +67,15 @@ class DocumentRegistry {
   /**
    * A read-only sequence of file types that have been registered.
    */
-  get fileTypes(): ISequence<DocumentRegistry.IFileType> {
-    return this._fileTypes;
+  get fileTypes(): IIterator<DocumentRegistry.IFileType> {
+    return this._fileTypes.iter();
   }
 
   /**
    * A read-only sequence of the file creators that have been registered.
    */
-  get creators(): ISequence<DocumentRegistry.IFileCreator> {
-    return this._creators;
+  get creators(): IIterator<DocumentRegistry.IFileCreator> {
+    return this._creators.iter();
   }
 
   /**
@@ -331,7 +327,7 @@ class DocumentRegistry {
    * - all other extension-specific factories
    * - all other global factories
    */
-  listWidgetFactories(ext: string = '*'): string[] {
+  listWidgetFactories(ext: string = '*'): IIterator<string> {
     let factories = new Set<string>();
     ext = Private.normalizeExtension(ext);
 
@@ -373,7 +369,7 @@ class DocumentRegistry {
       }
     });
 
-    return factoryList;
+    return iter(factoryList);
   }
 
   /**
@@ -385,7 +381,7 @@ class DocumentRegistry {
    */
   defaultWidgetFactory(ext: string = '*'): string {
     let widgets = this.listWidgetFactories(ext);
-    return widgets ? widgets[0] : void 0;
+    return widgets ? widgets.next() : void 0;
   }
 
   /**
@@ -469,12 +465,12 @@ class DocumentRegistry {
    *
    * @returns A read-only sequence of widget extensions.
    */
-  getWidgetExtensions(widgetName: string): ISequence<DocumentRegistry.IWidgetExtension<Widget, DocumentRegistry.IModel>> {
+  getWidgetExtensions(widgetName: string): IIterator<DocumentRegistry.IWidgetExtension<Widget, DocumentRegistry.IModel>> {
     widgetName = widgetName.toLowerCase();
     if (!(widgetName in this._extenders)) {
-      this._extenders[widgetName] = new Vector<DocumentRegistry.IWidgetExtension<Widget, DocumentRegistry.IModel>>();
+      return EmptyIterator.instance;
     }
-    return this._extenders[widgetName];
+    return this._extenders[widgetName].iter();
   }
 
   /**

+ 4 - 4
src/filebrowser/dialogs.ts

@@ -196,11 +196,11 @@ class OpenWithHandler extends Widget {
   protected populateFactories(): void {
     let factories = this._manager.registry.listWidgetFactories(this._ext);
     let widgetDropdown = this.widgetDropdown;
-    for (let factory of factories) {
+    each(factories, factory => {
       let option = document.createElement('option');
       option.text = factory;
       widgetDropdown.appendChild(option);
-    }
+    });
     this.widgetChanged();
   }
 
@@ -526,11 +526,11 @@ class CreateNewHandler extends Widget {
     let ext = this.ext;
     let factories = this._manager.registry.listWidgetFactories(ext);
     let widgetDropdown = this.widgetDropdown;
-    for (let factory of factories) {
+    each(factories, factory => {
       let option = document.createElement('option');
       option.text = factory;
       widgetDropdown.appendChild(option);
-    }
+    });
     this.widgetDropdownChanged();
     this._prevExt = ext;
   }

+ 2 - 2
src/filebrowser/plugin.ts

@@ -2,7 +2,7 @@
 // Distributed under the terms of the Modified BSD License.
 
 import {
-  each
+  each, toArray
 } from 'phosphor/lib/algorithm/iteration';
 
 import {
@@ -142,7 +142,7 @@ function activateFileBrowser(app: JupyterLab, manager: IServiceManager, registry
     event.preventDefault();
     let path = fbWidget.pathForClick(event) || '';
     let ext = '.' + path.split('.').pop();
-    let widgetNames = registry.listWidgetFactories(ext);
+    let widgetNames = toArray(registry.listWidgetFactories(ext));
     let prefix = `file-browser-contextmenu-${++Private.id}`;
     let openWith: Menu = null;
     if (path && widgetNames.length > 1) {

+ 28 - 24
test/src/docregistry/registry.spec.ts

@@ -7,6 +7,10 @@ import {
   Kernel
 } from '@jupyterlab/services';
 
+import {
+  toArray
+} from 'phosphor/lib/algorithm/iteration';
+
 import {
   DisposableDelegate, IDisposable
 } from 'phosphor/lib/core/disposable';
@@ -198,7 +202,7 @@ describe('docregistry/registry', () => {
       it('should add a widget extension to the registry', () => {
         let extension = new WidgetExtension();
         registry.addWidgetExtension('foo', extension);
-        expect(registry.getWidgetExtensions('foo').at(0)).to.be(extension);
+        expect(registry.getWidgetExtensions('foo').next()).to.be(extension);
       });
 
       it('should be a no-op if the extension is already registered for a given widget factory', () => {
@@ -206,14 +210,14 @@ describe('docregistry/registry', () => {
         registry.addWidgetExtension('foo', extension);
         let disposable = registry.addWidgetExtension('foo', extension);
         disposable.dispose();
-        expect(registry.getWidgetExtensions('foo').at(0)).to.be(extension);
+        expect(registry.getWidgetExtensions('foo').next()).to.be(extension);
       });
 
       it('should be removed from the registry when disposed', () => {
         let extension = new WidgetExtension();
         let disposable = registry.addWidgetExtension('foo', extension);
         disposable.dispose();
-        expect(registry.getWidgetExtensions('foo').length).to.be(0);
+        expect(toArray(registry.getWidgetExtensions('foo')).length).to.be(0);
       });
 
     });
@@ -223,14 +227,14 @@ describe('docregistry/registry', () => {
       it('should add a file type to the document registry', () => {
         let fileType = { name: 'notebook', extension: '.ipynb' };
         registry.addFileType(fileType);
-        expect(registry.fileTypes.at(0)).to.be(fileType);
+        expect(registry.fileTypes.next()).to.be(fileType);
       });
 
       it('should be removed from the registry when disposed', () => {
         let fileType = { name: 'notebook', extension: '.ipynb' };
         let disposable = registry.addFileType(fileType);
         disposable.dispose();
-        expect(registry.fileTypes.length).to.be(0);
+        expect(toArray(registry.fileTypes).length).to.be(0);
       });
 
       it('should be a no-op if a file type of the same name is registered', () => {
@@ -238,7 +242,7 @@ describe('docregistry/registry', () => {
         registry.addFileType(fileType);
         let disposable = registry.addFileType(fileType);
         disposable.dispose();
-        expect(registry.fileTypes.at(0)).to.be(fileType);
+        expect(registry.fileTypes.next()).to.be(fileType);
       });
 
     });
@@ -248,14 +252,14 @@ describe('docregistry/registry', () => {
       it('should add a file type to the document registry', () => {
         let creator = { name: 'notebook', fileType: 'notebook' };
         registry.addCreator(creator);
-        expect(registry.creators.at(0)).to.be(creator);
+        expect(registry.creators.next()).to.be(creator);
       });
 
       it('should be removed from the registry when disposed', () => {
         let creator = { name: 'notebook', fileType: 'notebook' };
         let disposable = registry.addCreator(creator);
         disposable.dispose();
-        expect(registry.creators.length).to.be(0);
+        expect(toArray(registry.creators).length).to.be(0);
       });
 
       it('should end up in locale order', () => {
@@ -267,9 +271,9 @@ describe('docregistry/registry', () => {
         registry.addCreator(creators[0]);
         registry.addCreator(creators[1]);
         registry.addCreator(creators[2]);
-        expect(registry.creators.at(0)).to.be(creators[2]);
-        expect(registry.creators.at(1)).to.be(creators[0]);
-        expect(registry.creators.at(2)).to.be(creators[1]);
+        expect(registry.creators.next()).to.be(creators[2]);
+        expect(registry.creators.next()).to.be(creators[0]);
+        expect(registry.creators.next()).to.be(creators[1]);
       });
 
       it('should be a no-op if a file type of the same name is registered', () => {
@@ -277,7 +281,7 @@ describe('docregistry/registry', () => {
         registry.addCreator(creator);
         let disposable = registry.addCreator(creator);
         disposable.dispose();
-        expect(registry.creators.at(0)).to.eql(creator);
+        expect(registry.creators.next()).to.eql(creator);
       });
 
     });
@@ -392,15 +396,15 @@ describe('docregistry/registry', () => {
     describe('#fileTypes', () => {
 
       it('should get the registered file types', () => {
-        expect(registry.fileTypes.length).to.be(0);
+        expect(toArray(registry.fileTypes).length).to.be(0);
         let fileTypes = [
           { name: 'notebook', extension: '.ipynb' },
           { name: 'python', extension: '.py' }
         ];
         registry.addFileType(fileTypes[0]);
         registry.addFileType(fileTypes[1]);
-        expect(registry.fileTypes.at(0)).to.be(fileTypes[0]);
-        expect(registry.fileTypes.at(1)).to.be(fileTypes[1]);
+        expect(registry.fileTypes.next()).to.be(fileTypes[0]);
+        expect(registry.fileTypes.next()).to.be(fileTypes[1]);
       });
 
     });
@@ -408,7 +412,7 @@ describe('docregistry/registry', () => {
     describe('#creators', () => {
 
       it('should get the registered file creators', () => {
-        expect(registry.creators.length).to.be(0);
+        expect(toArray(registry.creators).length).to.be(0);
         let creators = [
           { name: 'Python Notebook', fileType: 'notebook' },
           { name: 'R Notebook', fileType: 'notebook' },
@@ -417,8 +421,8 @@ describe('docregistry/registry', () => {
         registry.addCreator(creators[0]);
         registry.addCreator(creators[1]);
         registry.addCreator(creators[2]);
-        expect(registry.creators.length).to.be(3);
-        expect(registry.creators.at(0).name).to.be('CSharp Notebook');
+        expect(toArray(registry.creators).length).to.be(3);
+        expect(registry.creators.next().name).to.be('CSharp Notebook');
       });
 
     });
@@ -541,12 +545,12 @@ describe('docregistry/registry', () => {
         registry.addWidgetExtension('fizz', foo);
         registry.addWidgetExtension('fizz', bar);
         registry.addWidgetExtension('buzz', foo);
-        expect(registry.getWidgetExtensions('fizz').at(0)).to.be(foo);
-        expect(registry.getWidgetExtensions('fizz').at(1)).to.be(bar);
-        expect(registry.getWidgetExtensions('fizz').length).to.be(2);
-        expect(registry.getWidgetExtensions('buzz').at(0)).to.be(foo);
-        expect(registry.getWidgetExtensions('buzz').length).to.be(1);
-        expect(registry.getWidgetExtensions('baz').length).to.be(0);
+        expect(registry.getWidgetExtensions('fizz').next()).to.be(foo);
+        expect(registry.getWidgetExtensions('fizz').next()).to.be(bar);
+        expect(toArray(registry.getWidgetExtensions('fizz')).length).to.be(2);
+        expect(registry.getWidgetExtensions('buzz').next()).to.be(foo);
+        expect(toArray(registry.getWidgetExtensions('buzz')).length).to.be(1);
+        expect(toArray(registry.getWidgetExtensions('baz')).length).to.be(0);
       });
 
     });