Skip to content

Commit c6c38b5

Browse files
committed
Add GooglePackage plugin
1 parent b86ac8c commit c6c38b5

18 files changed

+1128
-0
lines changed

Diff for: index.js

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ whole provider implementation.
77
*/
88

99
const GoogleProvider = require('./provider/googleProvider');
10+
const GooglePackage = require('./package/googlePackage');
1011
const GoogleDeploy = require('./deploy/googleDeploy');
1112
const GoogleRemove = require('./remove/googleRemove');
1213
const GoogleInvoke = require('./invoke/googleInvoke');
@@ -19,6 +20,7 @@ class GoogleIndex {
1920
this.options = options;
2021

2122
this.serverless.pluginManager.addPlugin(GoogleProvider);
23+
this.serverless.pluginManager.addPlugin(GooglePackage);
2224
this.serverless.pluginManager.addPlugin(GoogleDeploy);
2325
this.serverless.pluginManager.addPlugin(GoogleRemove);
2426
this.serverless.pluginManager.addPlugin(GoogleInvoke);

Diff for: index.test.js

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const GoogleIndex = require('./index');
44
const GoogleProvider = require('./provider/googleProvider');
5+
const GooglePackage = require('./package/googlePackage');
56
const GoogleDeploy = require('./deploy/googleDeploy');
67
const GoogleRemove = require('./remove/googleRemove');
78
const GoogleInvoke = require('./invoke/googleInvoke');
@@ -36,6 +37,7 @@ describe('GoogleIndex', () => {
3637
const addedPlugins = serverless.plugins;
3738

3839
expect(addedPlugins).toContain(GoogleProvider);
40+
expect(addedPlugins).toContain(GooglePackage);
3941
expect(addedPlugins).toContain(GoogleDeploy);
4042
expect(addedPlugins).toContain(GoogleRemove);
4143
expect(addedPlugins).toContain(GoogleInvoke);

Diff for: package.json

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"async": "^2.1.4",
2828
"bluebird": "^3.4.7",
2929
"chalk": "^1.1.3",
30+
"fs-extra": "^3.0.1",
3031
"googleapis": "^16.1.0",
3132
"lodash": "^4.17.4"
3233
},

Diff for: package/googlePackage.js

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
'use strict';
2+
3+
const BbPromise = require('bluebird');
4+
5+
const cleanupServerlessDir = require('./lib/cleanupServerlessDir');
6+
const validate = require('../shared/validate');
7+
const utils = require('../shared/utils');
8+
const setDeploymentBucketName = require('../shared/setDeploymentBucketName');
9+
const prepareDeployment = require('./lib/prepareDeployment');
10+
const saveCreateTemplateFile = require('./lib/writeFilesToDisk');
11+
const mergeServiceResources = require('./lib/mergeServiceResources');
12+
const generateArtifactDirectoryName = require('./lib/generateArtifactDirectoryName');
13+
const compileFunctions = require('./lib/compileFunctions');
14+
const saveUpdateTemplateFile = require('./lib/writeFilesToDisk');
15+
16+
class GooglePackage {
17+
constructor(serverless, options) {
18+
this.serverless = serverless;
19+
this.options = options;
20+
this.provider = this.serverless.getProvider('google');
21+
22+
Object.assign(
23+
this,
24+
cleanupServerlessDir,
25+
validate,
26+
utils,
27+
setDeploymentBucketName,
28+
prepareDeployment,
29+
saveCreateTemplateFile,
30+
generateArtifactDirectoryName,
31+
compileFunctions,
32+
mergeServiceResources,
33+
saveUpdateTemplateFile);
34+
35+
this.hooks = {
36+
'package:cleanup': () => BbPromise.bind(this)
37+
.then(this.cleanupServerlessDir),
38+
39+
'before:package:initialize': () => BbPromise.bind(this)
40+
.then(this.validate)
41+
.then(this.setDefaults),
42+
43+
'package:initialize': () => BbPromise.bind(this)
44+
.then(this.setDeploymentBucketName)
45+
.then(this.prepareDeployment)
46+
.then(this.saveCreateTemplateFile),
47+
48+
'before:package:compileFunctions': () => BbPromise.bind(this)
49+
.then(this.generateArtifactDirectoryName),
50+
51+
'package:compileFunctions': () => BbPromise.bind(this)
52+
.then(this.compileFunctions),
53+
54+
'package:finalize': () => BbPromise.bind(this)
55+
.then(this.mergeServiceResources)
56+
.then(this.saveUpdateTemplateFile),
57+
};
58+
}
59+
}
60+
61+
module.exports = GooglePackage;

Diff for: package/googlePackage.test.js

+121
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
'use strict';
2+
3+
const sinon = require('sinon');
4+
const BbPromise = require('bluebird');
5+
6+
const GoogleProvider = require('../provider/googleProvider');
7+
const GooglePackage = require('./googlePackage');
8+
const Serverless = require('../test/serverless');
9+
10+
describe('GooglePackage', () => {
11+
let serverless;
12+
let options;
13+
let googlePackage;
14+
15+
beforeEach(() => {
16+
serverless = new Serverless();
17+
options = {
18+
stage: 'my-stage',
19+
region: 'my-region',
20+
};
21+
serverless.setProvider('google', new GoogleProvider(serverless));
22+
googlePackage = new GooglePackage(serverless, options);
23+
});
24+
25+
describe('#constructor()', () => {
26+
it('should set the serverless instance', () => {
27+
expect(googlePackage.serverless).toEqual(serverless);
28+
});
29+
30+
it('should set options if provided', () => {
31+
expect(googlePackage.options).toEqual(options);
32+
});
33+
34+
it('should make the provider accessible', () => {
35+
expect(googlePackage.provider).toBeInstanceOf(GoogleProvider);
36+
});
37+
38+
describe('hooks', () => {
39+
let cleanupServerlessDirStub;
40+
let validateStub;
41+
let setDefaultsStub;
42+
let setDeploymentBucketNameStub;
43+
let prepareDeploymentStub;
44+
let saveCreateTemplateFileStub;
45+
let generateArtifactDirectoryNameStub;
46+
let compileFunctionsStub;
47+
let mergeServiceResourcesStub;
48+
let saveUpdateTemplateFileStub;
49+
50+
beforeEach(() => {
51+
cleanupServerlessDirStub = sinon.stub(googlePackage, 'cleanupServerlessDir')
52+
.returns(BbPromise.resolve());
53+
validateStub = sinon.stub(googlePackage, 'validate')
54+
.returns(BbPromise.resolve());
55+
setDefaultsStub = sinon.stub(googlePackage, 'setDefaults')
56+
.returns(BbPromise.resolve());
57+
setDeploymentBucketNameStub = sinon.stub(googlePackage, 'setDeploymentBucketName')
58+
.returns(BbPromise.resolve());
59+
prepareDeploymentStub = sinon.stub(googlePackage, 'prepareDeployment')
60+
.returns(BbPromise.resolve());
61+
saveCreateTemplateFileStub = sinon.stub(googlePackage, 'saveCreateTemplateFile')
62+
.returns(BbPromise.resolve());
63+
generateArtifactDirectoryNameStub = sinon.stub(googlePackage, 'generateArtifactDirectoryName')
64+
.returns(BbPromise.resolve());
65+
compileFunctionsStub = sinon.stub(googlePackage, 'compileFunctions')
66+
.returns(BbPromise.resolve());
67+
mergeServiceResourcesStub = sinon.stub(googlePackage, 'mergeServiceResources')
68+
.returns(BbPromise.resolve());
69+
saveUpdateTemplateFileStub = sinon.stub(googlePackage, 'saveUpdateTemplateFile')
70+
.returns(BbPromise.resolve());
71+
});
72+
73+
afterEach(() => {
74+
googlePackage.cleanupServerlessDir.restore();
75+
googlePackage.validate.restore();
76+
googlePackage.setDefaults.restore();
77+
googlePackage.setDeploymentBucketName.restore();
78+
googlePackage.prepareDeployment.restore();
79+
googlePackage.saveCreateTemplateFile.restore();
80+
googlePackage.generateArtifactDirectoryName.restore();
81+
googlePackage.compileFunctions.restore();
82+
googlePackage.mergeServiceResources.restore();
83+
googlePackage.saveUpdateTemplateFile.restore();
84+
});
85+
86+
it('should run "package:cleanup" promise chain', () => googlePackage
87+
.hooks['package:cleanup']().then(() => {
88+
expect(cleanupServerlessDirStub.calledOnce).toEqual(true);
89+
}));
90+
91+
it('should run "before:package:initialize" promise chain', () => googlePackage
92+
.hooks['before:package:initialize']().then(() => {
93+
expect(validateStub.calledOnce).toEqual(true);
94+
expect(setDefaultsStub.calledAfter(validateStub)).toEqual(true);
95+
}));
96+
97+
it('should run "package:initialize" promise chain', () => googlePackage
98+
.hooks['package:initialize']().then(() => {
99+
expect(setDeploymentBucketNameStub.calledOnce).toEqual(true);
100+
expect(prepareDeploymentStub.calledAfter(setDeploymentBucketNameStub)).toEqual(true);
101+
expect(saveCreateTemplateFileStub.calledAfter(prepareDeploymentStub)).toEqual(true);
102+
}));
103+
104+
it('should run "before:package:compileFunctions" promise chain', () => googlePackage
105+
.hooks['before:package:compileFunctions']().then(() => {
106+
expect(generateArtifactDirectoryNameStub.calledOnce).toEqual(true);
107+
}));
108+
109+
it('should run "package:compileFunctions" promise chain', () => googlePackage
110+
.hooks['package:compileFunctions']().then(() => {
111+
expect(compileFunctionsStub.calledOnce).toEqual(true);
112+
}));
113+
114+
it('should run "package:finalize" promise chain', () => googlePackage
115+
.hooks['package:finalize']().then(() => {
116+
expect(mergeServiceResourcesStub.calledOnce).toEqual(true);
117+
expect(saveUpdateTemplateFileStub.calledAfter(mergeServiceResourcesStub)).toEqual(true);
118+
}));
119+
});
120+
});
121+
});

Diff for: package/lib/cleanupServerlessDir.js

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
'use strict';
2+
3+
const BbPromise = require('bluebird');
4+
const path = require('path');
5+
const fse = require('fs-extra');
6+
7+
module.exports = {
8+
cleanupServerlessDir() {
9+
if (this.serverless.config.servicePath) {
10+
const serverlessDirPath = path.join(this.serverless.config.servicePath, '.serverless');
11+
12+
if (fse.pathExistsSync(serverlessDirPath)) {
13+
fse.removeSync(serverlessDirPath);
14+
}
15+
}
16+
17+
return BbPromise.resolve();
18+
},
19+
};

Diff for: package/lib/cleanupServerlessDir.test.js

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
'use strict';
2+
3+
const path = require('path');
4+
5+
const sinon = require('sinon');
6+
const fse = require('fs-extra');
7+
8+
const GoogleProvider = require('../../provider/googleProvider');
9+
const GooglePackage = require('../googlePackage');
10+
const Serverless = require('../../test/serverless');
11+
12+
describe('CleanupServerlessDir', () => {
13+
let serverless;
14+
let googlePackage;
15+
let pathExistsSyncStub;
16+
let removeSyncStub;
17+
18+
beforeEach(() => {
19+
serverless = new Serverless();
20+
serverless.service.service = 'my-service';
21+
serverless.config = {
22+
servicePath: false,
23+
};
24+
serverless.setProvider('google', new GoogleProvider(serverless));
25+
const options = {
26+
stage: 'dev',
27+
region: 'us-central1',
28+
};
29+
googlePackage = new GooglePackage(serverless, options);
30+
pathExistsSyncStub = sinon.stub(fse, 'pathExistsSync');
31+
removeSyncStub = sinon.stub(fse, 'removeSync').returns();
32+
});
33+
34+
afterEach(() => {
35+
fse.pathExistsSync.restore();
36+
fse.removeSync.restore();
37+
});
38+
39+
describe('#cleanupServerlessDir()', () => {
40+
it('should resolve if no servicePath is given', () => {
41+
googlePackage.serverless.config.servicePath = false;
42+
43+
pathExistsSyncStub.returns();
44+
45+
return googlePackage.cleanupServerlessDir().then(() => {
46+
expect(pathExistsSyncStub.calledOnce).toEqual(false);
47+
expect(removeSyncStub.calledOnce).toEqual(false);
48+
});
49+
});
50+
51+
it('should remove the .serverless directory if it exists', () => {
52+
const serviceName = googlePackage.serverless.service.service;
53+
googlePackage.serverless.config.servicePath = serviceName;
54+
const serverlessDirPath = path.join(serviceName, '.serverless');
55+
56+
pathExistsSyncStub.returns(true);
57+
58+
return googlePackage.cleanupServerlessDir().then(() => {
59+
expect(pathExistsSyncStub.calledWithExactly(serverlessDirPath)).toEqual(true);
60+
expect(removeSyncStub.calledWithExactly(serverlessDirPath)).toEqual(true);
61+
});
62+
});
63+
64+
it('should not remove the .serverless directory if does not exist', () => {
65+
const serviceName = googlePackage.serverless.service.service;
66+
googlePackage.serverless.config.servicePath = serviceName;
67+
const serverlessDirPath = path.join(serviceName, '.serverless');
68+
69+
pathExistsSyncStub.returns(false);
70+
71+
return googlePackage.cleanupServerlessDir().then(() => {
72+
expect(pathExistsSyncStub.calledWithExactly(serverlessDirPath)).toEqual(true);
73+
expect(removeSyncStub.calledWithExactly(serverlessDirPath)).toEqual(false);
74+
});
75+
});
76+
});
77+
});

0 commit comments

Comments
 (0)