execjs 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -8,14 +8,16 @@ returns the result to you as a Ruby object.
8
8
  ExecJS supports these runtimes:
9
9
 
10
10
  * [therubyracer](https://github.com/cowboyd/therubyracer) - Google V8
11
- embedded within MRI Ruby
11
+ embedded within Ruby
12
12
  * [therubyrhino](https://github.com/cowboyd/therubyrhino) - Mozilla
13
13
  Rhino embedded within JRuby
14
+ * [Johnson](https://github.com/jbarnette/johnson) - Mozilla
15
+ SpiderMonkey embedded within Ruby
14
16
  * [Mustang](https://github.com/nu7hatch/mustang) - Mustang V8
15
17
  embedded within Ruby
16
18
  * [Node.js](http://nodejs.org/)
17
19
  * Apple JavaScriptCore - Included with Mac OS X
18
- * [Mozilla Spidermonkey](http://www.mozilla.org/js/spidermonkey/)
20
+ * [Mozilla SpiderMonkey](http://www.mozilla.org/js/spidermonkey/)
19
21
  * [Microsoft Windows Script Host](http://msdn.microsoft.com/en-us/library/9bbdkx3k.aspx) (JScript)
20
22
 
21
23
  A short example:
@@ -0,0 +1,112 @@
1
+ module ExecJS
2
+ class JohnsonRuntime
3
+ class Context
4
+ def initialize(source = "")
5
+ @runtime = Johnson::Runtime.new
6
+ @runtime.evaluate(source)
7
+ end
8
+
9
+ def exec(source, options = {})
10
+ souce = source.encode('UTF-8') if source.respond_to?(:encode)
11
+
12
+ if /\S/ =~ source
13
+ eval "(function(){#{source}})()", options
14
+ end
15
+ end
16
+
17
+ def eval(source, options = {})
18
+ souce = source.encode('UTF-8') if source.respond_to?(:encode)
19
+
20
+ if /\S/ =~ source
21
+ unbox @runtime.evaluate("(#{source})")
22
+ end
23
+ rescue Johnson::Error => e
24
+ if syntax_error?(e)
25
+ raise RuntimeError, e.message
26
+ else
27
+ raise ProgramError, e.message
28
+ end
29
+ end
30
+
31
+ def call(properties, *args)
32
+ unbox @runtime.evaluate(properties).call(*args)
33
+ rescue Johnson::Error => e
34
+ if syntax_error?(e)
35
+ raise RuntimeError, e.message
36
+ else
37
+ raise ProgramError, e.message
38
+ end
39
+ end
40
+
41
+ def unbox(value)
42
+ case
43
+ when function?(value)
44
+ nil
45
+ when string?(value)
46
+ value.respond_to?(:force_encoding) ?
47
+ value.force_encoding('UTF-8') :
48
+ value
49
+ when array?(value)
50
+ value.map { |v| unbox(v) }
51
+ when object?(value)
52
+ value.inject({}) do |vs, (k, v)|
53
+ vs[k] = unbox(v) unless function?(v)
54
+ vs
55
+ end
56
+ else
57
+ value
58
+ end
59
+ end
60
+
61
+ private
62
+ def syntax_error?(error)
63
+ error.message =~ /^syntax error at /
64
+ end
65
+
66
+ def function?(value)
67
+ value.respond_to?(:function?) && value.function?
68
+ end
69
+
70
+ def string?(value)
71
+ value.is_a?(String)
72
+ end
73
+
74
+ def array?(value)
75
+ array_test.call(value)
76
+ end
77
+
78
+ def object?(value)
79
+ value.respond_to?(:inject)
80
+ end
81
+
82
+ def array_test
83
+ @array_test ||= @runtime.evaluate("(function(a) {return a instanceof [].constructor})")
84
+ end
85
+ end
86
+
87
+ def name
88
+ "Johnson (SpiderMonkey)"
89
+ end
90
+
91
+ def exec(source)
92
+ context = Context.new
93
+ context.exec(source)
94
+ end
95
+
96
+ def eval(source)
97
+ context = Context.new
98
+ context.eval(source)
99
+ end
100
+
101
+ def compile(source)
102
+ Context.new(source)
103
+ end
104
+
105
+ def available?
106
+ require "johnson"
107
+ true
108
+ rescue LoadError
109
+ false
110
+ end
111
+ end
112
+ end
@@ -1,8 +1,7 @@
1
+ require "execjs/version"
1
2
  require "rbconfig"
2
3
 
3
4
  module ExecJS
4
- VERSION = "1.1.3"
5
-
6
5
  class Error < ::StandardError; end
7
6
  class RuntimeError < Error; end
8
7
  class ProgramError < Error; end
@@ -1,5 +1,6 @@
1
1
  require "execjs/module"
2
2
  require "execjs/external_runtime"
3
+ require "execjs/johnson_runtime"
3
4
  require "execjs/mustang_runtime"
4
5
  require "execjs/ruby_racer_runtime"
5
6
  require "execjs/ruby_rhino_runtime"
@@ -10,6 +11,8 @@ module ExecJS
10
11
 
11
12
  RubyRhino = RubyRhinoRuntime.new
12
13
 
14
+ Johnson = JohnsonRuntime.new
15
+
13
16
  Mustang = MustangRuntime.new
14
17
 
15
18
  Node = ExternalRuntime.new(
@@ -25,8 +28,8 @@ module ExecJS
25
28
  :conversion => { :from => "ISO8859-1", :to => "UTF-8" }
26
29
  )
27
30
 
28
- Spidermonkey = ExternalRuntime.new(
29
- :name => "Spidermonkey",
31
+ SpiderMonkey = Spidermonkey = ExternalRuntime.new(
32
+ :name => "SpiderMonkey",
30
33
  :command => "js",
31
34
  :runner_path => ExecJS.root + "/support/basic_runner.js"
32
35
  )
@@ -54,7 +57,7 @@ module ExecJS
54
57
  if runtime.available?
55
58
  runtime if runtime.available?
56
59
  else
57
- raise RuntimeUnavailable, "#{name} runtime is not available on this system"
60
+ raise RuntimeUnavailable, "#{runtime.name} runtime is not available on this system"
58
61
  end
59
62
  elsif !name.empty?
60
63
  raise RuntimeUnavailable, "#{name} runtime is not defined"
@@ -63,17 +66,18 @@ module ExecJS
63
66
  end
64
67
 
65
68
  def self.names
66
- constants
69
+ @names ||= constants.inject({}) { |h, name| h.merge(const_get(name) => name) }.values
67
70
  end
68
71
 
69
72
  def self.runtimes
70
73
  @runtimes ||= [
71
74
  RubyRacer,
72
75
  RubyRhino,
76
+ Johnson,
73
77
  Mustang,
74
78
  Node,
75
79
  JavaScriptCore,
76
- Spidermonkey,
80
+ SpiderMonkey,
77
81
  JScript
78
82
  ]
79
83
  end
@@ -0,0 +1,3 @@
1
+ module ExecJS
2
+ VERSION = "1.2.0"
3
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: execjs
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
- - 1
9
- - 3
10
- version: 1.1.3
8
+ - 2
9
+ - 0
10
+ version: 1.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sam Stephenson
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-06-13 00:00:00 -05:00
19
+ date: 2011-06-18 00:00:00 -05:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -35,7 +35,7 @@ dependencies:
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
38
- name: rake
38
+ name: johnson
39
39
  prerelease: false
40
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
41
  none: false
@@ -48,6 +48,62 @@ dependencies:
48
48
  version: "0"
49
49
  type: :development
50
50
  version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: mustang
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ type: :development
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: rake
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 3
74
+ segments:
75
+ - 0
76
+ version: "0"
77
+ type: :development
78
+ version_requirements: *id004
79
+ - !ruby/object:Gem::Dependency
80
+ name: therubyracer
81
+ prerelease: false
82
+ requirement: &id005 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ hash: 3
88
+ segments:
89
+ - 0
90
+ version: "0"
91
+ type: :development
92
+ version_requirements: *id005
93
+ - !ruby/object:Gem::Dependency
94
+ name: therubyrhino
95
+ prerelease: false
96
+ requirement: &id006 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
104
+ version: "0"
105
+ type: :development
106
+ version_requirements: *id006
51
107
  description: " ExecJS lets you run JavaScript code from Ruby.\n"
52
108
  email:
53
109
  - sstephenson@gmail.com
@@ -61,7 +117,9 @@ extra_rdoc_files: []
61
117
  files:
62
118
  - lib/execjs.rb
63
119
  - lib/execjs/external_runtime.rb
120
+ - lib/execjs/johnson_runtime.rb
64
121
  - lib/execjs/module.rb
122
+ - lib/execjs/version.rb
65
123
  - lib/execjs/mustang_runtime.rb
66
124
  - lib/execjs/ruby_racer_runtime.rb
67
125
  - lib/execjs/ruby_rhino_runtime.rb
@@ -103,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
161
  requirements: []
104
162
 
105
163
  rubyforge_project:
106
- rubygems_version: 1.6.2
164
+ rubygems_version: 1.5.0
107
165
  signing_key:
108
166
  specification_version: 3
109
167
  summary: Run JavaScript code from Ruby