Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 23 additions & 10 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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 */) {
Expand Down
31 changes: 31 additions & 0 deletions lib/redis.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
4 changes: 4 additions & 0 deletions tests/helpers/fake-redis-client.js
Original file line number Diff line number Diff line change
Expand Up @@ -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','');
Expand Down
39 changes: 30 additions & 9 deletions tests/unit/lib/redis-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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$/);
});

Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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');
Expand All @@ -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');
Expand Down
17 changes: 17 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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"

[email protected]:
version "0.1.5"
resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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"

[email protected], minimist@~0.0.1:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
Expand Down