diff --git a/CHANGELOG.md b/CHANGELOG.md index 75e6e14..eb2ad6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +0.6.0 / 2017-01-22 + * Yeoman options support + * More friendly command line usage + 0.5.0 / 2017-01-22 * Updated dependencies (spring boot to 1.4.3) * Added gradle plugin com.github.ben-manes.versions for checking depedencies version diff --git a/README.md b/README.md index fab4dee..72b85bd 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ - [x] More tests for generator code (coverage) - [x] Migrate to yeoman-generator 1.x.x - [x] Switch to es6 -- [ ] Yeoman arguments support +- [x] Yeoman options support - [ ] Kotlin support (poc) - [ ] Added (base) swagger support (by io.springfox) - [ ] Swagger documentation support for generated code (@ApiModel, @ApiOperation) @@ -26,15 +26,46 @@ First, install [Yeoman](http://yeoman.io) and generator-spring-boot-application-from-swagger using [npm](https://www.npmjs.com/) (we assume you have pre-installed [node.js](https://nodejs.org/)). +Using yarn (recommended): + +```bash +$ yarn global add yo +$ yarn global add generator-spring-boot-application-from-swagger +``` + +Using npm: + ```bash -npm install -g yo -npm install -g generator-spring-boot-application-from-swagger +$ npm install -g yo +$ npm install -g generator-spring-boot-application-from-swagger ``` -Then generate your new project: +## Usage ```bash -yo spring-boot-application-from-swagger +$ yo spring-boot-application-from-swagger --help + +Usage: + yo spring-boot-application-from-swagger:app [options] + +Options: + -h, --help # Print the generator's options and usage + --skip-cache # Do not remember prompt answers Default: false + --skip-install # Do not automatically install dependencies Default: false + --use-cli-defaults # Use default values if not provided (will not prompt) + --run-gradle-build # Run build gradle on generated project + --base-package-name # Enter default base package name: Default: com.mobulum + --base-name # Enter base name of app: Default: app + --controller-class-suffix # Enter controller class suffix: Default: Controller + --api-path # Path (or URL) to swagger document: Default: https://raw.githubusercontent.com/mobulum/example-spring-boot-application-from-swagger/master/pet-store-swagger.json +``` + +## Generate your (new) project + +### In default (questions) mode + +```bash +$ yo spring-boot-application-from-swagger ? Enter default base package name: com.mobulum ? Enter base name of app: app @@ -42,6 +73,17 @@ yo spring-boot-application-from-swagger ? Path (or URL) to swagger document: https://raw.githubusercontent.com/mobulum/example-spring-boot-application-from-swagger/master/pet-store-swagger.json ``` +### Passing values to command line + +```bash +$ yo spring-boot-application-from-swagger \ + --base-package-name=com.example \ + --base-name=apps \ + --controller-class-suffix=Ctrl \ + --api-path=https://raw.githubusercontent.com/mobulum/example-spring-boot-application-from-swagger/master/pet-store-swagger.json +``` + + ## [Example](https://github.com/mobulum/example-spring-boot-application-from-swagger) of generated file structure based on defaults ``` @@ -133,7 +175,7 @@ yo spring-boot-application-from-swagger ## License -MIT © [Zenedith](http://mobulum.com) +MIT © [mobulum.com](http://mobulum.com) [npm-image]: https://badge.fury.io/js/generator-spring-boot-application-from-swagger.svg diff --git a/generators/app/index.js b/generators/app/index.js index 992997c..3248f63 100644 --- a/generators/app/index.js +++ b/generators/app/index.js @@ -2,8 +2,39 @@ const Generator = require('yeoman-generator'); const app = require('../../lib/generators/app'); +const optionOrPrompt = require('../../lib/utils').yeomanOptionOrPrompt; module.exports = class extends Generator { + constructor(args, opts) { + super(args, opts); + + // This method adds support for a `--use-cli-defaults` flag + this.option('useDefaults', { + name: 'use-cli-defaults', + description: 'Use default values if not provided (will not prompt)', + hide: false + }); + + // This method adds support for a `--run-gradle-build` flag + this.option('runGradleBuild', { + name: 'run-gradle-build', + description: 'Run build gradle on generated project', + hide: false + }); + + app.prompts.forEach(prompt => + this.option(prompt.name, { + name: prompt.cliName, + description: prompt.message, + type: String, + default: (this.options.useCliDefaults || this.options.help) ? prompt.default : undefined, + hide: false + }) + ); + + this._optionOrPrompt = optionOrPrompt; + } + initializing() { this.props = {}; } @@ -15,7 +46,7 @@ module.exports = class extends Generator { prompting() { const self = this; const done = self.async(); - return this.prompt(app.prompts).then(function responses(props) { + return this._optionOrPrompt(app.prompts).then(function responses(props) { app.onResponses(self, props, done); }); } @@ -29,7 +60,11 @@ module.exports = class extends Generator { } end() { - // this.spawnCommand('./gradlew', ['build']); + if (this.options.runGradleBuild) { + this.spawnCommand('./gradlew', ['build']); + } else { + this.log('Skipping run gradle build (no --runGradleBuild flag set)'); + } } }; diff --git a/lib/generators/app.js b/lib/generators/app.js index 2015e75..ac98b6b 100644 --- a/lib/generators/app.js +++ b/lib/generators/app.js @@ -48,31 +48,40 @@ module.exports = { { type: 'string', name: 'basePackageName', + cliName: 'base-package-name', message: 'Enter default base package name:', default: 'com.mobulum', - validate: validate + validate: validate, + store: true }, { type: 'string', name: 'baseName', + cliName: 'base-name', message: 'Enter base name of app:', default: 'app', - validate: validate + validate: validate, + store: true }, { type: 'string', name: 'controllerClassSuffix', + cliName: 'controller-class-suffix', message: 'Enter controller class suffix:', default: 'Controller', - validate: validate + validate: validate, + store: true }, { + type: 'string', name: 'apiPath', + cliName: 'api-path', message: 'Path (or URL) to swagger document:', required: true, default: 'https://raw.githubusercontent.com/mobulum/example-spring-boot-application-from-swagger/master/pet-store-swagger.json', // default: '/Users/zenedith/git/yeoman/generator-spring-boot-application-from-swagger/example/pet-store-swagger.json', - validate: validate + validate: validate, + store: true }], onResponses: function prompt(generator, props, done) { @@ -174,10 +183,10 @@ module.exports = { generator.fs.copy(generator.templatePath('api/build.gradle'), 'api/build.gradle'); - generator.config.set('basePackageName', generator.props.basePackageName); - generator.config.set('packageFolder', generator.props.packageFolder); - generator.config.set('restPackage', generator.props.restPackage); - generator.config.set('controllersPackage', generator.props.controllersPackage); + // generator.config.set('basePackageName', generator.props.basePackageName); + // generator.config.set('packageFolder', generator.props.packageFolder); + // generator.config.set('restPackage', generator.props.restPackage); + // generator.config.set('controllersPackage', generator.props.controllersPackage); }, routing: function routing(generator) { diff --git a/lib/utils.js b/lib/utils.js index 91db5b3..c0e83e7 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,5 +1,7 @@ 'use strict'; +const Promise = require('pinkie-promise'); + const capitalize = function capitalize(string) { return string.charAt(0).toUpperCase() + string.slice(1); }; @@ -8,7 +10,39 @@ const methodName = function methodName(method) { return method.toLowerCase(); }; +// https://www.npmjs.com/package/yeoman-option-or-prompt +const yeomanOptionOrPrompt = function yeomanOptionOrPrompt(prompts) { + // This method will only show prompts that haven't been supplied as options. This makes the generator more composable. + const filteredPrompts = []; + const props = new Map(); + + prompts.forEach(function prompts(prompt) { + this.option(prompt.name); + const option = this.options[prompt.name]; + + if (option === undefined) { + // No option supplied, user will be prompted + filteredPrompts.push(prompt); + } else { + // Options supplied, add to props + props[prompt.name] = option; + } + }, this); + + if (filteredPrompts.length) { + return this.prompt(filteredPrompts).then(function responses(mergeProps) { + // Merge mergeProps into props/ + Object.assign(props, mergeProps); + return props; + }); + } + + // No prompting required call the callback right away. + return Promise.resolve(props); +}; + module.exports = { capitalize: capitalize, - methodName: methodName + methodName: methodName, + yeomanOptionOrPrompt: yeomanOptionOrPrompt }; diff --git a/package.json b/package.json index 10e9c1a..7746ee6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "generator-spring-boot-application-from-swagger", - "version": "0.5.0", + "version": "0.6.0", "description": "Yeoman spring boot mvc application generator from swagger api specification", "homepage": "https://github.com/mobulum/npm-yo-generator-spring-boot-application-from-swagger", "author": { @@ -24,6 +24,7 @@ "chalk": "1.1.3", "js-yaml": "3.7.0", "mkdirp": "0.5.1", + "pinkie-promise": "2.0.1", "swagger-parser": "3.4.1", "yeoman-generator": "1.0.1", "yosay": "1.2.1" diff --git a/yarn.lock b/yarn.lock index f45edb3..768331b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2063,6 +2063,10 @@ lodash@3.6.*, lodash@^3.2.0, lodash@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.6.0.tgz#5266a8f49dd989be4f9f681b6f2a0c55285d0d9a" +lodash@^3.9.3: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.3.0, lodash@^4.6.1: version "4.17.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" @@ -3438,6 +3442,12 @@ yeoman-generator@^0.24.1: yeoman-test "^1.0.0" yeoman-welcome "^1.0.0" +yeoman-option-or-prompt@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/yeoman-option-or-prompt/-/yeoman-option-or-prompt-1.0.2.tgz#6f37c85c5f90ef0117a6df594615b8c29006775b" + dependencies: + lodash "^3.9.3" + yeoman-test@1.6.0, yeoman-test@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/yeoman-test/-/yeoman-test-1.6.0.tgz#abff291733e16e8923d9eefc8691c632888bf948"