mirror of
https://github.com/rails/execjs
synced 2023-03-27 23:21:20 -04:00
Stub out the Node runtime
This commit is contained in:
parent
6ba90fc0fa
commit
80b3aa3641
5 changed files with 121 additions and 21 deletions
|
@ -1,3 +1,7 @@
|
||||||
module ExecJS
|
module ExecJS
|
||||||
|
class Error < ::StandardError; end
|
||||||
|
class RuntimeError < Error; end
|
||||||
|
class ProgramError < Error; end
|
||||||
|
|
||||||
autoload :Runtimes, "execjs/runtimes"
|
autoload :Runtimes, "execjs/runtimes"
|
||||||
end
|
end
|
||||||
|
|
20
lib/execjs/runtimes/node.js
Normal file
20
lib/execjs/runtimes/node.js
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
(function(program, execJS) { execJS(program) })(function() { #{source}
|
||||||
|
}, function(program) {
|
||||||
|
var output, print = function(string) {
|
||||||
|
process.stdout.write('' + string);
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
result = program();
|
||||||
|
if (typeof result == 'undefined' && result !== null) {
|
||||||
|
print('["ok"]');
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
print(JSON.stringify(['ok', result]));
|
||||||
|
} catch (err) {
|
||||||
|
print('["err"]');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
print(JSON.stringify(['err', '' + err]));
|
||||||
|
}
|
||||||
|
});
|
|
@ -1,26 +1,58 @@
|
||||||
|
require "json"
|
||||||
|
require "tempfile"
|
||||||
|
|
||||||
module ExecJS
|
module ExecJS
|
||||||
module Runtimes
|
module Runtimes
|
||||||
class Node
|
module Node
|
||||||
|
extend self
|
||||||
|
|
||||||
|
def exec(source)
|
||||||
|
compile_to_tempfile(source) do |file|
|
||||||
|
extract_result(exec_runtime("node #{file.path}"))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def eval(source)
|
||||||
|
if /\S/ =~ source
|
||||||
|
exec("return eval(#{"(#{source})".to_json})")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
def compile_to_tempfile(source)
|
||||||
|
tempfile = Tempfile.open("execjs")
|
||||||
|
tempfile.write compile(source)
|
||||||
|
tempfile.close
|
||||||
|
yield tempfile
|
||||||
|
ensure
|
||||||
|
tempfile.close!
|
||||||
|
end
|
||||||
|
|
||||||
|
def compile(source)
|
||||||
|
wrapper.sub('#{source}', source)
|
||||||
|
end
|
||||||
|
|
||||||
|
def wrapper
|
||||||
|
@wrapper ||= IO.read(File.expand_path('../node.js', __FILE__))
|
||||||
|
end
|
||||||
|
|
||||||
|
def exec_runtime(command)
|
||||||
|
output = `#{command} 2>&1`
|
||||||
|
if $?.success?
|
||||||
|
output
|
||||||
|
else
|
||||||
|
raise RuntimeError, output
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def extract_result(output)
|
||||||
|
status, value = output.empty? ? [] : JSON.parse(output)
|
||||||
|
if status == "ok"
|
||||||
|
value
|
||||||
|
else
|
||||||
|
raise ProgramError, value
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
__END__
|
|
||||||
(function(program, execJS) { execJS(program) })(function() { #{source}
|
|
||||||
}, function(program) {
|
|
||||||
var result, output;
|
|
||||||
try {
|
|
||||||
result = program();
|
|
||||||
try {
|
|
||||||
output = JSON.stringify(result);
|
|
||||||
sys.print('ok ');
|
|
||||||
sys.print(output);
|
|
||||||
} catch (err) {
|
|
||||||
sys.print('err');
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
sys.print('err ');
|
|
||||||
sys.print(err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
|
@ -19,5 +19,5 @@ ExecJS supports these runtimes:
|
||||||
A short example:
|
A short example:
|
||||||
|
|
||||||
require "execjs"
|
require "execjs"
|
||||||
ExecJS.exec "'red yellow blue'.split('')"
|
ExecJS.eval "'red yellow blue'.split('')"
|
||||||
# => ["red", "yellow", "blue"]
|
# => ["red", "yellow", "blue"]
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
require "execjs"
|
||||||
|
require "test/unit"
|
||||||
|
|
||||||
|
class TestNodeRuntime < Test::Unit::TestCase
|
||||||
|
def setup
|
||||||
|
@runtime = ExecJS::Runtimes::Node
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_exec
|
||||||
|
assert_nil @runtime.exec("1")
|
||||||
|
assert_nil @runtime.exec("return")
|
||||||
|
assert_nil @runtime.exec("return null")
|
||||||
|
assert_nil @runtime.exec("return function() {}")
|
||||||
|
assert_equal 0, @runtime.exec("return 0")
|
||||||
|
assert_equal true, @runtime.exec("return true")
|
||||||
|
assert_equal [1, 2], @runtime.exec("return [1, 2]")
|
||||||
|
assert_equal "hello", @runtime.exec("return 'hello'")
|
||||||
|
assert_equal({"a"=>1,"b"=>2}, @runtime.exec("return {a:1,b:2}"))
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_eval
|
||||||
|
assert_nil @runtime.eval("")
|
||||||
|
assert_nil @runtime.eval(" ")
|
||||||
|
assert_nil @runtime.eval("null")
|
||||||
|
assert_nil @runtime.eval("function() {}")
|
||||||
|
assert_equal 0, @runtime.eval("0")
|
||||||
|
assert_equal true, @runtime.eval("true")
|
||||||
|
assert_equal [1, 2], @runtime.eval("[1, 2]")
|
||||||
|
assert_equal "hello", @runtime.eval("'hello'")
|
||||||
|
assert_equal({"a"=>1,"b"=>2}, @runtime.eval("{a:1,b:2}"))
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_syntax_error
|
||||||
|
assert_raise ExecJS::RuntimeError do
|
||||||
|
@runtime.exec(")")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_thrown_exception
|
||||||
|
assert_raise ExecJS::ProgramError do
|
||||||
|
@runtime.exec("throw 'hello'")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue