From c5bb4f277052310c87faf711d877dae8c02f11b8 Mon Sep 17 00:00:00 2001 From: Dave Gramlich Date: Fri, 17 Mar 2017 10:00:12 -0400 Subject: [PATCH 1/3] common: allow promises to resolve with a single arg --- packages/common/src/util.js | 15 ++++++++++++--- packages/common/test/util.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/packages/common/src/util.js b/packages/common/src/util.js index 12ad999e833..00f52b3a821 100644 --- a/packages/common/src/util.js +++ b/packages/common/src/util.js @@ -687,13 +687,18 @@ util.getUserAgentFromPackageJson = getUserAgentFromPackageJson; * Wraps a callback style function to conditionally return a promise. * * @param {function} originalMethod - The method to promisify. + * @param {object=} options - Promise options. + * @param {boolean} options.singular - Resolve the promise with single arg + * instead of an array. * @return {function} wrapped */ -function promisify(originalMethod) { +function promisify(originalMethod, options) { if (originalMethod.promisified_) { return originalMethod; } + options = options || {}; + var slice = Array.prototype.slice; var wrapper = function() { @@ -723,7 +728,11 @@ function promisify(originalMethod) { return reject(err); } - resolve(callbackArgs); + if (options.singular && callbackArgs.length === 1) { + resolve(callbackArgs[0]); + } else { + resolve(callbackArgs); + } }); originalMethod.apply(context, args); @@ -758,7 +767,7 @@ function promisifyAll(Class, options) { var originalMethod = Class.prototype[methodName]; if (!originalMethod.promisified_) { - Class.prototype[methodName] = util.promisify(originalMethod); + Class.prototype[methodName] = util.promisify(originalMethod, options); } }); } diff --git a/packages/common/test/util.js b/packages/common/test/util.js index c7a6067345c..2e23a5ded6d 100644 --- a/packages/common/test/util.js +++ b/packages/common/test/util.js @@ -1578,6 +1578,25 @@ describe('common/util', function() { assert(FakeClass2.prototype.method.promisified_); }); + it('should pass the options object to promsify', function(done) { + var promisify = util.promisify; + var fakeOptions = { + a: 'a' + }; + + util.promisify = function(method, options) { + assert.strictEqual(method, FakeClass2.prototype.method); + assert.strictEqual(options, fakeOptions); + util.promisify = promisify; + done(); + }; + + function FakeClass2() {} + FakeClass2.prototype.method = function() {}; + + util.promisifyAll(FakeClass2, fakeOptions); + }); + it('should not re-promisify methods', function() { var method = FakeClass.prototype.methodName; @@ -1643,5 +1662,19 @@ describe('common/util', function() { assert(promise instanceof FakePromise); }); + + it('should resolve singular arguments', function() { + var fakeArg = 'hi'; + + func = util.promisify(function(callback) { + callback.apply(this, [null, fakeArg]); + }, { + singular: true + }); + + return func().then(function(arg) { + assert.strictEqual(arg, fakeArg); + }); + }); }); }); From 0eb0ba6dda014c55fff25d70bb5916740d2b00ad Mon Sep 17 00:00:00 2001 From: Dave Gramlich Date: Fri, 17 Mar 2017 10:03:07 -0400 Subject: [PATCH 2/3] typo --- packages/common/test/util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/common/test/util.js b/packages/common/test/util.js index 2e23a5ded6d..02cba7f496b 100644 --- a/packages/common/test/util.js +++ b/packages/common/test/util.js @@ -1578,7 +1578,7 @@ describe('common/util', function() { assert(FakeClass2.prototype.method.promisified_); }); - it('should pass the options object to promsify', function(done) { + it('should pass the options object to promisify', function(done) { var promisify = util.promisify; var fakeOptions = { a: 'a' From 3d0374982dd708b66f6d1937d6cc1a7327ba7aea Mon Sep 17 00:00:00 2001 From: Dave Gramlich Date: Fri, 17 Mar 2017 10:13:32 -0400 Subject: [PATCH 3/3] more tests --- packages/common/test/util.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/common/test/util.js b/packages/common/test/util.js index 02cba7f496b..92e11d6f67c 100644 --- a/packages/common/test/util.js +++ b/packages/common/test/util.js @@ -1676,5 +1676,19 @@ describe('common/util', function() { assert.strictEqual(arg, fakeArg); }); }); + + it('should ignore singular when multiple args are present', function() { + var fakeArgs = ['a', 'b']; + + func = util.promisify(function(callback) { + callback.apply(this, [null].concat(fakeArgs)); + }, { + singular: true + }); + + return func().then(function(args) { + assert.deepEqual(args, fakeArgs); + }); + }); }); });