From 8f01e2447d9260a5faef646a0f2ebbf48fc0b4a0 Mon Sep 17 00:00:00 2001 From: Michael Krotscheck Date: Mon, 16 May 2016 08:51:00 -0700 Subject: [PATCH] Added project detail prompts. These prompts include things like project name, description, authors, and homepage, all set with sane defaults. Change-Id: Ia0f16b517c64953af77dd82829361ab5305f95d8 --- generators/app/lib/component/pkg.js | 49 ++++++++++++-- spec/app/index.js | 3 + spec/app/lib/component/pkg.js | 99 +++++++++++++++++++++++++++-- 3 files changed, 140 insertions(+), 11 deletions(-) diff --git a/generators/app/lib/component/pkg.js b/generators/app/lib/component/pkg.js index 54cf396..3a8c914 100644 --- a/generators/app/lib/component/pkg.js +++ b/generators/app/lib/component/pkg.js @@ -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 (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 }; })(); diff --git a/spec/app/index.js b/spec/app/index.js index 0dc100e..e0173c5 100644 --- a/spec/app/index.js +++ b/spec/app/index.js @@ -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(); diff --git a/spec/app/lib/component/pkg.js b/spec/app/lib/component/pkg.js index f2322e9..55aa745 100644 --- a/spec/app/lib/component/pkg.js +++ b/spec/app/lib/component/pkg.js @@ -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 (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 (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); }); });