functional-docs
Advanced tools
Comparing version 0.0.2 to 0.0.3
96
index.js
@@ -11,2 +11,3 @@ var fs = require('fs'), | ||
jsdom = require('jsdom'), | ||
wrench = require('wrench'), | ||
colors = require('colors'); | ||
@@ -16,2 +17,4 @@ | ||
var readFiles = {}; | ||
exports.runTests = function(srcDir, options, callback) { | ||
@@ -21,3 +24,4 @@ var stopOnFail = options.stopOnFail || false; | ||
console.log("Running tests..."); | ||
console.log("Running tests on " + srcDir); | ||
loadFiles(srcDir, function(err, srcFiles) { | ||
@@ -29,10 +33,15 @@ if (err) { | ||
async.forEach(srcFiles, function(file, forEachCB) { | ||
async.forEach(srcFiles, function(file, forEachCB) { // slower, but using batches to prevent EMFILE, Too many open files | ||
fs.readFile(file, 'utf8', function(err, content) { | ||
if (err) { | ||
console.error(err); | ||
process.exit(1); | ||
if (!fs.lstatSync(file).isDirectory()) { | ||
console.error("Error starting to read file " + file); | ||
console.error(err); | ||
process.exit(1); | ||
} | ||
} | ||
var doc = jsdom.jsdom(content); | ||
readFiles[file] = doc; | ||
async.parallel([ | ||
@@ -55,3 +64,3 @@ function(cb) { | ||
function(cb) { | ||
postTest.checkBrokenLocalLink(file, doc, function(errors) { | ||
postTest.checkBrokenLocalLink(file, doc, readFiles, function(errors) { | ||
checkForErrors(errors, stopOnFail, cb); | ||
@@ -65,3 +74,3 @@ }); | ||
}, function (err, results) { | ||
console.log("Finished running tests!"); | ||
console.log("Finished running tests on " + srcDir); | ||
callback(err); | ||
@@ -74,6 +83,6 @@ }) | ||
for (var e in errors) { | ||
console.error(errors[e].red); | ||
console.error(errors[e].magenta); | ||
} | ||
if (breakOnFail) { | ||
console.error("Halting due to failures".red); | ||
console.error("Halting due to failures".magenta); | ||
process.exit(1); | ||
@@ -84,68 +93,7 @@ } | ||
function loadFiles(dir, callback) { | ||
async.map(dir, checkDir, function(err, results) { | ||
// unfortunate necessity; .on('directory') below returns an array, there's no way | ||
// that I can tell to actually replace an element with many more elements | ||
var subArray = []; | ||
for (var i = 0; i < results.length; i++) { | ||
if (Array.isArray(results[i])) { | ||
var dirArray = results[i]; | ||
dirArray.forEach(function (f) { | ||
subArray.push(f); | ||
}); | ||
results.splice(i, 1); | ||
i--; | ||
} | ||
} | ||
results = results.concat(subArray); | ||
callback(err, eliminateDuplicates(results)); | ||
}); | ||
} | ||
function checkDir(item, callback) { | ||
var results = [], item = path.resolve(process.cwd(), item); | ||
fs.stat(item, function(err, stats) { | ||
if (stats === undefined) { | ||
console.error("stats is undefined for " + item); | ||
} | ||
if (stats.isDirectory()) { | ||
var finder = findit.find(item); | ||
finder.on('file', function (file, stat) { | ||
if (path.extname(file) == ext) { | ||
results.push(file); | ||
} | ||
}); | ||
finder.on('directory', function (dir, stat) { | ||
//console.log("Digging into " + dir); | ||
}); | ||
finder.on('end', function () { | ||
callback(err, results); | ||
}); | ||
} | ||
else if (path.extname(item) == ext) { | ||
callback(err, item); | ||
} | ||
}); | ||
} | ||
function eliminateDuplicates(arr) { | ||
var i, | ||
len=arr.length, | ||
out=[], | ||
obj={}; | ||
for (i=0;i<len;i++) { | ||
obj[arr[i]]=0; | ||
} | ||
for (i in obj) { | ||
if (i !== undefined && i !== '') { | ||
out.push(i); | ||
} | ||
} | ||
return out; | ||
function loadFiles(dirs, callback) { | ||
async.forEach(dirs, function(dir, cb) { | ||
var listOfFiles = wrench.readdirSyncRecursive(dir); | ||
callback(null, listOfFiles); | ||
}); | ||
} |
{ | ||
"name": "functional-docs", | ||
"version": "0.0.2", | ||
"version": "0.0.3", | ||
"author": "Garen Torikian", | ||
@@ -20,3 +20,3 @@ "keywords": ["documentation", "docs", "testing", "html"], | ||
"wrench": "~1.3.7", | ||
"jsdom": "~0.2.13", | ||
"jsdom": "~0.2.14", | ||
"findit": "~0.1.2", | ||
@@ -23,0 +23,0 @@ "colors": "~0.6.0" |
var util = require("util"); | ||
var fs = require('fs'); | ||
var path = require('path'); | ||
var wrench = require('wrench'); | ||
var jsdom = require('jsdom'); | ||
var async = require('async'); | ||
@@ -20,3 +21,3 @@ exports.checkMissingImage = function(filename, doc, callback) { | ||
try { | ||
fs.statSync(path.resolve(path.dirname(filename), src)); | ||
fs.lstatSync(path.resolve(path.dirname(filename), src)); | ||
} catch (err) { | ||
@@ -32,3 +33,3 @@ errors.push(printMessage("Image " + src + " file does not exist", filename));//, l, lines[l])); | ||
exports.checkBrokenLocalLink = function(filename, doc, callback) { | ||
exports.checkBrokenLocalLink = function(filename, doc, readFiles, callback) { | ||
var errors = []; | ||
@@ -58,16 +59,19 @@ var aList = doc.getElementsByTagName("a"); | ||
// then, validate the hash ref | ||
var content = fs.readFileSync(filepath, 'utf8'); | ||
/*if (err) { | ||
console.error("Error: " + err); | ||
process.exit(1); | ||
}*/ | ||
var hashDoc = jsdom.jsdom(content); | ||
if (hashDoc.getElementById(hashId) === null) { | ||
errors.push(printMessage(hashFile + " has an incorrect external hash to '#" + hashId +"'", filename)); | ||
} | ||
else { | ||
//console.log("Yes, " + hashFile + "#" + hashId + " is okay."); | ||
} | ||
//}); | ||
// prevent too many files from being read--just see if the content exists already | ||
var hashDoc = readFiles[filepath]; | ||
if (hashDoc == undefined) { | ||
var content = fs.readFileSync(filepath, 'utf8'); | ||
hashDoc = jsdom.jsdom(content); | ||
readFiles[filepath] = hashDoc; | ||
} | ||
// do the actual check (finally!) | ||
if (hashDoc.getElementById(hashId) === null) { | ||
errors.push(printMessage(hashFile + " has an incorrect external hash to '#" + hashId +"'", filename)); | ||
} | ||
else { | ||
//console.log("Yes, " + hashFile + "#" + hashId + " is okay."); | ||
} | ||
} | ||
@@ -104,18 +108,20 @@ } | ||
if (refDirName.length == 0 || lastSlashPos < 0) { | ||
refDirName = "./"; | ||
refDirName = path.dirname(filepath); | ||
} | ||
var refFiles = wrench.readdirSyncRecursive(refDirName); | ||
try { | ||
fs.lstatSync(refDirName); | ||
} | ||
catch (e) { | ||
errors.push(printMessage(file + " is trying to link to " + refDirName + ", which isn't a directory", file)); | ||
return false; | ||
} | ||
for (var r in refFiles) | ||
{ | ||
if (refFiles[r].indexOf(refFileName) >=0) { | ||
found = true; | ||
} | ||
} | ||
if (found == false && href.length > 0) { | ||
try { | ||
fs.lstatSync(refDirName + "/" + refFileName); | ||
} | ||
catch (e) { | ||
errors.push(printMessage(file + " is trying to incorrectly link to " + href + " as " + filepath, file)); | ||
return false; | ||
} | ||
} | ||
@@ -122,0 +128,0 @@ return true; |
24072
233
Updatedjsdom@~0.2.14