[grunt/precommit] added check for snake_case filenames

This commit is contained in:
spalger 2015-11-23 14:07:10 -06:00
parent 65d68a8734
commit ecb773b120
6 changed files with 71 additions and 40 deletions

View file

@ -49,7 +49,7 @@
"test:coverage": "grunt test:coverage",
"build": "grunt build",
"start": "./bin/kibana --dev",
"precommit": "grunt lintStagedFiles",
"precommit": "grunt precommit",
"karma": "karma start",
"elasticsearch": "grunt esvm:dev:keepalive",
"lint": "grunt eslint:source",

View file

@ -0,0 +1,14 @@
export default function (grunt) {
grunt.registerTask('checkStagedFilenames', function () {
grunt.task.requires('collectStagedFiles');
const invalid = grunt.config
.get('stagedFiles')
.filter(name => name.match(/[A-Z ]/))
.reduce((all, name) => `${all} ${name}\n`, '');
if (invalid) {
grunt.log.error(`Filenames must use snake_case.\n${invalid}`);
}
});
}

View file

@ -0,0 +1,28 @@
import { resolve } from 'path';
import SimpleGit from 'simple-git';
import { promisify } from 'bluebird';
const root = resolve(__dirname, '..');
const simpleGit = new SimpleGit(root);
const diff = promisify(simpleGit.diff, simpleGit);
export default function (grunt) {
grunt.registerTask('collectStagedFiles', function () {
diff(['--name-status', '--cached'])
.then(output => {
const files = output
.split('\n')
.map(line => line.trim().split('\t'))
.map(parts => {
const status = parts.shift();
if (status === 'D' || status === 'U') return;
return parts.join('\t').trim();
})
.filter(Boolean);
grunt.log.ok(files.length + ' staged files');
grunt.config.set('stagedFiles', files);
})
.nodeify(this.async());
});
};

View file

@ -1,39 +0,0 @@
var _ = require('lodash');
var resolve = require('path').resolve;
var root = resolve(__dirname, '..');
var simpleGit = require('simple-git')(root);
var diff = require('bluebird').promisify(simpleGit.diff, simpleGit);
module.exports = function (grunt) {
grunt.registerTask(
'lintStagedFiles',
'Run staged files through JSHint/JSCS',
function () {
diff(['--name-only', '--cached'])
.then(function (files) {
// match these patterns
var patterns = grunt.config.get('eslint.source.files.src');
if (!patterns) grunt.fail.warn('eslint file pattern is not defined');
files = files.split('\n').filter(Boolean)
.map(function (file) {
return resolve(root, file);
})
.filter(function (file) {
return grunt.file.isMatch(patterns, file);
});
grunt.log.ok('Staged files to lint: ' + files.length);
if (!_.size(files)) return;
grunt.config.set('eslint.staged.files.src', files);
grunt.task.run(['eslint:staged']);
})
.nodeify(this.async());
}
);
};

View file

@ -0,0 +1,21 @@
import { resolve } from 'path';
const root = resolve(__dirname, '..');
export default function (grunt) {
grunt.registerTask('lintStagedFiles', function () {
grunt.task.requires('collectStagedFiles');
// match these patterns
var patterns = grunt.config.get('eslint.source.files.src');
if (!patterns) grunt.fail.warn('eslint file pattern is not defined');
const files = grunt.config
.get('stagedFiles')
.map(file => resolve(root, file))
.filter(file => grunt.file.isMatch(patterns, file));
grunt.config.set('eslint.staged.files.src', files);
grunt.task.run(['eslint:staged']);
});
}

7
tasks/precommit.js Normal file
View file

@ -0,0 +1,7 @@
export default function (grunt) {
grunt.registerTask('precommit', [
'collectStagedFiles',
'checkStagedFilenames',
'lintStagedFiles'
]);
};