Add shell.exec with test
This commit is contained in:
parent
e43b1ba551
commit
263b9cd9b0
68
src/shell.js
68
src/shell.js
|
@ -2,8 +2,6 @@ define(function(require) {
|
||||||
|
|
||||||
var Path = require('src/path');
|
var Path = require('src/path');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function Shell(fs, options) {
|
function Shell(fs, options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
|
|
||||||
|
@ -22,36 +20,55 @@ define(function(require) {
|
||||||
// We include `cd` on the this vs. proto so that
|
// We include `cd` on the this vs. proto so that
|
||||||
// we can access cwd without exposing it externally.
|
// we can access cwd without exposing it externally.
|
||||||
this.cd = function(path) {
|
this.cd = function(path) {
|
||||||
|
this.cwd = Path.resolve(this.cwd, path);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Shell.prototype.ls = function(path) {
|
/**
|
||||||
|
* Execute the .js command located at `path`. Such commands
|
||||||
};
|
* should assume the existence of 3 arguments, which will be
|
||||||
|
* defined at runtime:
|
||||||
Shell.prototype.rm = function(path, options, callback) {
|
*
|
||||||
|
* * options - an object containing any arguments, data, etc.
|
||||||
};
|
* * callback - a callback function(error, result) to call when done.
|
||||||
|
*
|
||||||
Shell.prototype.mv = function(path) {
|
* The .js command's contents should be the body of a function
|
||||||
|
* that looks like this:
|
||||||
};
|
*
|
||||||
|
* function(fs, options, callback) {
|
||||||
Shell.prototype.cp = function(path) {
|
* // .js code here
|
||||||
|
* }
|
||||||
};
|
*/
|
||||||
|
Shell.prototype.exec = function(path, options, callback) {
|
||||||
Shell.prototype.mkdir = function(path) {
|
var fs = this.fs;
|
||||||
|
if(typeof options === 'function') {
|
||||||
|
callback = options;
|
||||||
|
options = {};
|
||||||
|
}
|
||||||
|
options = options || {};
|
||||||
|
callback = callback || function(){};
|
||||||
|
path = Path.resolve(this.cwd, path);
|
||||||
|
|
||||||
|
fs.readFile(path, "utf8", function(error, data) {
|
||||||
|
if(error) {
|
||||||
|
callback(error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
var cmd = new Function('fs', 'options', 'callback', data);
|
||||||
|
cmd(fs, options, callback);
|
||||||
|
} catch(e) {
|
||||||
|
callback(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a file if it does not exist, or update access and
|
* Create a file if it does not exist, or update access and
|
||||||
* modified times if it does. Valid options include:
|
* modified times if it does. Valid options include:
|
||||||
*
|
*
|
||||||
* * create - whether to create the file if missing (defaults to true)
|
* * updateOnly - whether to create the file if missing (defaults to false)
|
||||||
* * date - use the provided Date value instead of current date/time
|
* * date - use the provided Date value instead of current date/time
|
||||||
*/
|
*/
|
||||||
Shell.prototype.touch = function(path, options, callback) {
|
Shell.prototype.touch = function(path, options, callback) {
|
||||||
|
@ -60,6 +77,8 @@ define(function(require) {
|
||||||
callback = options;
|
callback = options;
|
||||||
options = {};
|
options = {};
|
||||||
}
|
}
|
||||||
|
options = options || {};
|
||||||
|
callback = callback || function(){};
|
||||||
path = Path.resolve(this.cwd, path);
|
path = Path.resolve(this.cwd, path);
|
||||||
|
|
||||||
function createFile(path) {
|
function createFile(path) {
|
||||||
|
@ -80,8 +99,7 @@ define(function(require) {
|
||||||
|
|
||||||
fs.stat(path, function(error, stats) {
|
fs.stat(path, function(error, stats) {
|
||||||
if(error) {
|
if(error) {
|
||||||
// Skip file creation if create is `false`
|
if(options.updateOnly === true) {
|
||||||
if(options.create === false) {
|
|
||||||
callback();
|
callback();
|
||||||
} else {
|
} else {
|
||||||
createFile(path);
|
createFile(path);
|
||||||
|
@ -92,10 +110,6 @@ define(function(require) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
Shell.prototype.ln = function(path) {
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
return Shell;
|
return Shell;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
define(["Filer", "util"], function(Filer, util) {
|
||||||
|
|
||||||
|
describe('FileSystemShell.exec', function() {
|
||||||
|
beforeEach(util.setup);
|
||||||
|
afterEach(util.cleanup);
|
||||||
|
|
||||||
|
it('should be a function', function() {
|
||||||
|
var shell = util.shell();
|
||||||
|
expect(shell.exec).to.be.a('function');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to execute a command .js file from the filesystem', function(done) {
|
||||||
|
var fs = util.fs();
|
||||||
|
var shell = fs.Shell();
|
||||||
|
var cmdString = "fs.writeFile(options.path, options.data, callback);";
|
||||||
|
|
||||||
|
fs.writeFile('/cmd.js', cmdString, function(error) {
|
||||||
|
if(error) throw error;
|
||||||
|
|
||||||
|
shell.exec('/cmd.js', {path: '/test', data: 'hello world'}, function(error, result) {
|
||||||
|
if(error) throw error;
|
||||||
|
|
||||||
|
fs.readFile('/test', 'utf8', function(error, data) {
|
||||||
|
if(error) throw error;
|
||||||
|
expect(data).to.equal('hello world');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
|
@ -31,11 +31,11 @@ define(["Filer", "util"], function(Filer, util) {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should skip creating a new file if options.create is false', function(done) {
|
it('should skip creating a new file if options.updateOnly is true', function(done) {
|
||||||
var fs = util.fs();
|
var fs = util.fs();
|
||||||
var shell = fs.Shell();
|
var shell = fs.Shell();
|
||||||
|
|
||||||
shell.touch('/newfile', { create: false }, function(error) {
|
shell.touch('/newfile', { updateOnly: true }, function(error) {
|
||||||
if(error) throw error;
|
if(error) throw error;
|
||||||
|
|
||||||
fs.stat('/newfile', function(error, stats) {
|
fs.stat('/newfile', function(error, stats) {
|
||||||
|
|
|
@ -44,6 +44,7 @@ define([
|
||||||
|
|
||||||
// Filer.FileSystemShell.*
|
// Filer.FileSystemShell.*
|
||||||
"spec/shell/touch.spec",
|
"spec/shell/touch.spec",
|
||||||
|
"spec/shell/exec.spec",
|
||||||
|
|
||||||
// Ported node.js tests (filenames match names in https://github.com/joyent/node/tree/master/test)
|
// Ported node.js tests (filenames match names in https://github.com/joyent/node/tree/master/test)
|
||||||
"spec/node-js/simple/test-fs-mkdir",
|
"spec/node-js/simple/test-fs-mkdir",
|
||||||
|
|
Loading…
Reference in New Issue