diff --git a/lib/logger.js b/lib/logger.js index a19f61b1a..3e8901e23 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -44,7 +44,7 @@ module.exports.callbacks = { * @param data */ "file:reload": function (bs, data) { - if (bs.options.get("logFileChanges")) { + if (canLogFileChange(bs, data)) { if (data.path[0] === "*") { return logger.info("{cyan:Reloading files that match: {magenta:%s", data.path); @@ -64,7 +64,7 @@ module.exports.callbacks = { * */ "browser:reload": function (bs) { - if (bs.getOption("logFileChanges")) { + if (canLogFileChange(bs)) { logger.info("{cyan:Reloading Browsers..."); } }, @@ -80,7 +80,7 @@ module.exports.callbacks = { * @param data */ "stream:changed": function (bs, data) { - if (bs.getOption("logFileChanges")) { + if (canLogFileChange(bs)) { var changed = data.changed; logger.info("{cyan:%s %s changed} ({magenta:%s})", @@ -271,3 +271,17 @@ function getKeyName(key) { } return utils.ucfirst(key); } + +/** + * Determine if file changes should be logged + * @param bs + * @param data + * @returns {boolean} + */ +function canLogFileChange(bs, data) { + if (data && data.log === false) { + return false; + } + + return bs.options.get("logFileChanges"); +} diff --git a/test/specs/api/init.reload.stream.js b/test/specs/api/init.reload.stream.js index a7929e344..d4a5d33d5 100644 --- a/test/specs/api/init.reload.stream.js +++ b/test/specs/api/init.reload.stream.js @@ -2,7 +2,8 @@ var browserSync = require("../../../"); -var sinon = require("sinon"); +var sinon = require("sinon"); +var assert = require("chai").assert; var File = require("vinyl"); describe("API: .stream()", function () { @@ -109,6 +110,27 @@ describe("API: .stream()", function () { stream.write(new File({path: "core.css"})); stream.write(new File({path: "index.html"})); stream.end(); + clock.tick(); sinon.assert.notCalled(emitterStub); }); + it("emits the stream:changed event with an array of changed files", function () { + + var stream = browserSync.stream(); + + stream.write(new File({path: "/users/shane/styles.js"})); + stream.write(new File({path: "core.css"})); + stream.write(new File({path: "index.html"})); + + stream.end(); + clock.tick(); + + assert.isFalse(emitterStub.getCall(0).args[1].log); + assert.isFalse(emitterStub.getCall(1).args[1].log); + assert.isFalse(emitterStub.getCall(2).args[1].log); + + sinon.assert.callCount(emitterStub, 7); + assert.equal(emitterStub.getCall(6).args[0], "stream:changed"); + assert.equal(emitterStub.getCall(6).args[1].changed.length, 3); + sinon.assert.called(emitterStub); + }); }); diff --git a/test/specs/logger/logger.files.changed.js b/test/specs/logger/logger.files.changed.js new file mode 100644 index 000000000..b5081ff22 --- /dev/null +++ b/test/specs/logger/logger.files.changed.js @@ -0,0 +1,113 @@ +"use strict"; + +var browserSync = require("../../../"); +var logger = require("../../../lib/logger").logger; +var callbacks = require("../../../lib/logger").callbacks; +var sinon = require("sinon"); + +describe("Logs file change events following stream:changed", function () { + var spy; + before(function () { + spy = sinon.stub(logger, "info"); + }); + afterEach(function () { + spy.reset(); + }); + after(function () { + logger.info.restore(); + }); + it("should log when straem:changed", function (done) { + browserSync.reset(); + browserSync({ + server: "./app", + files: "*.html", + open: false + }, function (err, bs) { + spy.reset(); + callbacks["stream:changed"](bs, {changed: ["core.css"]}); + sinon.assert.called(spy); + bs.cleanup(done); + }); + }); + it("should NOT log when stream:changed but logFileChanges = false", function (done) { + browserSync.reset(); + browserSync({ + server: "./app", + files: "*.html", + logFileChanges: false, + open: false + }, function (err, bs) { + spy.reset(); + callbacks["stream:changed"](bs, {changed: ["core.css"]}); + sinon.assert.notCalled(spy); + bs.cleanup(done); + }); + }); + it("should log when file:reload", function (done) { + browserSync.reset(); + browserSync({ + server: "./app", + files: "*.html", + open: false + }, function (err, bs) { + spy.reset(); + callbacks["file:reload"](bs, {log: true, path: "style.css", cwd: "/users/shane"}); + sinon.assert.called(spy); + bs.cleanup(done); + }); + }); + it("should NOT log when file:reload but log:false", function (done) { + browserSync.reset(); + browserSync({ + server: "./app", + files: "*.html", + open: false + }, function (err, bs) { + spy.reset(); + callbacks["file:reload"](bs, {log: false, path: "style.css", cwd: "/users/shane"}); + sinon.assert.notCalled(spy); + bs.cleanup(done); + }); + }); + it("should NOT log when options logFileChanges = false", function (done) { + browserSync.reset(); + browserSync({ + server: "./app", + files: "*.html", + logFileChanges: false, + open: false + }, function (err, bs) { + spy.reset(); + callbacks["file:reload"](bs, {log: true, path: "style.css", cwd: "/users/shane"}); + sinon.assert.notCalled(spy); + bs.cleanup(done); + }); + }); + it("should log when browser:reload", function (done) { + browserSync.reset(); + browserSync({ + server: "./app", + files: "*.html", + open: false + }, function (err, bs) { + spy.reset(); + callbacks["browser:reload"](bs); + sinon.assert.called(spy); + bs.cleanup(done); + }); + }); + it("should NOT log when browser:reload but logFileChanges = false", function (done) { + browserSync.reset(); + browserSync({ + server: "./app", + files: "*.html", + logFileChanges: false, + open: false + }, function (err, bs) { + spy.reset(); + callbacks["browser:reload"](bs); + sinon.assert.notCalled(spy); + bs.cleanup(done); + }); + }); +});