Skip to content

Commit

Permalink
Yeoman options support
Browse files Browse the repository at this point in the history
 More friendly command line usage
  • Loading branch information
Zenedith committed Jan 22, 2017
1 parent e2c3a1b commit 3a66557
Show file tree
Hide file tree
Showing 7 changed files with 153 additions and 18 deletions.
4 changes: 4 additions & 0 deletions 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
Expand Down
54 changes: 48 additions & 6 deletions README.md
Expand Up @@ -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)
Expand All @@ -26,22 +26,64 @@

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
? Enter controller class suffix: Controller
? 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

```
Expand Down Expand Up @@ -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
Expand Down
39 changes: 37 additions & 2 deletions generators/app/index.js
Expand Up @@ -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 = {};
}
Expand All @@ -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);
});
}
Expand All @@ -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)');
}
}

};
25 changes: 17 additions & 8 deletions lib/generators/app.js
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down
36 changes: 35 additions & 1 deletion 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);
};
Expand All @@ -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
};
3 changes: 2 additions & 1 deletion 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": {
Expand All @@ -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"
Expand Down
10 changes: 10 additions & 0 deletions yarn.lock
Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down

0 comments on commit 3a66557

Please sign in to comment.