1
0
Fork 0
mirror of https://github.com/rails/execjs synced 2023-03-27 23:21:20 -04:00

Add the ability to specify ExecJS.runtime via ENV["EXECJS_RUNTIME"].

You can now load ExecJS and bypass engine autodetection by requiring "execjs/runtimes" instead of "execjs".
This commit is contained in:
Sam Stephenson 2011-06-01 10:49:00 -05:00
parent de9d10fa91
commit 0893e12fe9
3 changed files with 75 additions and 50 deletions

View file

@ -1,53 +1,5 @@
require "rbconfig"
require "execjs/runtimes"
module ExecJS
VERSION = "1.0.0"
class Error < ::StandardError; end
class RuntimeError < Error; end
class ProgramError < Error; end
class RuntimeUnavailable < RuntimeError; end
autoload :ExternalRuntime, "execjs/external_runtime"
autoload :MustangRuntime, "execjs/mustang_runtime"
autoload :RubyRacerRuntime, "execjs/ruby_racer_runtime"
autoload :RubyRhinoRuntime, "execjs/ruby_rhino_runtime"
autoload :Runtimes, "execjs/runtimes"
class << self
attr_reader :runtime
def exec(source)
runtime.exec(source)
end
def eval(source)
runtime.eval(source)
end
def compile(source)
runtime.compile(source)
end
def runtimes
Runtimes.runtimes
end
def runtime=(runtime)
raise RuntimeUnavailable, "#{runtime.name} is unavailable on this system" unless runtime.available?
@runtime = runtime
end
def root
@root ||= File.expand_path("../execjs", __FILE__)
end
def windows?
@windows ||= RbConfig::CONFIG["host_os"] =~ /mswin|mingw/
end
end
# Eagerly detect runtime
self.runtime ||= Runtimes.best_available ||
raise(RuntimeUnavailable, "Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.")
self.runtime ||= Runtimes.autodetect
end

39
lib/execjs/module.rb Normal file
View file

@ -0,0 +1,39 @@
require "rbconfig"
module ExecJS
VERSION = "1.0.0"
class Error < ::StandardError; end
class RuntimeError < Error; end
class ProgramError < Error; end
class RuntimeUnavailable < RuntimeError; end
class << self
attr_reader :runtime
def runtime=(runtime)
raise RuntimeUnavailable, "#{runtime.name} is unavailable on this system" unless runtime.available?
@runtime = runtime
end
def exec(source)
runtime.exec(source)
end
def eval(source)
runtime.eval(source)
end
def compile(source)
runtime.compile(source)
end
def root
@root ||= File.expand_path("..", __FILE__)
end
def windows?
@windows ||= RbConfig::CONFIG["host_os"] =~ /mswin|mingw/
end
end
end

View file

@ -1,3 +1,9 @@
require "execjs/module"
require "execjs/external_runtime"
require "execjs/mustang_runtime"
require "execjs/ruby_racer_runtime"
require "execjs/ruby_rhino_runtime"
module ExecJS
module Runtimes
RubyRacer = RubyRacerRuntime.new
@ -32,10 +38,34 @@ module ExecJS
)
def self.autodetect
from_environment || best_available ||
raise(RuntimeUnavailable, "Could not find a JavaScript runtime. " +
"See https://github.com/sstephenson/execjs for a list of available runtimes.")
end
def self.best_available
runtimes.find(&:available?)
end
def self.from_environment
if name = ENV["EXECJS_RUNTIME"]
if runtime = const_get(name)
if runtime.available?
runtime if runtime.available?
else
raise RuntimeUnavailable, "#{name} runtime is not available on this system"
end
elsif !name.empty?
raise RuntimeUnavailable, "#{name} runtime is not defined"
end
end
end
def self.names
constants
end
def self.runtimes
@runtimes ||= [
RubyRacer,
@ -48,4 +78,8 @@ module ExecJS
]
end
end
def self.runtimes
Runtimes.runtimes
end
end