UNPKG

generator-ocaml

Version:

Yeoman generator to scaffold OCaml modules.

203 lines (172 loc) 5.35 kB
'use strict'; var yeoman = require('yeoman-generator'); var greetings = require('./greetings'); var parser = require('iniparser'); var fs = require('fs'); var path = require('path'); var _ = require('lodash'); var s = require('underscore.string'); module.exports = yeoman.Base.extend({ prompting: function () { var done = this.async(); // Have Yeoman greet the user. this.log(greetings); // `homeDir` will be used to find the `.gitconfig` file. var homeDir; // `currentDir` will be used as a default in case of user not inserting. // a project name var currentDir = path.basename(process.cwd()); // `user` will store username and email from GIT information. var user; // Discover homeDir based on the OS homeDir = process.platform === 'win32' ? process.env.USERPROFILE : process.env.HOME || process.env.HOMEPATH; var gitConfigFile = path.join(homeDir, '.gitconfig'); user = fs.existsSync(gitConfigFile) ? parser.parseSync(gitConfigFile).user : { name: 'Matheus Brasil', email: 'matheus.brasil10@gmail.com' }; // Things that should be asked the user. var prompts = [ { name: 'pkgName', message: 'What\'s the package name?', default: currentDir }, { name: 'pkgDescription', message: 'What\'s your package all about?', default: 'An awesome OCaml module.' }, { name: 'pkgVersion', message: 'What\'s the package version?', default: '0.1.0' }, { name: 'authorName', message: 'What\'s your name?', default: user.name || '' }, { name: 'authorEmail', message: 'What\'s your email?', default: user.email || '' }, { name: 'userName', message: 'What\'s your Github username?', default: 'mabrasil' }, { type: 'list', name: 'license', message: 'Choose your license type', choices: ['APACHE', 'BSD', 'GPLv3', 'MIT'], default: 'MIT' }, { type: 'confirm', name: 'confirm', message: 'Continue?', default: false } ]; // Do some work around properties (SlugName, Date etc.) this.prompt(prompts, function (props) { var d = new Date(); this.props = props; this.props.pkgSlugName = s.slugify(this.props.pkgName); this.props.pkgCapitalizedName = s.capitalize(this.props.pkgName); this.props.year = d.getFullYear(); this.props.date = d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate(); if (!this.props.confirm) { return process.exit(0); } done(); }.bind(this)); }, configuring: { enforceFolderName: function () { if (this.props.pkgSlugName !== _.last(this.destinationRoot().split(path.sep))) { this.destinationRoot(this.props.pkgSlugName); } this.config.save(); } }, // Things that should be generated in the boilerplate writing: { // Main project files (OCaml files, testing files, OASIS spec etc.) app: function () { this.fs.copyTpl( this.templatePath('_oasis'), this.destinationPath('_oasis'), this.props ); this.fs.copyTpl( this.templatePath('Makefile'), this.destinationPath('Makefile'), this.props ); this.fs.copyTpl( this.templatePath('lib/_pkgName.ml'), this.destinationPath('lib/' + this.props.pkgSlugName + '.ml'), this.props ); this.fs.copyTpl( this.templatePath('test/_pkgName_test.ml'), this.destinationPath('test/' + this.props.pkgSlugName + '_test.ml'), this.props ); }, // Docs-related files (README, LICENSE, CHANGELOG etc.) docs: function () { this.fs.copyTpl( this.templatePath('_README.md'), this.destinationPath('README.md'), this.props ); this.fs.copyTpl( this.templatePath('_CONTRIBUTING.md'), this.destinationPath('CONTRIBUTING.md'), this.props ); this.fs.copyTpl( this.templatePath('_CHANGELOG.md'), this.destinationPath('CHANGELOG.md'), this.props ); var licenses = ['APACHE', 'BSD', 'GPLv3']; this.fs.copyTpl( this.templatePath( licenses.indexOf(this.props.license) !== -1 ? '_LICENSE_' + this.props.license + '.md' : '_LICENSE_MIT.md' ), this.destinationPath('LICENSE.md'), this.props ); }, // (Git-related files and CI information) general: function () { this.fs.copyTpl( this.templatePath('travis.yml'), this.destinationPath('.travis.yml'), this.props ); this.fs.copyTpl( this.templatePath('gitignore'), this.destinationPath('.gitignore'), this.props ); this.fs.copyTpl( this.templatePath('gitattributes'), this.destinationPath('.gitattributes'), this.props ); } } });