From c2bcc7fa5d643cc37a2f32695e22078ab3f14a96 Mon Sep 17 00:00:00 2001 From: mrloop Date: Wed, 23 Aug 2017 16:24:50 +0100 Subject: [PATCH] Multi file upload --- index.js | 33 +++++++++++++++++-------- lib/redis.js | 31 ++++++++++++++++++++++++ package.json | 2 ++ tests/helpers/fake-redis-client.js | 4 +++ tests/unit/lib/redis-test.js | 39 +++++++++++++++++++++++------- yarn.lock | 17 +++++++++++++ 6 files changed, 107 insertions(+), 19 deletions(-) diff --git a/index.js b/index.js index 268a30e..891867e 100644 --- a/index.js +++ b/index.js @@ -4,6 +4,8 @@ var RSVP = require('rsvp'); var path = require('path'); var fs = require('fs'); +var glob = require('glob'); +var minimatch = require('minimatch'); var denodeify = require('rsvp').denodeify; var readFile = denodeify(fs.readFile); @@ -84,19 +86,30 @@ module.exports = { upload: function(/* context */) { var redisDeployClient = this.readConfig('redisDeployClient'); var revisionKey = this.readConfig('revisionKey'); + var revisionData = this.readConfig('revisionData'); var distDir = this.readConfig('distDir'); var filePattern = this.readConfig('filePattern'); var keyPrefix = this.readConfig('keyPrefix'); - var filePath = path.join(distDir, filePattern); - - this.log('Uploading `' + filePath + '`', { verbose: true }); - return this._readFileContents(filePath) - .then(redisDeployClient.upload.bind(redisDeployClient, keyPrefix, revisionKey, this.readConfig('revisionData'))) - .then(this._uploadSuccessMessage.bind(this)) - .then(function(key) { - return { redisKey: key }; - }) - .catch(this._errorMessage.bind(this)); + + + var distFiles = glob.sync('**/*', { cwd: distDir, nodir: true }); + var filesToUpload = distFiles.filter(minimatch.filter(filePattern, { matchBase: true, dot: false })); + + this.log('Uploading `' + filesToUpload.join(',') + '`', { verbose: true }); + var readFileContents = this._readFileContents; + + return RSVP.hash(filesToUpload.reduce(function(hsh, filePath) { + hsh[filePath] = readFileContents(path.join(distDir, filePath)); + return hsh; + }, {})) + .then(function(filesHash) { + return redisDeployClient.upload(keyPrefix, revisionKey, revisionData, filesHash); + }) + .then(this._uploadSuccessMessage.bind(this)) + .then(function(key) { + return { redisKey: key }; + }) + .catch(this._errorMessage.bind(this)); }, willActivate: function(/* context */) { diff --git a/lib/redis.js b/lib/redis.js index f11f1b0..eb75d67 100644 --- a/lib/redis.js +++ b/lib/redis.js @@ -158,6 +158,37 @@ module.exports = CoreObject.extend({ }, _uploadIfKeyDoesNotExist: function(redisKey, value) { + if(Object.keys(value).length === 1) { + return this._uploadStringIfKeyDoesNotExist(redisKey, value[Object.keys(value)[0]]); + } else { + return this._uploadHashIfKeyDoesNotExist(redisKey, value); + } + }, + + _uploadHashIfKeyDoesNotExist: function(redisKey, hsh) { + var client = this._client; + var allowOverwrite = !!this._allowOverwrite; + + return RSVP.resolve() + .then(function() { + return client.hlen(redisKey); + }) + .then(function(value) { + if (value > 0 && !allowOverwrite) { + return RSVP.reject('Value already exists for key: ' + redisKey); + } + }) + .then(function() { + var redisArr = Object.keys(hsh).reduce(function(arr, key){ + arr.push(key); + arr.push(hsh[key]); + return arr; + }, [redisKey]); + return client.hmset.apply(client, redisArr); + }); + }, + + _uploadStringIfKeyDoesNotExist: function(redisKey, value) { var client = this._client; var allowOverwrite = !!this._allowOverwrite; diff --git a/package.json b/package.json index 84d409f..6c48a11 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,8 @@ "chalk": "^1.1.3", "core-object": "^2.0.6", "ember-cli-deploy-plugin": "^0.2.9", + "glob": "^7.1.2", + "minimatch": "^3.0.3", "redis": "^2.6.3", "rsvp": "^3.0.18", "then-redis": "^2.0.1" diff --git a/tests/helpers/fake-redis-client.js b/tests/helpers/fake-redis-client.js index a8d9b74..bbdf6b2 100644 --- a/tests/helpers/fake-redis-client.js +++ b/tests/helpers/fake-redis-client.js @@ -11,6 +11,10 @@ module.exports = CoreObject.extend({ return RSVP.resolve('some-other-value'); }, set: function() { }, + hlen: function(/* key */) { + return RSVP.resolve(0); + }, + hmset: function() { }, del: function() { }, zadd: function(key, score , tag) { var prefix = key.replace(':revisions',''); diff --git a/tests/unit/lib/redis-test.js b/tests/unit/lib/redis-test.js index a0b286a..34c43fa 100644 --- a/tests/unit/lib/redis-test.js +++ b/tests/unit/lib/redis-test.js @@ -16,10 +16,31 @@ describe('redis', function() { }); describe('#upload', function() { + describe('multiple files', function() { + it('uploads the contents if the key does not already exist', function() { + var fileUploaded = false; + + var redis = new Redis({}, new FakeRedis(FakeClient.extend({ + hlen: function(key) { + return RSVP.resolve(0); + }, + hmset: function(key) { + fileUploaded = true; + } + }))); + + var promise = redis.upload('key', {'index.html': 'value', 'vendor.js': "'use strict';"}); + return assert.isFulfilled(promise) + .then(function() { + assert.ok(fileUploaded); + }); + }); + }); + it('rejects if the key already exists in redis', function() { var redis = new Redis({}, new FakeRedis()); - var promise = redis.upload('key', 'value'); + var promise = redis.upload('key', {'index.html': 'value'}); return assert.isRejected(promise, /^Value already exists for key: key:default$/); }); @@ -41,7 +62,7 @@ describe('redis', function() { } }))); - var promise = redis.upload('key', 'value'); + var promise = redis.upload('key', {'index.html': 'value'}); return assert.isFulfilled(promise) .then(function() { assert.ok(fileUploaded); @@ -59,7 +80,7 @@ describe('redis', function() { } }))); - var promise = redis.upload('key', 'value'); + var promise = redis.upload('key', {'index.html': 'value'}); return assert.isFulfilled(promise) .then(function() { assert.ok(fileUploaded); @@ -73,7 +94,7 @@ describe('redis', function() { } }))); - var promise = redis.upload('key', 'value'); + var promise = redis.upload('key', {'index.html': 'value'}); return assert.isFulfilled(promise) .then(function() { assert.equal(redis._client.recentRevisions.length, 1); @@ -102,7 +123,7 @@ describe('redis', function() { redis._client.recentRevisions = ['1','2','3','4','5','6','7','8','9','10','11']; - var promise = redis.upload('key', '12', 'value'); + var promise = redis.upload('key', '12', {'index.html': 'value'}); return assert.isFulfilled(promise) .then(function() { assert.equal(redis._client.recentRevisions.length, 10); @@ -127,7 +148,7 @@ describe('redis', function() { redis._client.recentRevisions = ['1','2','3','4','5','6','7','8','9','10','11']; - var promise = redis.upload('key', '12', 'value'); + var promise = redis.upload('key', '12', {'index.html': 'value'}); return assert.isFulfilled(promise) .then(function() { assert.equal(redis._client.recentRevisions.length, 11); @@ -150,7 +171,7 @@ describe('redis', function() { redis._client.recentRevisions = ['1','2','3','4','5']; - var promise = redis.upload('key', '6', 'value'); + var promise = redis.upload('key', '6', {'index.html': 'value'}); return assert.isFulfilled(promise) .then(function() { assert.equal(redis._client.recentRevisions.length, 5); @@ -169,7 +190,7 @@ describe('redis', function() { } }))); - var promise = redis.upload('key', 'value'); + var promise = redis.upload('key', {'index.html': 'value'}); return assert.isRejected(promise) .then(function() { assert.equal(redisKey, 'key:default'); @@ -185,7 +206,7 @@ describe('redis', function() { } }))); - var promise = redis.upload('key', 'tag', 'value'); + var promise = redis.upload('key', 'tag', {'index.html': 'value'}); return assert.isRejected(promise) .then(function() { assert.equal(redisKey, 'key:tag'); diff --git a/yarn.lock b/yarn.lock index 548d22b..f70f81f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -413,6 +413,10 @@ balanced-match@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" @@ -505,6 +509,13 @@ brace-expansion@^1.0.0: balanced-match "^0.4.1" concat-map "0.0.1" +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" @@ -3390,6 +3401,12 @@ minimatch@^2.0.1, minimatch@^2.0.3: dependencies: brace-expansion "^1.0.0" +minimatch@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"