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 () {
'use strict';
var Q = require('q');
var pkgBuilder = require('../pkg_builder');
var projectBuilder = require('../project_builder');
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.
* @returns {generator} The passed generator, for promise chaining.
*/
function noop (generator) {
return generator;
function promptPackage (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 = {
init: initializePackage,
prompt: noop,
prompt: promptPackage,
configure: configurePkg
};
})();

View File

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

View File

@@ -8,11 +8,18 @@
var mocks = require('../../../helpers/mocks');
var mockGenerator;
var packageFile = {};
describe('generator-openstack:lib/component/pkg', function () {
beforeEach(function () {
mockGenerator = mocks.buildGenerator();
projectBuilder.clear();
jasmine.clock().install();
});
afterEach(function () {
jasmine.clock().uninstall();
});
it('should define init, prompt, and configure',
@@ -40,17 +47,95 @@
});
describe('prompt()', function () {
it('should return a generator',
it('should return a promise that resolves with a generator',
function () {
var outputGenerator = pkg.prompt(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
var generator = mocks.buildGenerator();
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 () {
var spy = spyOn(mockGenerator, 'prompt');
pkg.prompt(mockGenerator);
expect(spy.calls.any()).toBeFalsy();
var config = {};
var mockAnswers = {};
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);
});
});