From 5eacdd4bf94edc8328f42e3591ba4dd79d347571 Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Thu, 14 Mar 2013 10:49:14 -1000 Subject: [PATCH] repl: emit 'reset' event when context is reset Closes #1183. --- doc/api/repl.markdown | 21 +++++++++++ lib/repl.js | 3 ++ test/simple/test-repl-reset-event.js | 73 ++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 test/simple/test-repl-reset-event.js diff --git a/doc/api/repl.markdown b/doc/api/repl.markdown index 557ae17..a82eaf4 100644 --- a/doc/api/repl.markdown +++ b/doc/api/repl.markdown @@ -135,6 +135,27 @@ Example of listening for `exit`: }); +### Event: 'reset' + +`function (context) {}` + +Emitted when the REPL's context is reset. This happens when you type `.clear`. +If you start the repl with `{ useGlobal: true }` then this event will never +be emitted. + +Example of listening for `reset`: + + // Extend the initial repl context. + r = repl.start({ options ... }); + someExtension.extend(r.context); + + // When a new context is created extend it as well. + r.on('reset', function (context) { + console.log('repl has a new context'); + someExtension.extend(context); + }); + + ## REPL Features diff --git a/lib/repl.js b/lib/repl.js index f0c1cb2..f7be0c5 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -356,6 +356,9 @@ REPLServer.prototype.createContext = function() { REPLServer.prototype.resetContext = function() { this.context = this.createContext(); + + // Allow REPL extensions to extend the new context + this.emit('reset', this.context); }; REPLServer.prototype.displayPrompt = function(preserveCursor) { diff --git a/test/simple/test-repl-reset-event.js b/test/simple/test-repl-reset-event.js new file mode 100644 index 0000000..3554d17 --- /dev/null +++ b/test/simple/test-repl-reset-event.js @@ -0,0 +1,73 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var common = require('../common'); +common.globalCheck = false; + +var assert = require('assert'); +var repl = require('repl'); +var Stream = require('stream'); + +// create a dummy stream that does nothing +var dummy = new Stream(); +dummy.write = dummy.pause = dummy.resume = function(){}; +dummy.readable = dummy.writable = true; + +function testReset(cb) { + var r = repl.start({ + input: dummy, + output: dummy, + useGlobal: false + }); + r.context.foo = 42; + r.on('reset', function(context) { + assert(!!context, 'REPL did not emit a context with reset event'); + assert.equal(context, r.context, 'REPL emitted incorrect context'); + assert.equal(context.foo, undefined, 'REPL emitted the previous context, and is not using global as context'); + context.foo = 42; + cb(); + }); + r.resetContext(); +} + +function testResetGlobal(cb) { + var r = repl.start({ + input: dummy, + output: dummy, + useGlobal: true + }); + r.context.foo = 42; + r.on('reset', function(context) { + assert.equal(context.foo, 42, '"foo" property is missing from REPL using global as context'); + cb(); + }); + r.resetContext(); +} + +var timeout = setTimeout(function() { + assert.fail('Timeout, REPL did not emit reset events'); +}, 5000); + +testReset(function() { + testResetGlobal(function() { + clearTimeout(timeout); + }); +}); -- 2.7.4