readdir
Advanced tools
Comparing version 0.0.6 to 0.0.8
@@ -7,2 +7,3 @@ | ||
var fs = require('fs'); | ||
var Q = require('q'); | ||
@@ -81,3 +82,3 @@ /** | ||
*/ | ||
function read_dir(dir, appendTo, prefixLength, options) { | ||
function read_dir_sync(dir, appendTo, prefixLength, options) { | ||
var contents = fs.readdirSync(dir), | ||
@@ -90,12 +91,10 @@ result = appendTo || []; | ||
if(should_read_directory(dir, itm, options)) { | ||
read_dir(newPath + '/', result, prefixLength, options); | ||
if(exports.INCLUDE_DIRECTORIES & options) { | ||
result.push(newPath.substring(prefixLength) + '/'); | ||
} | ||
read_dir_sync(newPath + '/', result, prefixLength, options); | ||
} | ||
if(exports.INCLUDE_DIRECTORIES & options) { | ||
result.push(newPath.substring(prefixLength) + '/'); | ||
} | ||
} | ||
else { | ||
if(result.indexOf(newPath) < 0) { | ||
result.push(newPath.substring(prefixLength)); | ||
} | ||
result.push(newPath.substring(prefixLength)); | ||
} | ||
@@ -107,2 +106,41 @@ }); | ||
function read_dir(dir, appendTo, prefixLength, options) { | ||
var deferred = Q.defer(); | ||
fs.readdir(dir, function (err, contents) { | ||
if (err) deferred.reject(err); | ||
else if (!contents.length) { | ||
deferred.resolve(); | ||
} | ||
else { | ||
Q.all(contents.map(function (itm) { | ||
var deferred = Q.defer(); | ||
var newPath = dir.replace(/\/$/, '') + '/' + itm; | ||
fs.stat(newPath, function (err, stat) { | ||
var isDirectory = stat && stat.isDirectory(); | ||
if (err) deferred.reject(err); | ||
else if (isDirectory) { | ||
appendTo.push(newPath.substring(prefixLength) + '/'); | ||
if (should_read_directory(dir, itm, options)) { | ||
read_dir(newPath, appendTo, prefixLength, options).then(deferred.resolve, deferred.reject); | ||
} | ||
else { | ||
deferred.resolve(); | ||
} | ||
} | ||
else { | ||
deferred.resolve(appendTo.push(newPath.substring(prefixLength) + (isDirectory ? '/' : ''))); | ||
} | ||
}); | ||
return deferred.promise; | ||
})).then(deferred.resolve, deferred.reject); | ||
} | ||
}); | ||
return deferred.promise; | ||
} | ||
/** | ||
@@ -145,12 +183,3 @@ * Changes the values in the supplied paths array to be absolute URIs | ||
/** | ||
* | ||
* @param {String} basePath | ||
* @param {String[]} [includeFilters] | ||
* @param {Number} [options] | ||
*/ | ||
exports.readSync = function(basePath, includeFilters, options) { | ||
var rootDir = basePath.replace(/\/$/, '') + '/', | ||
allFiles = read_dir(rootDir, [], rootDir.length, options); | ||
function apply_filters(basePath, allFiles, includeFilters, options) { | ||
if(Array.isArray(includeFilters)) { | ||
@@ -173,4 +202,59 @@ allFiles = file_list_filter(allFiles, includeFilters); | ||
return allFiles; | ||
} | ||
/** | ||
* | ||
* @param {String} basePath | ||
* @param {String[]} [includeFilters] | ||
* @param {Number} [options] | ||
*/ | ||
exports.readSync = function(basePath, includeFilters, options) { | ||
var rootDir = basePath.replace(/\/$/, '') + '/'; | ||
return apply_filters(basePath, read_dir_sync(rootDir, [], rootDir.length, options), includeFilters, options); | ||
}; | ||
/** | ||
* | ||
* @param {string} basePath | ||
* @param {string[]} includeFilters | ||
* @param {number} options | ||
* @param {Function} handler | ||
*/ | ||
exports.read = function(basePath, includeFilters, options, handler) { | ||
var callback; | ||
var assert = require('assert'); | ||
assert.equal(typeof basePath, 'string', 'basePath must be a string'); | ||
assert.equal(typeof arguments[arguments.length - 1], 'function', 'last argument must be a function'); | ||
switch (arguments.length) { | ||
case 2: | ||
callback = includeFilters; | ||
includeFilters = null; | ||
options = 0; | ||
break; | ||
case 3: | ||
callback = options; | ||
if (typeof includeFilters === "number") { | ||
options = includeFilters; | ||
includeFilters = null; | ||
} | ||
else { | ||
options = 0; | ||
} | ||
} | ||
assert.ok(Array.isArray(includeFilters) || includeFilters === null, 'includeFilters must be null or an array of filters'); | ||
assert.equal(typeof options, 'number', 'options must be set as a number'); | ||
var rootDir = basePath.replace(/\/$/, '') + '/', | ||
allFiles = []; | ||
read_dir(rootDir, allFiles, rootDir.length, options).then(function () { | ||
callback(null, apply_filters(basePath, allFiles, includeFilters, options)); | ||
}, function (err) { | ||
callback(err, []); | ||
}); | ||
}; | ||
exports.isDir = is_dir; | ||
@@ -177,0 +261,0 @@ |
{ | ||
"name": "readdir", | ||
"description": "Reads a directory and return results with the ability to use Ant style file match patterns ", | ||
"version": "0.0.6", | ||
"author": "Steve King <steve@mydev.co>", | ||
"contributors": [ { "name": "Steve King", "email": "steve@mydev.co" } ], | ||
"dependencies": {}, | ||
"devDependencies": {}, | ||
"keywords": ["directory", "fs"], | ||
"repository": "git://github.com/steveukx/readdir.js", | ||
"main": "lib/readdir", | ||
"bin": {}, | ||
"scripts": {}, | ||
"config": {}, | ||
"engines": { "node": ">= 0.4.1" } | ||
"name": "readdir", | ||
"description": "Reads a directory and return results with the ability to use Ant style file match patterns ", | ||
"version": "0.0.8", | ||
"author": "Steve King <steve@mydev.co>", | ||
"contributors": [ | ||
{ | ||
"name": "Steve King", | ||
"email": "steve@mydev.co" | ||
} | ||
], | ||
"dependencies": { | ||
"q": "~1.0.1" | ||
}, | ||
"devDependencies": {}, | ||
"keywords": [ | ||
"directory", | ||
"fs" | ||
], | ||
"repository": "git://github.com/steveukx/readdir.js", | ||
"main": "lib/readdir", | ||
"bin": {}, | ||
"scripts": {}, | ||
"config": {}, | ||
"engines": { | ||
"node": ">= 0.4.1" | ||
} | ||
} |
var Assert = require('assert'); | ||
var readdir = require('../lib/readdir'); | ||
(function() { | ||
var readSync = require('../lib/readdir.js').readSync; | ||
var everyFile = readSync('example_dir'); | ||
Assert.deepEqual(everyFile, [ 'AAA/aaa.js', | ||
var readSync = readdir.readSync; | ||
Assert.deepEqual(readSync('example_dir', null, readdir.CASELESS_SORT), [ | ||
'AAA/aaa.js', | ||
'AAA/aaa.txt', | ||
@@ -21,6 +21,5 @@ 'abc.js', | ||
(function() { | ||
var readSync = require('../lib/readdir.js').readSync; | ||
var everyFile = readSync('example_dir', ['**/**.js']); | ||
Assert.deepEqual(everyFile, ['AAA/aaa.js', | ||
var readSync = readdir.readSync; | ||
Assert.deepEqual(readSync('example_dir', ['**/**.js'], readdir.CASELESS_SORT), [ | ||
'AAA/aaa.js', | ||
'BBB/bbb.js', | ||
@@ -33,5 +32,4 @@ 'CCC/ccc.js', | ||
var readSync = require('../lib/readdir.js').readSync; | ||
var everyFile = readSync('example_dir', ['**.js']); | ||
Assert.deepEqual(everyFile, [ 'AAA/aaa.js', | ||
Assert.deepEqual(readSync('example_dir', ['**.js'], readdir.CASELESS_SORT), [ | ||
'AAA/aaa.js', | ||
'abc.js', | ||
@@ -45,5 +43,4 @@ 'BBB/bbb.js', | ||
var readSync = require('../lib/readdir.js').readSync; | ||
var everyFile = readSync('example_dir', ['BBB/*']); | ||
Assert.deepEqual(everyFile, ['BBB/bbb.js', | ||
Assert.deepEqual(readSync('example_dir', ['BBB/*'], readdir.CASELESS_SORT), [ | ||
'BBB/bbb.js', | ||
'BBB/bbb.txt' ], 'path prefix requires that directory, trailing star allows any file type'); | ||
@@ -54,5 +51,4 @@ }()); | ||
var readSync = require('../lib/readdir.js').readSync; | ||
var everyFile = readSync(process.cwd() + '/example_dir/', ['CCC/*']); | ||
Assert.deepEqual(everyFile, ['CCC/ccc.js', | ||
Assert.deepEqual(readSync(process.cwd() + '/example_dir/', ['CCC/*']), [ | ||
'CCC/ccc.js', | ||
'CCC/ccc.txt'], 'Path prefix requires that directory, trailing single star ignores subsequent sub-directories'); | ||
@@ -63,7 +59,7 @@ }()); | ||
var readSync = require('../lib/readdir.js').readSync; | ||
var everyFile = readSync('../test/example_dir', ['CCC/**'], require('../lib/readdir.js').ABSOLUTE_PATHS), | ||
var everyFile = readSync('../test/example_dir', ['CCC/**'], readdir.ABSOLUTE_PATHS + readdir.CASELESS_SORT), | ||
cwd = process.cwd(); | ||
Assert.deepEqual(everyFile, [cwd + '/example_dir/CCC/ccc.js', | ||
Assert.deepEqual(everyFile, [ | ||
cwd + '/example_dir/CCC/ccc.js', | ||
cwd + '/example_dir/CCC/ccc.txt', | ||
@@ -76,5 +72,4 @@ cwd + '/example_dir/CCC/DDD/ddd.js', | ||
var readSync = require('../lib/readdir.js').readSync; | ||
var everyFile = readSync('./example_dir', ['*.txt']); | ||
Assert.deepEqual(everyFile, ['abc.txt'], 'Single star ignores sub-directories and filename is a suffix'); | ||
Assert.deepEqual(readSync('./example_dir', ['*.txt'], readdir.CASELESS_SORT), [ | ||
'abc.txt'], 'Single star ignores sub-directories and filename is a suffix'); | ||
}()); | ||
@@ -86,6 +81,6 @@ | ||
everyFile = readSync('./case_sensitive_dir', null, require('../lib/readdir.js').CASELESS_SORT); | ||
everyFile = readSync('./case_sensitive_dir', null, readdir.CASELESS_SORT); | ||
Assert.deepEqual(everyFile, ['aBC.xml', 'Abc.xsl']); | ||
everyFile = readSync('./case_sensitive_dir', null, require('../lib/readdir.js').CASE_SORT); | ||
everyFile = readSync('./case_sensitive_dir', null, readdir.CASE_SORT); | ||
Assert.deepEqual(everyFile, ['Abc.xsl', 'aBC.xml']); | ||
@@ -95,22 +90,45 @@ }()); | ||
(function() { | ||
var readSync = require('../lib/readdir.js').readSync, | ||
everyFile; | ||
everyFile = readSync('./example_dir', null, require('../lib/readdir.js').INCLUDE_DIRECTORIES); | ||
console.log(everyFile); | ||
Assert.deepEqual(everyFile, [ 'AAA/aaa.js', | ||
var readSync = require('../lib/readdir.js').readSync; | ||
Assert.deepEqual(readSync('./example_dir', null, readdir.INCLUDE_DIRECTORIES + readdir.CASELESS_SORT), [ | ||
'AAA/', | ||
'AAA/aaa.js', | ||
'AAA/aaa.txt', | ||
'AAA/', | ||
'abc.js', | ||
'abc.txt', | ||
'BBB/', | ||
'BBB/bbb.js', | ||
'BBB/bbb.txt', | ||
'BBB/', | ||
'CCC/', | ||
'CCC/ccc.js', | ||
'CCC/ccc.txt', | ||
'CCC/DDD/', | ||
'CCC/DDD/ddd.js', | ||
'CCC/DDD/ddd.txt', | ||
'CCC/DDD/', | ||
'CCC/' ], 'Not supplying a filter selects every file, directories are listed after their contents'); | ||
}()); | ||
'CCC/DDD/ddd.txt'], 'Not supplying a filter selects every file, directories are listed after their contents'); | ||
}()); | ||
(function() { | ||
var readdir = require('../lib/readdir.js'), | ||
read = readdir.read; | ||
read('./example_dir', readdir.INCLUDE_DIRECTORIES + readdir.CASELESS_SORT, function (error, everyFile) { | ||
process.nextTick(function () { | ||
Assert.equal(error, null, 'Should not have thrown an error while scanning directory'); | ||
Assert.deepEqual(everyFile, [ | ||
'AAA/', | ||
'AAA/aaa.js', | ||
'AAA/aaa.txt', | ||
'abc.js', | ||
'abc.txt', | ||
'BBB/', | ||
'BBB/bbb.js', | ||
'BBB/bbb.txt', | ||
'CCC/', | ||
'CCC/ccc.js', | ||
'CCC/ccc.txt', | ||
'CCC/DDD/', | ||
'CCC/DDD/ddd.js', | ||
'CCC/DDD/ddd.txt' ], 'Not supplying a filter selects every file, directories are listed after their contents'); | ||
}); | ||
}); | ||
}()); |
Sorry, the diff of this file is not supported yet
15675
355
1