From 83afe3971340e8c47318ef0fe067f83c2c4a7698 Mon Sep 17 00:00:00 2001 From: ta2edchimp Date: Fri, 15 Apr 2016 17:06:32 +0200 Subject: [PATCH 1/3] fix(rules): Sort rule names alphabetically --- src/bin/diff.js | 9 ++++++--- src/lib/rule-finder.js | 9 +++++---- src/lib/sort-rules.js | 9 +++++++++ test/lib/rule-finder.js | 18 +++++++++--------- test/lib/sort-rules.js | 19 +++++++++++++++++++ 5 files changed, 48 insertions(+), 16 deletions(-) create mode 100644 src/lib/sort-rules.js create mode 100644 test/lib/sort-rules.js diff --git a/src/bin/diff.js b/src/bin/diff.js index a083c28..2de6e68 100644 --- a/src/bin/diff.js +++ b/src/bin/diff.js @@ -4,10 +4,13 @@ var getRuleFinder = require('../lib/rule-finder') var difference = require('../lib/array-diff') +var sortRules = require('../lib/sort-rules') -var rules = difference( - getRuleFinder(process.argv[2]).getCurrentRules(), - getRuleFinder(process.argv[3]).getCurrentRules() +var rules = sortRules( + difference( + getRuleFinder(process.argv[2]).getCurrentRules(), + getRuleFinder(process.argv[3]).getCurrentRules() + ) ) /* istanbul ignore next */ diff --git a/src/lib/rule-finder.js b/src/lib/rule-finder.js index 2259c97..fc29e52 100644 --- a/src/lib/rule-finder.js +++ b/src/lib/rule-finder.js @@ -4,6 +4,7 @@ var fs = require('fs') var eslint = require('eslint') var isAbsolute = require('path-is-absolute') var difference = require('./array-diff') +var sortRules = require('./sort-rules') function _getConfigFile(specifiedFile) { if (specifiedFile) { @@ -71,21 +72,21 @@ function RuleFinder(specifiedFile) { // get all the current rules instead of referring the extended files or documentation this.getCurrentRules = function getCurrentRules() { - return currentRules + return sortRules(currentRules) } // get all the plugin rules instead of referring the extended files or documentation this.getPluginRules = function getPluginRules() { - return pluginRules + return sortRules(pluginRules) } // get all the available rules instead of referring eslint and plugin packages or documentation this.getAllAvailableRules = function getAllAvailableRules() { - return allRules + return sortRules(allRules) } this.getUnusedRules = function getUnusedRules() { - return unusedRules + return sortRules(unusedRules) } } diff --git a/src/lib/sort-rules.js b/src/lib/sort-rules.js new file mode 100644 index 0000000..63d268f --- /dev/null +++ b/src/lib/sort-rules.js @@ -0,0 +1,9 @@ +'use strict' + +function sortRules(rules) { + return rules.sort(function sort(a, b) { + return a > b ? 1 : -1 + }) +} + +module.exports = sortRules diff --git a/test/lib/rule-finder.js b/test/lib/rule-finder.js index 1d6f79c..c3caa60 100644 --- a/test/lib/rule-finder.js +++ b/test/lib/rule-finder.js @@ -63,52 +63,52 @@ describe('rule-finder', function() { return noSpecifiedFile } ruleFinder = getRuleFinder() - assert.deepEqual(ruleFinder.getAllAvailableRules(), ['foo-rule', 'bar-rule', 'baz-rule']) + assert.deepEqual(ruleFinder.getAllAvailableRules(), ['bar-rule', 'baz-rule', 'foo-rule']) }) it('specifiedFile (relative path) is passed to the constructor', function() { var ruleFinder = getRuleFinder(specifiedFileRelative) - assert.deepEqual(ruleFinder.getUnusedRules(), ['baz-rule', 'react/foo-rule', 'react/bar-rule', 'react/baz-rule']) + assert.deepEqual(ruleFinder.getUnusedRules(), ['baz-rule', 'react/bar-rule', 'react/baz-rule', 'react/foo-rule']) }) it('specifiedFile (relative path) - curent rules', function() { var ruleFinder = getRuleFinder(specifiedFileRelative) - assert.deepEqual(ruleFinder.getCurrentRules(), ['foo-rule', 'bar-rule']) + assert.deepEqual(ruleFinder.getCurrentRules(), ['bar-rule', 'foo-rule']) }) it('specifiedFile (relative path) - plugin rules', function() { var ruleFinder = getRuleFinder(specifiedFileRelative) - assert.deepEqual(ruleFinder.getPluginRules(), ['react/foo-rule', 'react/bar-rule', 'react/baz-rule']) + assert.deepEqual(ruleFinder.getPluginRules(), ['react/bar-rule', 'react/baz-rule', 'react/foo-rule']) }) it('specifiedFile (relative path) - all available rules', function() { var ruleFinder = getRuleFinder(specifiedFileRelative) assert.deepEqual( ruleFinder.getAllAvailableRules(), - ['foo-rule', 'bar-rule', 'baz-rule', 'react/foo-rule', 'react/bar-rule', 'react/baz-rule'] + ['bar-rule', 'baz-rule', 'foo-rule', 'react/bar-rule', 'react/baz-rule', 'react/foo-rule'] ) }) it('specifiedFile (absolut path) is passed to the constructor', function() { var ruleFinder = getRuleFinder(specifiedFileAbsolute) - assert.deepEqual(ruleFinder.getUnusedRules(), ['baz-rule', 'react/foo-rule', 'react/bar-rule', 'react/baz-rule']) + assert.deepEqual(ruleFinder.getUnusedRules(), ['baz-rule', 'react/bar-rule', 'react/baz-rule', 'react/foo-rule']) }) it('specifiedFile (absolut path) - curent rules', function() { var ruleFinder = getRuleFinder(specifiedFileAbsolute) - assert.deepEqual(ruleFinder.getCurrentRules(), ['foo-rule', 'bar-rule']) + assert.deepEqual(ruleFinder.getCurrentRules(), ['bar-rule', 'foo-rule']) }) it('specifiedFile (absolut path) - plugin rules', function() { var ruleFinder = getRuleFinder(specifiedFileAbsolute) - assert.deepEqual(ruleFinder.getPluginRules(), ['react/foo-rule', 'react/bar-rule', 'react/baz-rule']) + assert.deepEqual(ruleFinder.getPluginRules(), ['react/bar-rule', 'react/baz-rule', 'react/foo-rule']) }) it('specifiedFile (absolut path) - all available rules', function() { var ruleFinder = getRuleFinder(specifiedFileAbsolute) assert.deepEqual( ruleFinder.getAllAvailableRules(), - ['foo-rule', 'bar-rule', 'baz-rule', 'react/foo-rule', 'react/bar-rule', 'react/baz-rule'] + ['bar-rule', 'baz-rule', 'foo-rule', 'react/bar-rule', 'react/baz-rule', 'react/foo-rule'] ) }) }) diff --git a/test/lib/sort-rules.js b/test/lib/sort-rules.js new file mode 100644 index 0000000..b2488fd --- /dev/null +++ b/test/lib/sort-rules.js @@ -0,0 +1,19 @@ +var assert = require('assert') +var sortRules = require('../../src/lib/sort-rules') + +describe('sort-rules', function() { + it('should return sorted rules', function() { + assert.deepEqual( + sortRules(['a', 'b', 'c']), + ['a', 'b', 'c'] + ) + assert.deepEqual( + sortRules(['c', 'b', 'a']), + ['a', 'b', 'c'] + ) + assert.deepEqual( + sortRules(['aa', 'a', 'ab', 'b', 'c']), + ['a', 'aa', 'ab', 'b', 'c'] + ) + }) +}) From e524f189840d1111e1eb2409d82fb0845a2dbbc3 Mon Sep 17 00:00:00 2001 From: ta2edchimp Date: Fri, 15 Apr 2016 12:22:48 +0200 Subject: [PATCH 2/3] feat(bin): Improve output Improve output of rules by rendering them in a tabular structure, like ls on *nixes. Closes #9 --- package.json | 2 ++ src/bin/diff.js | 28 +++++++++++++++++++++++++++- src/bin/find.js | 28 ++++++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 5c16578..6a6ee4f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,9 @@ ], "license": "MIT", "dependencies": { + "cliui": "^3.2.0", "path-is-absolute": "1.0.0", + "window-size": "^0.2.0", "yargs": "^4.4.0" }, "devDependencies": { diff --git a/src/bin/diff.js b/src/bin/diff.js index 2de6e68..9ed4233 100644 --- a/src/bin/diff.js +++ b/src/bin/diff.js @@ -2,6 +2,10 @@ 'use strict' +var size = require('window-size') +var availableWidth = size.width || /* istanbul ignore next */ 80 +var ui = require('cliui')({width: availableWidth}) + var getRuleFinder = require('../lib/rule-finder') var difference = require('../lib/array-diff') var sortRules = require('../lib/sort-rules') @@ -13,8 +17,30 @@ var rules = sortRules( ) ) +var outputRules, outputRuleCellMapper +var outputPadding = ' ' +var outputMaxWidth = 0 +var outputMaxCols = 0 + /* istanbul ignore next */ if (rules.length) { console.log('\n diff rules\n') // eslint-disable-line no-console - console.log(rules.join(', ')) // eslint-disable-line no-console + rules = rules.map(function columnSpecification(rule) { + rule = rule + outputPadding + outputMaxWidth = Math.max(rule.length, outputMaxWidth) + return rule + }) + outputMaxCols = Math.floor(availableWidth / outputMaxWidth) + outputRuleCellMapper = getOutputRuleCellMapper(Math.floor(availableWidth / outputMaxCols)) + while (rules.length) { + outputRules = rules.splice(0, outputMaxCols).map(outputRuleCellMapper) + ui.div.apply(ui, outputRules) + } + console.log(ui.toString()) // eslint-disable-line no-console +} + +function getOutputRuleCellMapper(width) { + return function curriedOutputRuleCellMapper(rule) { + return {text: rule, width: width} + } } diff --git a/src/bin/find.js b/src/bin/find.js index 02faa26..21c0c38 100755 --- a/src/bin/find.js +++ b/src/bin/find.js @@ -15,20 +15,38 @@ var argv = require('yargs') .alias(options) .argv +var size = require('window-size') +var availableWidth = size.width || /* istanbul ignore next */ 80 +var ui = require('cliui')({width: availableWidth}) + var processExitCode = argv.u && !argv.n ? 1 : 0 var getRuleFinder = require('../lib/rule-finder') var specifiedFile = argv._[0] var ruleFinder = getRuleFinder(specifiedFile) Object.keys(options).forEach(function findRules(option) { - var rules + var rules, outputRules, outputRuleCellMapper + var outputPadding = ' ' + var outputMaxWidth = 0 + var outputMaxCols = 0 var ruleFinderMethod = ruleFinder[option] if (argv[option] && ruleFinderMethod) { rules = ruleFinderMethod() /* istanbul ignore next */ if (rules.length) { console.log('\n' + options[option][0], 'rules\n') // eslint-disable-line no-console - console.log(rules.join(', ')) // eslint-disable-line no-console + rules = rules.map(function columnSpecification(rule) { + rule = rule + outputPadding + outputMaxWidth = Math.max(rule.length, outputMaxWidth) + return rule + }) + outputMaxCols = Math.floor(availableWidth / outputMaxWidth) + outputRuleCellMapper = getOutputRuleCellMapper(Math.floor(availableWidth / outputMaxCols)) + while (rules.length) { + outputRules = rules.splice(0, outputMaxCols).map(outputRuleCellMapper) + ui.div.apply(ui, outputRules) + } + console.log(ui.toString()) // eslint-disable-line no-console } else if (option === 'getUnusedRules') { processExitCode = 0 } @@ -38,3 +56,9 @@ Object.keys(options).forEach(function findRules(option) { if (processExitCode) { process.exit(processExitCode) } + +function getOutputRuleCellMapper(width) { + return function curriedOutputRuleCellMapper(rule) { + return {text: rule, width: width} + } +} From 45af18c55297a25ff1c37352510199254b0f79e1 Mon Sep 17 00:00:00 2001 From: ta2edchimp Date: Fri, 15 Apr 2016 17:23:07 +0200 Subject: [PATCH 3/3] refactor(sort-rules): Rename function to be more concise --- src/bin/diff.js | 4 ++-- src/lib/rule-finder.js | 10 +++++----- src/lib/sort-rules.js | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/bin/diff.js b/src/bin/diff.js index 9ed4233..bd2142e 100644 --- a/src/bin/diff.js +++ b/src/bin/diff.js @@ -8,9 +8,9 @@ var ui = require('cliui')({width: availableWidth}) var getRuleFinder = require('../lib/rule-finder') var difference = require('../lib/array-diff') -var sortRules = require('../lib/sort-rules') +var getSortedRules = require('../lib/sort-rules') -var rules = sortRules( +var rules = getSortedRules( difference( getRuleFinder(process.argv[2]).getCurrentRules(), getRuleFinder(process.argv[3]).getCurrentRules() diff --git a/src/lib/rule-finder.js b/src/lib/rule-finder.js index fc29e52..fdb942e 100644 --- a/src/lib/rule-finder.js +++ b/src/lib/rule-finder.js @@ -4,7 +4,7 @@ var fs = require('fs') var eslint = require('eslint') var isAbsolute = require('path-is-absolute') var difference = require('./array-diff') -var sortRules = require('./sort-rules') +var getSortedRules = require('./sort-rules') function _getConfigFile(specifiedFile) { if (specifiedFile) { @@ -72,21 +72,21 @@ function RuleFinder(specifiedFile) { // get all the current rules instead of referring the extended files or documentation this.getCurrentRules = function getCurrentRules() { - return sortRules(currentRules) + return getSortedRules(currentRules) } // get all the plugin rules instead of referring the extended files or documentation this.getPluginRules = function getPluginRules() { - return sortRules(pluginRules) + return getSortedRules(pluginRules) } // get all the available rules instead of referring eslint and plugin packages or documentation this.getAllAvailableRules = function getAllAvailableRules() { - return sortRules(allRules) + return getSortedRules(allRules) } this.getUnusedRules = function getUnusedRules() { - return sortRules(unusedRules) + return getSortedRules(unusedRules) } } diff --git a/src/lib/sort-rules.js b/src/lib/sort-rules.js index 63d268f..510def1 100644 --- a/src/lib/sort-rules.js +++ b/src/lib/sort-rules.js @@ -1,9 +1,9 @@ 'use strict' -function sortRules(rules) { +function getSortedRules(rules) { return rules.sort(function sort(a, b) { return a > b ? 1 : -1 }) } -module.exports = sortRules +module.exports = getSortedRules