Added project detail prompts.

These prompts include things like project name, description,
authors, and homepage, all set with sane defaults.

Change-Id: Ia0f16b517c64953af77dd82829361ab5305f95d8
This commit is contained in:
Michael Krotscheck
2016-05-16 08:51:00 -07:00
parent bc11aa0cb9
commit 8f01e2447d
3 changed files with 140 additions and 11 deletions

View File

@@ -1,19 +1,60 @@
(function () { (function () {
'use strict'; 'use strict';
var Q = require('q');
var pkgBuilder = require('../pkg_builder'); var pkgBuilder = require('../pkg_builder');
var projectBuilder = require('../project_builder'); var projectBuilder = require('../project_builder');
var packagePath = 'package.json'; var packagePath = 'package.json';
/** /**
* No-op placeholder method, for handlers we don't need. * Iterate over needed package components, ensuring that required
* parameters are set.
* *
* @param {generator} generator The currently active generator. * @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining. * @returns {generator} The passed generator, for promise chaining.
*/ */
function noop (generator) { function promptPackage (generator) {
return generator; var deferred = Q.defer();
if (!generator.options['non-interactive']) {
generator.prompt(
[{
type: 'input',
name: 'name',
message: 'Project- Name:',
default: pkgBuilder.getValue('name')
}, {
type: 'input',
name: 'description',
message: 'Project- Description:',
default: pkgBuilder.getValue('description')
}, {
type: 'input',
name: 'version',
message: 'Project- Version:',
default: pkgBuilder.getValue('version', '0.0.1')
}, {
type: 'input',
name: 'homepage',
message: 'Project- Homepage:',
default: pkgBuilder.getValue('homepage', 'http://www.openstack.org/')
}, {
type: 'input',
name: 'author',
message: 'Project- Author:',
default: pkgBuilder.getValue('author',
'OpenStack <openstack-dev@lists.openstack.org> (http://www.openstack.org/)')
}],
function (answers) {
pkgBuilder.setValues(answers);
deferred.resolve(generator);
});
} else {
deferred.resolve(generator);
}
return deferred.promise;
} }
/** /**
@@ -46,7 +87,7 @@
module.exports = { module.exports = {
init: initializePackage, init: initializePackage,
prompt: noop, prompt: promptPackage,
configure: configurePkg configure: configurePkg
}; };
})(); })();

View File

@@ -38,6 +38,7 @@
it('should create all files created in the project builder', it('should create all files created in the project builder',
function (done) { function (done) {
helpers.run(generator) helpers.run(generator)
.withArguments(['--non-interactive'])
.on('end', function () { .on('end', function () {
assert.file(['.gitreview']); // We'll just use a file we know about. assert.file(['.gitreview']); // We'll just use a file we know about.
done(); done();
@@ -59,6 +60,7 @@
projectBuilder.writeFile('test_undefined.json'); projectBuilder.writeFile('test_undefined.json');
helpers.run(generator) helpers.run(generator)
.withArguments(['--non-interactive'])
.on('end', function () { .on('end', function () {
assert.file(['test.json', 'test_static.json', 'test_empty.json', 'test_null.json', assert.file(['test.json', 'test_static.json', 'test_empty.json', 'test_null.json',
'test_undefined.json']); 'test_undefined.json']);
@@ -71,6 +73,7 @@
projectBuilder.removeFile('test.json'); projectBuilder.removeFile('test.json');
helpers.run(generator) helpers.run(generator)
.withArguments(['--non-interactive'])
.on('end', function () { .on('end', function () {
assert.noFile(['test.json']); assert.noFile(['test.json']);
done(); done();

View File

@@ -8,11 +8,18 @@
var mocks = require('../../../helpers/mocks'); var mocks = require('../../../helpers/mocks');
var mockGenerator; var mockGenerator;
var packageFile = {};
describe('generator-openstack:lib/component/pkg', function () { describe('generator-openstack:lib/component/pkg', function () {
beforeEach(function () { beforeEach(function () {
mockGenerator = mocks.buildGenerator(); mockGenerator = mocks.buildGenerator();
projectBuilder.clear(); projectBuilder.clear();
jasmine.clock().install();
});
afterEach(function () {
jasmine.clock().uninstall();
}); });
it('should define init, prompt, and configure', it('should define init, prompt, and configure',
@@ -40,17 +47,95 @@
}); });
describe('prompt()', function () { describe('prompt()', function () {
it('should return a generator',
it('should return a promise that resolves with a generator',
function () { function () {
var outputGenerator = pkg.prompt(mockGenerator); var generator = mocks.buildGenerator();
expect(outputGenerator).toEqual(mockGenerator); var outputPromise = pkg.prompt(generator);
outputPromise.then(function (outputGenerator) {
expect(outputGenerator).toEqual(generator);
});
}); });
it('should do nothing', it('should revert to config defaults if no answers provided',
function () { function () {
var spy = spyOn(mockGenerator, 'prompt'); var config = {};
pkg.prompt(mockGenerator); var mockAnswers = {};
expect(spy.calls.any()).toBeFalsy(); var generator = mocks.buildGenerator(config, mockAnswers);
// Start with a blank package file.
generator.fs.write('package.json', JSON.stringify({}));
// Set defaults
pkg.init(generator);
pkg.configure(generator);
pkg.prompt(generator);
// Call the generator
expect(pkgBuilder.getValues()).toEqual({
name: null,
description: null,
version: '0.0.1',
homepage: 'http://www.openstack.org/',
author: 'OpenStack <openstack-dev@lists.openstack.org> (http://www.openstack.org/)'
});
});
it('should not show a prompt if non-interactive is set',
function () {
var generator = mocks.buildGenerator(null, null,
{'non-interactive': true});
var promptSpy = spyOn(generator, 'prompt');
generator.fs.write('package.json', JSON.stringify(packageFile));
pkg.init(generator);
pkg.prompt(generator);
expect(promptSpy.calls.any()).toBeFalsy();
});
it('should use defaults in package.json if no answers provided',
function () {
var generator = mocks.buildGenerator();
var mockPackage = {
name: 'name',
description: 'description',
version: '0.0.1',
homepage: 'http://www.openstack.org/',
author: 'OpenStack <openstack-dev@lists.openstack.org> (http://www.openstack.org/)'
};
generator.fs.write('package.json', JSON.stringify(mockPackage));
pkg.init(generator);
pkg.configure(generator);
pkg.prompt(generator);
expect(pkgBuilder.getValues()).toEqual(mockPackage);
});
it('should configure answers if answers provided',
function () {
var config = {};
var mockAnswers = {
name: 'name',
description: 'description',
version: '1.0.0',
homepage: 'http://example.openstack.org/',
author: 'Example Author'
};
var generator = mocks.buildGenerator(config, mockAnswers);
// Start with a blank package file.
generator.fs.write('package.json', JSON.stringify({}));
// Set defaults
pkg.init(generator);
pkg.prompt(generator);
pkg.configure(generator);
expect(pkgBuilder.getValues()).toEqual(mockAnswers);
}); });
}); });