Skip to content

Commit

Permalink
refactored code, req should be runnable as a module or from command line
Browse files Browse the repository at this point in the history
  • Loading branch information
bahmutov committed Jan 19, 2013
1 parent a404540 commit 4df0fb4
Show file tree
Hide file tree
Showing 5 changed files with 148 additions and 117 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "req-count",
"version": "0.0.7",
"version": "0.0.8",
"description": "Module requirement counter, outbound and inbound",
"author": "Gleb Bahmutov <gleb.bahmutov@gmail.com>",
"repository": {
Expand Down
135 changes: 44 additions & 91 deletions reqs.js
Original file line number Diff line number Diff line change
@@ -1,105 +1,58 @@
var path = require('path');
var fs = require('fs');

var args = require('./src/arguments').run();
var utils = require('./src/utils');

var req = require('./src/req-count');
req.init(args);

function discoverSourceFiles() {
var glob = require("glob");

var filenames = [];
args.input.forEach(function (shortName) {
var files = glob.sync(shortName);
filenames = filenames.concat(files);
});

filenames = filenames.map(function (shortName) {
return path.resolve(shortName);
});
return filenames;
if (!module.parent) {
(function () {
var args = require('./src/arguments').run();
run(args);
})();
}

var fullModules = discoverSourceFiles();
console.assert(Array.isArray(fullModules), 'could not discover source files');
function run(options) {
options = options || {};
console.assert(options.input, 'expect input array with source files or patterns');
req.init(options);

function filterNonExistingFiles(filenames) {
console.assert(Array.isArray(filenames), 'expected an array of filenames');
var result = filenames.filter(function (filename) {
return fs.existsSync(filename);
});
return result;
}
var fullModules = utils.discoverSourceFiles(options.input);
console.assert(Array.isArray(fullModules), 'could not discover source files');

function reportDependencies(fullModules) {
console.assert(Array.isArray(fullModules), 'expected an array of filenames');
fullModules = filterNonExistingFiles(fullModules);
// console.log(fullModules);
// process.exit(0);
function reportDependencies(fullModules) {
console.assert(Array.isArray(fullModules), 'expected an array of filenames');
fullModules = utils.filterNonExistingFiles(fullModules);

var reqs = req.outbound(fullModules);
console.assert(reqs, 'could not get outbound reqs');
// console.log(JSON.stringify(reqs, null, 2));
var reqs = req.outbound(fullModules);
console.assert(reqs, 'could not get outbound reqs');

var counter = require('./src/count');
// var moduleCounts = counter.reqCount(reqs);
var moduleMetrics = counter.reqMetrics(reqs);
console.assert(moduleMetrics, 'could not get module metrics');

var str = JSON.stringify(moduleMetrics, null, 2);
if (args.json) {
fs.writeFileSync(args.json, str, 'utf8');
console.log('saved json report to', args.json);
}
// console.log(str);
var counter = require('./src/count');
var moduleMetrics = counter.reqMetrics(reqs);
console.assert(moduleMetrics, 'could not get module metrics');

if (options.json) {
writeReqJsonReport(moduleMetrics, options.json);
}

// write detailed report table to a file/console
var metrics = [];
Object.keys(moduleMetrics).forEach(function (item) {
var reqs = moduleMetrics[item];
metrics.push([
reqs.path,
reqs.connections.length,
reqs.distance
]);
});
utils.writeDetailedReport(moduleMetrics, options);
utils.displaySummary(moduleMetrics);
}

var reporter = require('./src/reporter');
reporter.writeReportTables({
titles: ['filename', 'depends', 'score'],
metrics: metrics,
filename: args.output,
colors: args.colors
});
reportDependencies(fullModules);

function watchAndRecomputeOnChange(fullModules, options) {
if (options.watch && fullModules.length) {
console.log('watching', fullModules.length, 'files...');
var watch = require('nodewatch');
fullModules.forEach(function (filename) {
watch.add(filename);
});
watch.onChange(function (file, prev, curr, action){
console.log('file', file, 'changed', action);
fullModules = discoverSourceFiles(options.input);
reportDependencies(fullModules);
});
}
}

// compute and display summary
var totalFiles = 0;
var totalDeps = 0;
var totalScore = 0;
Object.keys(moduleMetrics).forEach(function (item) {
var reqs = moduleMetrics[item];
totalFiles += 1;
totalDeps += reqs.connections.length;
totalScore += reqs.distance;
});
var averageDeps = (totalFiles > 0 ? totalDeps / totalFiles : 0);
console.log(totalFiles + ' files');
console.log(averageDeps + ' dependencies per file on average');
console.log(totalScore + ' total score');
watchAndRecomputeOnChange(fullModules, options);
}

reportDependencies(fullModules);
if (args.watch && fullModules.length) {
console.log('watching these files...');
var watch = require('nodewatch');
fullModules.forEach(function (filename) {
watch.add(filename);
});
watch.onChange(function (file, prev, curr, action){
console.log('file', file, 'changed', action);
fullModules = discoverSourceFiles();
reportDependencies(fullModules);
});
}
module.exports.run = run;
44 changes: 21 additions & 23 deletions src/arguments.js
Original file line number Diff line number Diff line change
@@ -1,33 +1,31 @@
var optimist = require("optimist");

function getArguments() {
var optimist = require("optimist");
var args = optimist.usage("Find first level dependencies from js file.\nUsage: $0")
.default({
amd: false,
help: 0,
output: '',
input: [],
color: true,
sort: 2,
watch: false,
json: ''
}).alias('h', 'help').alias('o', 'output').alias('i', 'input')
.alias('j', 'json').string('json').describe('output json report filename')
.boolean('amd')
.string('output')
.boolean('color')
.boolean('watch')
.describe('amd', 'look for AMD style define calls')
.describe('output', 'output json filename')
.describe('input', 'list of input files / patterns')
.describe('color', 'use terminal colors in the output')
.describe('sort', 'sort results by column, use ! to reverse the order')
.describe('watch', 'keep watching the files, report stas on any change')
.argv;
.default({
amd: false,
help: 0,
output: '',
input: [],
colors: true,
sort: 1,
watch: false,
json: ''
}).alias('h', 'help').alias('o', 'output').alias('i', 'input')
.alias('j', 'json').string('json').describe('output json report filename')
.boolean('amd').describe('amd', 'look for AMD style define calls')
.string('output').describe('output', 'output json filename')
.boolean('colors').describe('colors', 'use terminal colors in the output')
.boolean('watch').describe('watch', 'keep watching the files, report stas on any change')
.describe('input', 'list of input files / patterns')
.describe('sort', 'sort results by column, use ! to reverse the order')
.argv;
return args;
};

function formArguments() {
var args = getArguments();
console.assert(args, 'could not get command line arguments');

if (!module.parent) {
if (args.h || args.help) {
Expand Down
4 changes: 2 additions & 2 deletions src/reporter.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ function writeReportTables(options) {
}

(function () {
var sortingColumn = args.sort;
if (sortingColumn) {
var sortingColumn = options.sort;
if (typeof sortingColumn === 'number') {
var reverseSort = false;
var comparison = function(a, b) {
var first = a[sortingColumn];
Expand Down
80 changes: 80 additions & 0 deletions src/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
var glob = require('glob');
var path = require('path');
var fs = require('fs');
var reporter = require('./reporter');

function discoverSourceFiles(filePatterns) {
console.assert(Array.isArray(filePatterns), 'expect list of names or patterns');

var filenames = [];
filePatterns.forEach(function (shortName) {
var files = glob.sync(shortName);
filenames = filenames.concat(files);
});

filenames = filenames.map(function (shortName) {
return path.resolve(shortName);
});
return filenames;
}

function filterNonExistingFiles(filenames) {
console.assert(Array.isArray(filenames), 'expected an array of filenames');
var result = filenames.filter(function (filename) {
return fs.existsSync(filename);
});
return result;
}

function writeReqJsonReport(moduleMetrics, filename) {
console.assert(moduleMetrics, 'expected module metrics');
console.assert(filename, 'expected output filename');

var str = JSON.stringify(moduleMetrics, null, 2);
fs.writeFileSync(filename, str, 'utf8');
console.log('saved json report to', filename);
}

function writeDetailedReport(moduleMetrics, options) {
var metrics = [];
Object.keys(moduleMetrics).forEach(function (item) {
var reqs = moduleMetrics[item];
metrics.push([
reqs.path,
reqs.connections.length,
reqs.distance
]);
});

reporter.writeReportTables({
titles: ['filename', 'depends', 'score'],
metrics: metrics,
filename: options.output,
colors: options.colors,
sort: options.sort
});
}

function displaySummary(moduleMetrics) {
var totalFiles = 0;
var totalDeps = 0;
var totalScore = 0;
Object.keys(moduleMetrics).forEach(function (item) {
var reqs = moduleMetrics[item];
totalFiles += 1;
totalDeps += reqs.connections.length;
totalScore += reqs.distance;
});
var averageDeps = (totalFiles > 0 ? totalDeps / totalFiles : 0);
console.log(totalFiles + ' file(s)');
console.log(averageDeps.toFixed(1) + ' dependencies per file on average');
console.log(totalScore + ' total score');
}

module.exports = {
discoverSourceFiles: discoverSourceFiles,
filterNonExistingFiles: filterNonExistingFiles,
writeReqJsonReport: writeReqJsonReport,
writeDetailedReport: writeDetailedReport,
displaySummary: displaySummary
};

0 comments on commit 4df0fb4

Please sign in to comment.