Bladeren bron

Add disposal methods and use them where needed.

Jason Grout 5 jaren geleden
bovenliggende
commit
4d84d97d2e

+ 21 - 0
packages/logconsole/src/logger.ts

@@ -350,6 +350,26 @@ export class Logger implements ILogger {
     });
   }
 
+  /**
+   * Whether the logger is disposed.
+   */
+  get isDisposed() {
+    return this._isDisposed;
+  }
+
+  /**
+   * Dispose the logger.
+   */
+  dispose() {
+    if (this.isDisposed) {
+      return;
+    }
+    this._isDisposed = true;
+    this.clear();
+    this._rendermime = null;
+    Signal.clearData(this);
+  }
+
   private _log(options: { output: nbformat.IOutput; level: FullLogLevel }) {
     // First, make sure our version reflects the new message so things
     // triggering from the signals below have the correct version.
@@ -367,6 +387,7 @@ export class Logger implements ILogger {
     this._contentChanged.emit('append');
   }
 
+  private _isDisposed = false;
   private _contentChanged = new Signal<this, IContentChange>(this);
   private _stateChanged = new Signal<this, IStateChange>(this);
   private _rendermime: IRenderMimeRegistry | null = null;

+ 21 - 1
packages/logconsole/src/registry.ts

@@ -76,10 +76,30 @@ export class LoggerRegistry implements ILoggerRegistry {
     });
   }
 
+  /**
+   * Whether the register is disposed.
+   */
+  get isDisposed() {
+    return this._isDisposed;
+  }
+
+  /**
+   * Dispose the registry and all loggers.
+   */
+  dispose() {
+    if (this.isDisposed) {
+      return;
+    }
+    this._isDisposed = true;
+    this._loggers.forEach(x => x.dispose());
+    Signal.clearData(this);
+  }
+
   private _defaultRendermime: IRenderMimeRegistry = null;
-  private _loggers = new Map<string, Logger>();
+  private _loggers = new Map<string, ILogger>();
   private _maxLength: number;
   private _registryChanged = new Signal<this, ILoggerRegistryChange>(this);
+  private _isDisposed = false;
 }
 
 export namespace LoggerRegistry {

+ 3 - 2
packages/logconsole/src/tokens.ts

@@ -10,6 +10,7 @@ import { IOutputAreaModel } from '@jupyterlab/outputarea';
 import { Token } from '@phosphor/coreutils';
 
 import { ISignal } from '@phosphor/signaling';
+import { IDisposable } from '@phosphor/disposable';
 
 /* tslint:disable */
 /**
@@ -24,7 +25,7 @@ export type ILoggerRegistryChange = 'append';
 /**
  * A Logger Registry that registers and provides loggers by source.
  */
-export interface ILoggerRegistry {
+export interface ILoggerRegistry extends IDisposable {
   /**
    * Get the logger for the specified source.
    *
@@ -134,7 +135,7 @@ export interface ILoggerOutputAreaModel extends IOutputAreaModel {
 /**
  * A Logger that manages logs from a particular source.
  */
-export interface ILogger {
+export interface ILogger extends IDisposable {
   /**
    * Number of outputs logged.
    */

+ 1 - 0
tests/test-logconsole/package.json

@@ -16,6 +16,7 @@
     "@jupyterlab/rendermime": "^2.0.0-alpha.1",
     "@jupyterlab/testutils": "^2.0.0-alpha.1",
     "@phosphor/signaling": "^1.3.0",
+    "@phosphor/widgets": "^1.9.0",
     "jest": "^24.7.1",
     "jest-junit": "^6.3.0",
     "ts-jest": "^24.0.2"

+ 8 - 0
tests/test-logconsole/src/logger.spec.ts

@@ -44,6 +44,7 @@ describe('LoggerOutputAreaModel', () => {
     it('should set the max length', async () => {
       const model = new LoggerOutputAreaModel({ maxLength: 10 });
       expect(model.maxLength).toEqual(10);
+      model.dispose();
     });
   });
 
@@ -85,6 +86,9 @@ describe('Logger', () => {
   beforeEach(() => {
     logger = new Logger({ source: 'test source', maxLength: 10 });
   });
+  afterEach(() => {
+    logger.dispose();
+  });
 
   describe('#constructor()', () => {
     it('should create a Logger with initial properties', () => {
@@ -163,6 +167,7 @@ describe('Logger', () => {
           newValue: 'info'
         }
       ]);
+      s.dispose();
     });
 
     it('setting to its current value has no effect', () => {
@@ -170,6 +175,7 @@ describe('Logger', () => {
       logger.level = logger.level;
       expect(s.args.length).toBe(0);
       expect(logger.length).toBe(0);
+      s.dispose();
     });
   });
 
@@ -213,12 +219,14 @@ describe('Logger', () => {
       const s = new SignalLogger(logger.stateChanged);
       logger.rendermime = newValue;
       expect(s.args).toEqual([{ name: 'rendermime', oldValue, newValue }]);
+      s.dispose();
     });
     it('setting to current value has no effect', () => {
       logger.rendermime = new RenderMimeRegistry();
       const s = new SignalLogger(logger.stateChanged);
       logger.rendermime = logger.rendermime;
       expect(s.args).toEqual([]);
+      s.dispose();
     });
   });
 

+ 5 - 0
tests/test-logconsole/src/registry.spec.ts

@@ -36,6 +36,10 @@ describe('LoggerRegistry', () => {
     });
   });
 
+  afterEach(() => {
+    registry.dispose();
+  });
+
   describe('#constructor()', () => {
     it('should create a registry with initial parameters', () => {
       expect(registry).toBeInstanceOf(LoggerRegistry);
@@ -59,6 +63,7 @@ describe('LoggerRegistry', () => {
       const s = new SignalLogger(registry.registryChanged);
       registry.getLogger('A');
       expect(s.args).toEqual(['append']);
+      s.dispose();
     });
   });
 

+ 4 - 0
tests/test-logconsole/src/widget.spec.ts

@@ -60,6 +60,10 @@ describe('LogConsolePanel', () => {
     });
     logConsole = new LogConsolePanel(registry);
   });
+  afterEach(() => {
+    registry.dispose();
+    logConsole.dispose();
+  });
 
   describe('#constructor()', () => {
     it('should create a console with initial parameters', () => {