therubyrhino 2.0.2 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -5,3 +5,4 @@ doc
5
5
  .rvmrc
6
6
  .bundle
7
7
  Gemfile.lock
8
+ spec/deprecations.log
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --format documentation
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source :rubygems
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec :name => "therubyrhino"
4
4
 
@@ -15,4 +15,7 @@ group :test do
15
15
  gem 'therubyrhino_jar', :path => '.'
16
16
  end
17
17
  gem 'less', '>= 2.2.1', :require => nil
18
- end
18
+ end
19
+
20
+ gem 'rake', :require => false, :group => :development
21
+ gem 'jruby-openssl', :group => :development if JRUBY_VERSION < '1.7'
@@ -1,55 +1,63 @@
1
- === 2.0.2 2012-12-05
1
+ ## 2.0.3 2014-02-20
2
+
3
+ * minor fix for time_to_js when scope not set (#27)
4
+ * Jar path now avoids using a glob, which doesn't work inside a jar (#26)
5
+ * use Rhino.warn explicitly otherwise it's a Kernel.warn
6
+
7
+ ## 2.0.2 2012-12-05
2
8
 
3
9
  * handle Rhino's 64K code generation (method) limit on the fly (#23)
4
10
  * correct explicit Ruby equality == and eql? (JRuby 1.7.1 compat)
5
11
  * allow to set javascript version programatically - globally also allow
6
12
  reading it from system properties by default
7
- * allow to set optimization level globally also allow reading it from
8
- system properties by default
9
- * make sure Ruby function wrapper has (Ruby) #call semantics just like
13
+ * allow to set optimization level globally also allow reading it from
14
+ system properties by default
15
+ * make sure Ruby function wrapper has (Ruby) #call semantics just like
10
16
  JavaScript functions exposed into the Ruby side
11
17
  * function's return value should be converted to Ruby (Ruby #call style)
12
18
 
13
- === 2.0.1 2012-08-24
19
+ ## 2.0.1 2012-08-24
14
20
 
15
21
  * JSError improvement to preserve nested Ruby error message
16
22
  * jar-1.7.4 regression fix e.g when loading less (#25)
17
23
  * error.message should be a String value (1.9.3 compat)
18
24
 
19
- === jar-1.7.4 2012-08-02
25
+ ## jar-1.7.4 2012-08-02
20
26
 
21
27
  * updated to new Mozilla Rhino 1.7R4 release, notes:
22
28
  https://developer.mozilla.org/en/New_in_Rhino_1.7R4
23
29
 
24
- === 2.0.0 2012-08-02
25
- This release is functionally the same as therubyrhino-1.73.5 as long
30
+ ## 2.0.0 2012-08-02
31
+
32
+ This release is functionally the same as therubyrhino-1.73.5 as long
26
33
  as the therubyrhino_jar-1.7.3 gem dependency is used along with it.
27
34
 
28
35
  * new versioning scheme - old scheme used for the jar gem
29
36
  * moved out the rhino.jar into a separate therubyrhino_jar gem
30
37
 
31
- === jar-1.7.3 2012-08-02
38
+ ## jar-1.7.3 2012-08-02
32
39
 
33
40
  * therubyrhino_jar gem packaged with Mozilla Rhino 1.7R3
34
41
 
35
42
 
36
- === 1.73.5 2012-07-25
43
+ ## 1.73.5 2012-07-25
37
44
 
38
45
  * #to_s functionName typo fix for org.mozilla.javascript.ScriptStackElement
39
46
  * make sure thrown values are correctly raised from inside JS functions
40
47
  * a better #inspect for native rhino objects
41
48
  * correct JavaScript error handling for Function#apply
42
49
 
43
- === 1.73.4 2012-05-21
50
+ ## 1.73.4 2012-05-21
44
51
 
45
52
  * allow rhino.jar path overrides with Rhino::JAR_PATH
46
53
  * 'correct' JSError#inspect - show thrown value
47
- * fix JSError#javascript_backtrace to be an array and add it on top of the
54
+ * fix JSError#javascript_backtrace to be an array and add it on top of the
48
55
  (ruby) backtrace
49
56
  * make sure JSError#cause always points to native rhino cause (#19)
50
57
  * avoid using instance variables with 'native' JS::Context (JRuby 1.7 warnings)
51
58
 
52
- === 1.73.3 2012-04-23
59
+ ## 1.73.3 2012-04-23
60
+
53
61
  RedJS 0.4 compatible
54
62
 
55
63
  * allow try-catch-ing ScriptError (besides StandardError) in JS
@@ -59,7 +67,8 @@ RedJS 0.4 compatible
59
67
  * Ruby StandardError wrapping so they can be try-catched as JS "error" values
60
68
  * Rhino::Context.new is expected to yield when block passed
61
69
 
62
- === 1.73.2 2012-04-11
70
+ ## 1.73.2 2012-04-11
71
+
63
72
  RedJS 0.2.1 compatible
64
73
 
65
74
  * improve JSError#message + add JSError#value to reflect throw JS value
@@ -69,7 +78,8 @@ RedJS 0.2.1 compatible
69
78
  * restrictable limits now require Contex.new(:restrictable => true)
70
79
  * added Context#timeout_limit (to complete instruction_limit)
71
80
 
72
- === 1.73.1 2011-11-28
81
+ ## 1.73.1 2011-11-28
82
+
73
83
  NOTE: this is a "major" code update from 1.73.0 with some incompatibilities
74
84
  although keeping the bits backward compatible as much as possible :
75
85
 
@@ -90,51 +100,58 @@ although keeping the bits backward compatible as much as possible :
90
100
  * support for setting JS version via Context.version
91
101
  * Rhino::J gets deprecated it's now know as Rhino::JS
92
102
 
93
- === 1.73.0 2011-11-28
103
+ ## 1.73.0 2011-11-28
94
104
 
95
105
  * upgrade to rhino-1.7R3
96
106
  * cache objects passed to context - same object passed twice ends up the same
97
107
  * properly map ruby Time objects to javascript Date
98
108
  * jruby --1.9 improvements
99
109
 
100
- === 1.72.8 2011-06-26
110
+ ## 1.72.8 2011-06-26
111
+
101
112
  * fix passing of options hash to ruby.
102
113
 
103
- === 1.72.6 2009-11-30
114
+ ## 1.72.6 2009-11-30
115
+
104
116
  * 2 major enhancements:
105
117
  * evaluate an IO object such as a file or an socket input stream
106
118
  * load javascript sources directly into the context with the file system
107
119
 
108
- === 1.72.5 2009-11-12
120
+ ## 1.72.5 2009-11-12
121
+
109
122
  * 2 major enhancements:
110
123
  * evaluate javascript with a ruby object as it's scope using Context#open(:with => object)
111
124
  * add eval_js() method to Object to evaluate in the context of that object
112
125
 
113
- === 1.72.4 2009-11-12
126
+ ## 1.72.4 2009-11-12
127
+
114
128
  * 3 major enhancements:
115
129
  * automatically wrap/unwrap ruby and javascript arrays
116
130
  * automatically convert ruby method objects and Proc objects into javascript functions
117
131
  * Make functions defined in javascript callable from ruby
118
132
 
119
- === 1.72.3 2009-11-11
133
+ ## 1.72.3 2009-11-11
134
+
120
135
  * 4 major enhancements:
121
136
  * greatly simplified interface to context by unifying context and scope
122
137
  * remove Context#open_std()
123
138
  * remove Context#standard
124
139
  * remove Context#init_standard_objects
125
140
 
126
- === 1.72.2 2009-11-10
141
+ ## 1.72.2 2009-11-10
142
+
127
143
  * 1 major enhancement:
128
144
  * ability to limit the instruction count for a context
129
145
 
130
- === 1.72.1 2009-11-09
146
+ ## 1.72.1 2009-11-09
147
+
131
148
  * 4 major enhancements:
132
149
  * easily manipulate javascript objects from ruby (NativeObject)
133
150
  * make NativeObject Enumerable
134
151
  * to_h and to_json for NativeObject
135
152
  * embed ruby instances and call methods from javascript
136
153
 
137
- === 1.72.0 2009-09-24
154
+ ## 1.72.0 2009-09-24
138
155
 
139
156
  * 2 major enhancements:
140
157
  * evaluate javascript in jruby
@@ -0,0 +1,262 @@
1
+ # therubyrhino
2
+
3
+ Embed the Mozilla Rhino JavaScript interpreter into Ruby
4
+
5
+ ## REQUIREMENTS:
6
+
7
+ * JRuby >= 1.6.8
8
+
9
+ ## INSTALL:
10
+
11
+ `jruby -S gem install therubyrhino`
12
+
13
+ ## FEATURES/PROBLEMS:
14
+
15
+ * Evaluate JavaScript from with in Ruby
16
+ * Embed your Ruby objects into the JavaScript world
17
+
18
+ ## SYNOPSIS:
19
+
20
+ 1. JavaScript goes into Ruby
21
+ 2. Ruby Objects goes into JavaScript
22
+ 3. Our shark's in the JavaScript!
23
+
24
+ ```ruby
25
+ require 'rhino'
26
+ ```
27
+
28
+ * evaluate some simple JavaScript using `eval_js`:
29
+ ```ruby
30
+ eval_js "7 * 6" #=> 42
31
+ ```
32
+
33
+ * that's quick and dirty, but if you want more control over your environment,
34
+ use a `Context`:
35
+ ```ruby
36
+ Rhino::Context.open do |context|
37
+ context['foo'] = "bar"
38
+ context.eval('foo') # => "bar"
39
+ end
40
+ ```
41
+
42
+ * evaluate a Ruby function from JavaScript:
43
+ ```ruby
44
+ Rhino::Context.open do |context|
45
+ context["say"] = lambda {|word, times| word * times}
46
+ context.eval("say("Hello", 3)") #=> HelloHelloHello
47
+ end
48
+ ```
49
+
50
+ * embed a Ruby object into your JavaScript environment
51
+ ```ruby
52
+ class MyMath
53
+ def plus(a, b)
54
+ a + b
55
+ end
56
+ end
57
+
58
+ Rhino::Context.open do |context|
59
+ context["math"] = MyMath.new
60
+ context.eval("math.plus(20, 22)") #=> 42
61
+ end
62
+ ```
63
+
64
+ * make a Ruby object be your JavaScript environment
65
+ ```ruby
66
+ math = MyMath.new
67
+ Rhino::Context.open(:with => math) do |context|
68
+ context.eval("plus(20, 22)") #=> 42
69
+ end
70
+
71
+ # or the equivalent
72
+
73
+ math.eval_js("plus(20, 22)")
74
+ ```
75
+
76
+ ### Context Configuration
77
+
78
+ * make your standard objects (Object, String, etc...) immutable:
79
+ ```ruby
80
+ Rhino::Context.open(:sealed => true) do |context|
81
+ context.eval("Object.prototype.toString = function() {}") # this is an error!
82
+ end
83
+ ```
84
+
85
+ * turn on Java integration from JavaScript (probably a bad idea):
86
+ ```ruby
87
+ Rhino::Context.open(:java => true) do |context|
88
+ context.eval("java.lang.System.exit()") # it's dangerous!
89
+ end
90
+ ```
91
+
92
+ * limit the number of instructions that can be executed to prevent rogue code:
93
+ ```ruby
94
+ Rhino::Context.open(:restrictable => true) do |context|
95
+ context.instruction_limit = 100000
96
+ context.eval("while (true);") # => Rhino::RunawayScriptError
97
+ end
98
+ ```
99
+
100
+ * limit the time a script executes (rogue scripts):
101
+ ```ruby
102
+ Rhino::Context.open(:restrictable => true, :java => true) do |context|
103
+ context.timeout_limit = 1.5 # seconds
104
+ context.eval %Q{
105
+ for (var i = 0; i < 100; i++) {
106
+ java.lang.Thread.sleep(100);
107
+ }
108
+ } # => Rhino::ScriptTimeoutError
109
+ end
110
+ ```
111
+
112
+ ### Loading JavaScript Source
113
+
114
+ In addition to just evaluating strings, you can also use streams such as files:
115
+
116
+ * evaluate bytes read from any File/IO object:
117
+ ```ruby
118
+ File.open("mysource.js") do |file|
119
+ eval_js file, "mysource.js"
120
+ end
121
+ ```
122
+
123
+ * or load it by filename:
124
+ ```ruby
125
+ Rhino::Context.open do |context|
126
+ context.load("mysource.js")
127
+ end
128
+ ```
129
+
130
+ ### Configurable Ruby access
131
+
132
+ By default accessing Ruby objects from JavaScript is compatible with *therubyracer*:
133
+ https://github.com/cowboyd/therubyracer/wiki/Accessing-Ruby-Objects-From-JavaScript
134
+
135
+ Thus you end-up calling arbitrary no-arg methods as if they were JavaScript properties,
136
+ since instance accessors (properties) and methods (functions) are indistinguishable:
137
+ ```ruby
138
+ Rhino::Context.open do |context|
139
+ context['Time'] = Time
140
+ context.eval('Time.now')
141
+ end
142
+ ```
143
+
144
+ However, you can customize this behavior and there's another access implementation
145
+ that attempts to mirror only attributes as properties as close as possible:
146
+ ```ruby
147
+ class Foo
148
+ attr_accessor :bar
149
+
150
+ def initialize
151
+ @bar = "bar"
152
+ end
153
+
154
+ def check_bar
155
+ bar == "bar"
156
+ end
157
+ end
158
+
159
+ Rhino::Ruby::Scriptable.access = :attribute
160
+ Rhino::Context.open do |context|
161
+ context['Foo'] = Foo
162
+ context.eval('var foo = new Foo()')
163
+ context.eval('foo.bar') # get property using reader
164
+ context.eval('foo.bar = null') # set property using writer
165
+ context.eval('foo.check_bar()') # called like a function
166
+ end
167
+ ```
168
+
169
+ If you happen to come up with your own access strategy, just set it directly :
170
+ ```ruby
171
+ Rhino::Ruby::Scriptable.access = FooApp::BarAccess.instance
172
+ ```
173
+
174
+ ## Safe by default
175
+
176
+ The Ruby Rhino is designed to let you evaluate JavaScript as safely as possible
177
+ unless you tell it to do something more dangerous. The default context is a
178
+ hermetically sealed JavaScript environment with only the standard objects and
179
+ functions. Nothing from the Ruby world is accessible.
180
+
181
+ For Ruby objects that you explicitly embed into JavaScript, only the +public+
182
+ methods "defined in their classes" are exposed by default e.g.
183
+ ```ruby
184
+ class A
185
+ def a; 'a'; end
186
+ end
187
+
188
+ class B < A
189
+ def b; 'b'; end
190
+ end
191
+
192
+ Rhino::Context.open do |context|
193
+ context['a'] = A.new
194
+ context['b'] = B.new
195
+ context.eval("a.a()") # => 'a'
196
+ context.eval("b.b()") # => 'b'
197
+ context.eval("b.a()") # => 'TypeError: undefined property 'a' is not a function'
198
+ end
199
+ ```
200
+
201
+ ## Context Customizations
202
+
203
+ Just like the JVM packaged Rhino scripting engine, therubyrhino gem supports
204
+ specifying JavaScript context properies (optimization level and language version)
205
+ using system properties e.g. to force interpreted mode :
206
+
207
+ `jruby -J-Drhino.opt.level=-1 -rtherubyrhino -S ...`
208
+
209
+ You might also set these programatically as a default for all created contexts :
210
+ ```ruby
211
+ Rhino::Context.default_optimization_level = 1
212
+ Rhino::Context.default_javascript_version = 1.6
213
+ ```
214
+
215
+ Or using plain old JAVA_OPTS e.g. when setting JavaScript version :
216
+
217
+ `-Drhino.js.version=1.7`
218
+
219
+ ## Rhino
220
+
221
+ Rhino is currently maintained at https://github.com/mozilla/rhino
222
+ Release downloads are available at http://www.mozilla.org/rhino/download.html
223
+ Rhino is licensed under the MPL 1.1/GPL 2.0 license.
224
+
225
+ ### Using a custom Rhino version
226
+
227
+ Officially supported versions of Rhino's _js.jar_ are packaged separately as
228
+ **therubyrhino_jar** gem. Make sure you're using the latest gem version if you
229
+ feel like missing something available with Rhino. For experimenters the jar can
230
+ be overriden by defining a `Rhino::JAR_PATH` before `require 'rhino'` e.g. :
231
+ ```ruby
232
+ module Rhino
233
+ JAR_PATH = File.expand_path('lib/rhino/build/rhino1_7R5pre/js.jar')
234
+ end
235
+ # ...
236
+ require 'rhino'
237
+ ```
238
+
239
+ ## LICENSE:
240
+
241
+ (The MIT License)
242
+
243
+ Copyright (c) 2009-2013 Charles Lowell
244
+
245
+ Permission is hereby granted, free of charge, to any person obtaining
246
+ a copy of this software and associated documentation files (the
247
+ 'Software'), to deal in the Software without restriction, including
248
+ without limitation the rights to use, copy, modify, merge, publish,
249
+ distribute, sublicense, and/or sell copies of the Software, and to
250
+ permit persons to whom the Software is furnished to do so, subject to
251
+ the following conditions:
252
+
253
+ The above copyright notice and this permission notice shall be
254
+ included in all copies or substantial portions of the Software.
255
+
256
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
257
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
258
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
259
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
260
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
261
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
262
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -1,9 +1,7 @@
1
1
  require 'bundler/setup'
2
2
 
3
3
  require 'rspec/core/rake_task'
4
- RSpec::Core::RakeTask.new do |spec|
5
- spec.rspec_opts = ['--color', "--format documentation"]
6
- end
4
+ RSpec::Core::RakeTask.new
7
5
 
8
6
  task :default => :spec
9
7
 
@@ -245,7 +245,7 @@ module Rhino
245
245
  do_open(&block)
246
246
  rescue JS::RhinoException => e
247
247
  if code_generation_error?(e)
248
- warn "[INFO] Rhino byte-code generation failed forcing #{@native} into interpreted mode"
248
+ Rhino.warn "[INFO] Rhino byte-code generation failed forcing #{@native} into interpreted mode"
249
249
  self.optimization_level = -1
250
250
  retry
251
251
  end
@@ -1,3 +1,3 @@
1
1
  module Rhino
2
- VERSION = "2.0.2"
2
+ VERSION = "2.0.3"
3
3
  end
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Rhino
3
3
  module To
4
-
4
+
5
5
  def to_ruby(object)
6
6
  case object
7
7
  when JS::Scriptable::NOT_FOUND, JS::Undefined then nil
@@ -33,13 +33,13 @@ module Rhino
33
33
  def args_to_ruby(args)
34
34
  args.map { |arg| to_ruby(arg) }
35
35
  end
36
-
36
+
37
37
  def args_to_javascript(args, scope = nil)
38
38
  args.map { |arg| to_javascript(arg, scope) }.to_java
39
39
  end
40
-
40
+
41
41
  private
42
-
42
+
43
43
  def array_to_ruby(js_array)
44
44
  js_array.length.times.map { |i| to_ruby( js_array.get(i, js_array) ) }
45
45
  end
@@ -60,7 +60,7 @@ module Rhino
60
60
  end
61
61
 
62
62
  def hash_to_javascript(rb_hash, scope = nil)
63
- js_object =
63
+ js_object =
64
64
  if scope && context = JS::Context.getCurrentContext
65
65
  context.newObject(scope)
66
66
  else
@@ -68,29 +68,27 @@ module Rhino
68
68
  end
69
69
  # JS::NativeObject implements Map put it's #put does :
70
70
  # throw new UnsupportedOperationException(); thus no []=
71
- rb_hash.each_pair do |key, val|
71
+ rb_hash.each_pair do |key, val|
72
72
  js_val = to_javascript(val, scope)
73
73
  JS::ScriptableObject.putProperty(js_object, key.to_s, js_val)
74
74
  end
75
75
  js_object
76
76
  end
77
-
77
+
78
78
  def time_to_javascript(time, scope = nil)
79
79
  millis = time.to_f * 1000
80
80
  if scope && context = JS::Context.getCurrentContext
81
81
  JS::ScriptRuntime.newObject(context, scope, 'Date', [ millis ].to_java)
82
82
  else
83
83
  # the pure reflection way - god I love Java's private :
84
- js_klass = JS::NativeObject.java_class
85
- new = js_klass.getDeclaredConstructor
86
- new.setAccessible(true)
84
+ js_klass = JS::NativeObject.java_class.to_java
85
+ new = js_klass.getDeclaredConstructor; new.setAccessible(true)
87
86
  js_date = new.newInstance
88
- date = js_klass.getDeclaredField(:date)
89
- date.setAccessible(true)
87
+ date = js_klass.getDeclaredField(:date); date.setAccessible(true)
90
88
  date.setDouble(js_date, millis)
91
89
  js_date
92
90
  end
93
91
  end
94
-
92
+
95
93
  end
96
94
  end
@@ -1,8 +1,11 @@
1
- require 'bundler/setup'
2
-
3
1
  require 'rhino'
4
2
 
5
- require 'mocha'
3
+ begin
4
+ require 'mocha/api'
5
+ rescue LoadError
6
+ require 'mocha'
7
+ end
8
+
6
9
  require 'redjs'
7
10
 
8
11
  module RedJS
@@ -32,4 +35,5 @@ end
32
35
  RSpec.configure do |config|
33
36
  config.filter_run_excluding :compat => /(0.5.0)|(0.6.0)/ # RedJS
34
37
  config.include Rhino::SpecHelpers
38
+ config.deprecation_stream = 'spec/deprecations.log'
35
39
  end
@@ -7,21 +7,20 @@ Gem::Specification.new do |s|
7
7
  s.version = Rhino::VERSION
8
8
  s.authors = ["Charles Lowell"]
9
9
  s.email = %q{cowboyd@thefrontside.net}
10
-
10
+
11
11
  s.summary = %q{Embed the Rhino JavaScript interpreter into JRuby}
12
12
  s.description = %q{Call javascript code and manipulate javascript objects from ruby. Call ruby code and manipulate ruby objects from javascript.}
13
13
  s.homepage = %q{http://github.com/cowboyd/therubyrhino}
14
14
  s.rubyforge_project = %q{therubyrhino}
15
- s.extra_rdoc_files = ["README.rdoc"]
16
-
15
+ s.extra_rdoc_files = ["README.md"]
16
+ s.license = "MIT"
17
+
17
18
  s.require_paths = ["lib"]
18
19
  s.files = `git ls-files`.split("\n").sort.
19
20
  reject { |file| file == 'therubyrhino_jar.gemspec' || file =~ /^jar\// }
20
21
 
21
22
  s.add_dependency "therubyrhino_jar", '>= 1.7.3'
22
-
23
- s.add_development_dependency "rake"
24
- s.add_development_dependency "rspec", "~> 2.10"
25
- s.add_development_dependency "mocha"
26
- s.add_development_dependency "jruby-openssl"
23
+
24
+ s.add_development_dependency "rspec", "~> 2.14.1"
25
+ s.add_development_dependency "mocha", "~> 0.13.3"
27
26
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: therubyrhino
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 2.0.2
5
+ version: 2.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Charles Lowell
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-12-05 00:00:00 Z
13
+ date: 2014-02-20 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: therubyrhino_jar
@@ -24,49 +24,27 @@ dependencies:
24
24
  prerelease: false
25
25
  type: :runtime
26
26
  - !ruby/object:Gem::Dependency
27
- name: rake
27
+ name: rspec
28
28
  version_requirements: &id002 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
- - - ">="
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: "0"
33
+ version: 2.14.1
34
34
  requirement: *id002
35
35
  prerelease: false
36
36
  type: :development
37
37
  - !ruby/object:Gem::Dependency
38
- name: rspec
38
+ name: mocha
39
39
  version_requirements: &id003 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
43
43
  - !ruby/object:Gem::Version
44
- version: "2.10"
44
+ version: 0.13.3
45
45
  requirement: *id003
46
46
  prerelease: false
47
47
  type: :development
48
- - !ruby/object:Gem::Dependency
49
- name: mocha
50
- version_requirements: &id004 !ruby/object:Gem::Requirement
51
- none: false
52
- requirements:
53
- - - ">="
54
- - !ruby/object:Gem::Version
55
- version: "0"
56
- requirement: *id004
57
- prerelease: false
58
- type: :development
59
- - !ruby/object:Gem::Dependency
60
- name: jruby-openssl
61
- version_requirements: &id005 !ruby/object:Gem::Requirement
62
- none: false
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: "0"
67
- requirement: *id005
68
- prerelease: false
69
- type: :development
70
48
  description: Call javascript code and manipulate javascript objects from ruby. Call ruby code and manipulate ruby objects from javascript.
71
49
  email: cowboyd@thefrontside.net
72
50
  executables: []
@@ -74,13 +52,14 @@ executables: []
74
52
  extensions: []
75
53
 
76
54
  extra_rdoc_files:
77
- - README.rdoc
55
+ - README.md
78
56
  files:
79
57
  - .gitignore
58
+ - .rspec
80
59
  - .travis.yml
81
60
  - Gemfile
82
- - History.txt
83
- - README.rdoc
61
+ - History.md
62
+ - README.md
84
63
  - Rakefile
85
64
  - lib/rhino.rb
86
65
  - lib/rhino/context.rb
@@ -112,8 +91,8 @@ files:
112
91
  - spec/spec_helper.rb
113
92
  - therubyrhino.gemspec
114
93
  homepage: http://github.com/cowboyd/therubyrhino
115
- licenses: []
116
-
94
+ licenses:
95
+ - MIT
117
96
  post_install_message:
118
97
  rdoc_options: []
119
98
 
@@ -140,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
119
  requirements: []
141
120
 
142
121
  rubyforge_project: therubyrhino
143
- rubygems_version: 1.8.24
122
+ rubygems_version: 1.8.29
144
123
  signing_key:
145
124
  specification_version: 3
146
125
  summary: Embed the Rhino JavaScript interpreter into JRuby
@@ -1,246 +0,0 @@
1
- = therubyrhino
2
-
3
- * http://github.com/cowboyd/therubyrhino
4
- * irc://irc.freenode.net/therubyrhino
5
-
6
- == DESCRIPTION:
7
-
8
- Embed the Mozilla Rhino JavaScript interpreter into Ruby
9
-
10
- == FEATURES/PROBLEMS:
11
-
12
- * Evaluate JavaScript from with in Ruby
13
- * Embed your Ruby objects into the JavaScript world
14
-
15
- == SYNOPSIS:
16
-
17
- 1. JavaScript goes into Ruby
18
- 2. Ruby Objects goes into JavaScript
19
- 3. Our shark's in the JavaScript!
20
-
21
- require 'rhino'
22
-
23
- # evaluate some simple javascript
24
- eval_js "7 * 6" #=> 42
25
-
26
- # that's quick and dirty, but if you want more control over your
27
- # environment, use a Context:
28
- Rhino::Context.open do |cxt|
29
- cxt['foo'] = "bar"
30
- cxt.eval('foo') # => "bar"
31
- end
32
-
33
- # evaluate a ruby function from JS
34
-
35
- Rhino::Context.open do |context|
36
- context["say"] = lambda {|word, times| word * times}
37
- context.eval("say("Hello", 3)") #=> HelloHelloHello
38
- end
39
-
40
- # embed a ruby object into your JS environment
41
-
42
- class MyMath
43
- def plus(lhs, rhs)
44
- lhs + rhs
45
- end
46
- end
47
-
48
- Rhino::Context.open do |context|
49
- context["math"] = MyMath.new
50
- context.eval("math.plus(20, 22)") #=> 42
51
- end
52
-
53
- # make a ruby object *be* your JS environment
54
- math = MyMath.new
55
- Rhino::Context.open(:with => math) do |context|
56
- context.eval("plus(20, 22)") #=> 42
57
- end
58
-
59
- #or the equivalent
60
-
61
- math.eval_js("plus(20, 22)")
62
-
63
- # Configure your embedding setup
64
-
65
- # Make your standard objects (Object, String, etc...) immutable
66
- Rhino::Context.open(:sealed => true) do |context|
67
- context.eval("Object.prototype.toString = function() {}") # this is an error!
68
- end
69
-
70
- #Turn on Java integration from javascript (probably a bad idea)
71
- Rhino::Context.open(:java => true) do |context|
72
- context.eval("java.lang.System.exit()") # it's dangerous!
73
- end
74
-
75
- #limit the number of instructions that can be executed in order to prevent
76
- #rogue scripts
77
- Rhino::Context.open(:restrictable => true) do |context|
78
- context.instruction_limit = 100000
79
- context.eval("while (true);") # => Rhino::RunawayScriptError
80
- end
81
-
82
- #limit the time a script executes
83
- #rogue scripts
84
- Rhino::Context.open(:restrictable => true, :java => true) do |context|
85
- context.timeout_limit = 1.5 # seconds
86
- context.eval %Q{
87
- for (var i = 0; i < 100; i++) {
88
- java.lang.Thread.sleep(100);
89
- }
90
- } # => Rhino::ScriptTimeoutError
91
- end
92
-
93
- ==== Different ways of loading JavaScript source
94
-
95
- In addition to just evaluating strings, you can also use streams such as files.
96
-
97
- # evaluate bytes read from any File/IO object:
98
- File.open("mysource.js") do |file|
99
- eval_js file, "mysource.js"
100
- end
101
-
102
- # or load it by filename
103
- Rhino::Context.open do |context|
104
- context.load("mysource.js")
105
- end
106
-
107
- ==== Configurable Ruby access
108
-
109
- By default accessing Ruby objects from JavaScript is compatible with *therubyracer*:
110
- https://github.com/cowboyd/therubyracer/wiki/Accessing-Ruby-Objects-From-JavaScript
111
-
112
- Thus you end-up calling arbitrary no-arg methods as if they were JavaScript properties,
113
- since instance accessors (properties) and methods (functions) are indistinguishable:
114
-
115
- Rhino::Context.open do |context|
116
- context['Time'] = Time
117
- context.eval('Time.now')
118
- end
119
-
120
- However, you can customize this behavior and there's another access implementation
121
- that attempts to mirror only attributes as properties as close as possible:
122
-
123
- class Foo
124
- attr_accessor :bar
125
-
126
- def initialize
127
- @bar = "bar"
128
- end
129
-
130
- def check_bar
131
- bar == "bar"
132
- end
133
- end
134
-
135
- Rhino::Ruby::Scriptable.access = :attribute
136
- Rhino::Context.open do |context|
137
- context['Foo'] = Foo
138
- context.eval('var foo = new Foo()')
139
- context.eval('foo.bar') # get property using reader
140
- context.eval('foo.bar = null') # set property using writer
141
- context.eval('foo.check_bar()') # called like a function
142
- end
143
-
144
- If you happen to come up with your own access strategy, just set it directly :
145
-
146
- Rhino::Ruby::Scriptable.access = FooApp::BarAccess.instance
147
-
148
- === Safe by default
149
-
150
- The Ruby Rhino is designed to let you evaluate JavaScript as safely as possible
151
- unless you tell it to do something more dangerous. The default context is a
152
- hermetically sealed JavaScript environment with only the standard objects and
153
- functions. Nothing from the Ruby world is accessible at all.
154
-
155
- For Ruby objects that you explicitly embed into JavaScript, only the +public+
156
- methods "defined in their classes" are exposed by default e.g.
157
-
158
- class A
159
- def a
160
- "a"
161
- end
162
- end
163
-
164
- class B < A
165
- def b
166
- "b"
167
- end
168
- end
169
-
170
-
171
- Rhino::Context.open do |cxt|
172
- cxt['a'] = A.new
173
- cxt['b'] = B.new
174
- cxt.eval("a.a()") # => 'a'
175
- cxt.eval("b.b()") # => 'b'
176
- cxt.eval("b.a()") # => 'TypeError: undefined property 'a' is not a function'
177
- end
178
-
179
- ==== Using a custom Rhino version
180
-
181
- Officially supported versions of Rhino's _js.jar_ are packaged separately as
182
- *therubyrhino_jar* gem. Make sure you're using the latest gem version if you
183
- feel like missing something available with Rhino. For experimenters the jar can
184
- be overriden by defining a +Rhino::JAR_PATH+ before +require 'rhino'+ e.g. :
185
-
186
- module Rhino
187
- JAR_PATH = File.expand_path('lib/rhino/build/rhino1_7R5pre/js.jar')
188
- end
189
- # ...
190
- require 'rhino'
191
-
192
- ==== Context customizations
193
-
194
- Just like the JVM packaged Rhino scripting engine, therubyrhino gem supports
195
- specifying JavaScript context properies (optimization level and language version)
196
- using system properties e.g. to force interpreted mode :
197
-
198
- jruby -J-Drhino.opt.level=-1 -rtherubyrhino -S ...
199
-
200
- You might also set these programatically as a default for all created contexts :
201
-
202
- Rhino::Context.default_optimization_level = 1
203
- Rhino::Context.default_javascript_version = 1.6
204
-
205
- Or using plain old JAVA_OPTS e.g. when setting JavaScript version :
206
-
207
- -Drhino.js.version=1.7
208
-
209
- == Rhino
210
-
211
- Rhino is currently maintained at https://github.com/mozilla/rhino
212
- Release downloads are available at http://www.mozilla.org/rhino/download.html
213
- Rhino is licensed under the MPL 1.1/GPL 2.0 license.
214
-
215
- == REQUIREMENTS:
216
-
217
- * JRuby >= 1.6
218
-
219
- == INSTALL:
220
-
221
- * jruby -S gem install therubyrhino
222
-
223
- == LICENSE:
224
-
225
- (The MIT License)
226
-
227
- Copyright (c) 2009-2012 Charles Lowell
228
-
229
- Permission is hereby granted, free of charge, to any person obtaining
230
- a copy of this software and associated documentation files (the
231
- 'Software'), to deal in the Software without restriction, including
232
- without limitation the rights to use, copy, modify, merge, publish,
233
- distribute, sublicense, and/or sell copies of the Software, and to
234
- permit persons to whom the Software is furnished to do so, subject to
235
- the following conditions:
236
-
237
- The above copyright notice and this permission notice shall be
238
- included in all copies or substantial portions of the Software.
239
-
240
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
241
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
242
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
243
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
244
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
245
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
246
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.