therubyrhino 1.72.3-jruby → 1.72.4-jruby
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/History.txt +8 -2
- data/Manifest.txt +3 -0
- data/README.rdoc +12 -14
- data/lib/rhino.rb +4 -2
- data/lib/rhino/context.rb +3 -22
- data/lib/rhino/native_function.rb +14 -0
- data/lib/rhino/ruby_function.rb +14 -0
- data/lib/rhino/ruby_object.rb +23 -7
- data/lib/rhino/wormhole.rb +13 -3
- data/spec/rhino/context_spec.rb +1 -1
- data/spec/rhino/native_object_spec.rb +1 -1
- data/spec/rhino/ruby_object_spec.rb +68 -0
- data/spec/rhino/wormhole_spec.rb +62 -1
- data/therubyrhino.gemspec +2 -2
- metadata +4 -1
data/History.txt
CHANGED
@@ -1,5 +1,11 @@
|
|
1
|
-
=== 1.72.
|
2
|
-
*
|
1
|
+
=== 1.72.4 2009-11-12
|
2
|
+
* 3 major enhancements:
|
3
|
+
* automatically wrap/unwrap ruby and javascript arrays
|
4
|
+
* automatically convert ruby method objects and Proc objects into javascript functions
|
5
|
+
* Make functions defined in javascript callable from ruby
|
6
|
+
|
7
|
+
=== 1.72.3 2009-11-11
|
8
|
+
* 4 major enhancements:
|
3
9
|
* greatly simplified interface to context by unifying context and scope
|
4
10
|
* remove Context#open_std()
|
5
11
|
* remove Context#standard
|
data/Manifest.txt
CHANGED
@@ -5,8 +5,10 @@ Rakefile
|
|
5
5
|
lib/rhino.rb
|
6
6
|
lib/rhino/context.rb
|
7
7
|
lib/rhino/java.rb
|
8
|
+
lib/rhino/native_function.rb
|
8
9
|
lib/rhino/native_object.rb
|
9
10
|
lib/rhino/rhino-1.7R2.jar
|
11
|
+
lib/rhino/ruby_function.rb
|
10
12
|
lib/rhino/ruby_object.rb
|
11
13
|
lib/rhino/wormhole.rb
|
12
14
|
script/console
|
@@ -14,6 +16,7 @@ script/destroy
|
|
14
16
|
script/generate
|
15
17
|
spec/rhino/context_spec.rb
|
16
18
|
spec/rhino/native_object_spec.rb
|
19
|
+
spec/rhino/ruby_object_spec.rb
|
17
20
|
spec/rhino/wormhole_spec.rb
|
18
21
|
spec/spec.opts
|
19
22
|
spec/spec_helper.rb
|
data/README.rdoc
CHANGED
@@ -17,33 +17,31 @@ Embed the Mozilla Rhino Javascript interpreter into Ruby
|
|
17
17
|
1. Ruby Objects goes into Javascript
|
18
18
|
1. Our shark's in the Javascript!
|
19
19
|
|
20
|
-
|
21
|
-
include Rhino
|
22
20
|
# evaluate some simple javascript
|
23
21
|
|
24
22
|
Rhino::Context.open do |context|
|
25
|
-
context.
|
23
|
+
context.eval("7 * 6") #=> 42
|
26
24
|
end
|
27
25
|
|
28
26
|
# evaluate a ruby function from javascript
|
29
27
|
|
30
28
|
Rhino::Context.open do |context|
|
31
|
-
|
32
|
-
|
33
|
-
context.evaljs("say("Hello", 3)") #=> HelloHelloHello
|
29
|
+
context["say"] = lambda {|word, times| word * times}
|
30
|
+
context.eval("say("Hello", 3)") #=> HelloHelloHello
|
34
31
|
end
|
35
32
|
|
36
33
|
# Configure your embedding setup
|
37
34
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
context.evaljs("Object.prototype.toString = function() {}") # this is an error!
|
42
|
-
|
43
|
-
#Turn on Java integration from javascript (probably a bad idea)
|
44
|
-
scope = context.init_standard_objects(:java => true)
|
45
|
-
context.evaljs("java.lang.System.exit()") #it's dangerous!
|
35
|
+
# Make your standard objects (Object, String, etc...) immutable
|
36
|
+
Rhino::Context.open(:sealed => true) do |context|
|
37
|
+
context.eval("Object.prototype.toString = function() {}") # this is an error!
|
46
38
|
end
|
39
|
+
|
40
|
+
#Turn on Java integration from javascript (probably a bad idea)
|
41
|
+
Rhino::Context.open(:java => true) do |context|
|
42
|
+
context.eval("java.lang.System.exit()") #it's dangerous!
|
43
|
+
end
|
44
|
+
|
47
45
|
== REQUIREMENTS:
|
48
46
|
|
49
47
|
* JRuby >= 1.3.0
|
data/lib/rhino.rb
CHANGED
@@ -3,10 +3,12 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
3
3
|
|
4
4
|
|
5
5
|
module Rhino
|
6
|
-
VERSION = '1.72.
|
6
|
+
VERSION = '1.72.4'
|
7
7
|
require 'rhino/java'
|
8
8
|
require 'rhino/context'
|
9
9
|
require 'rhino/wormhole'
|
10
|
-
require 'rhino/native_object'
|
11
10
|
require 'rhino/ruby_object'
|
11
|
+
require 'rhino/ruby_function'
|
12
|
+
require 'rhino/native_object'
|
13
|
+
require 'rhino/native_function'
|
12
14
|
end
|
data/lib/rhino/context.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
1
|
module Rhino
|
2
|
-
|
3
|
-
|
4
|
-
end
|
5
|
-
|
6
|
-
class Context
|
7
|
-
|
2
|
+
|
3
|
+
class Context
|
8
4
|
attr_reader :scope
|
9
5
|
|
10
6
|
class << self
|
@@ -50,22 +46,7 @@ module Rhino
|
|
50
46
|
end
|
51
47
|
|
52
48
|
end
|
53
|
-
|
54
|
-
class Function < J::BaseFunction
|
55
|
-
def initialize(callable = nil, &block)
|
56
|
-
super()
|
57
|
-
@block = callable || block
|
58
|
-
end
|
59
|
-
|
60
|
-
def call(cxt, scope, this, args)
|
61
|
-
@block.call(*(args.map {|a| To.ruby(a)}))
|
62
|
-
end
|
63
|
-
|
64
|
-
def to_json(*args)
|
65
|
-
'"[Native Function]"'
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
49
|
+
|
69
50
|
class ContextFactory < J::ContextFactory
|
70
51
|
|
71
52
|
def observeInstructionCount(cxt, count)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
module Rhino
|
3
|
+
class NativeFunction < NativeObject
|
4
|
+
def call(*args)
|
5
|
+
begin
|
6
|
+
cxt = J::Context.enter()
|
7
|
+
scope = @j.getParentScope() || cxt.initStandardObjects()
|
8
|
+
@j.call(cxt, scope, scope, args.map {|o| To.javascript(o)})
|
9
|
+
ensure
|
10
|
+
J::Context.exit()
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/rhino/ruby_object.rb
CHANGED
@@ -17,13 +17,7 @@ module Rhino
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def getPrototype()
|
20
|
-
|
21
|
-
p.put("toString", p, Function.new {to_s})
|
22
|
-
for name in @ruby.public_methods(false).reject {|m| m == 'initialize'}
|
23
|
-
method = @ruby.method(name)
|
24
|
-
p.put(name.gsub(/_(\w)/) {$1.upcase}, p, Function.new(method) {})
|
25
|
-
end
|
26
|
-
end
|
20
|
+
Prototype::Generic
|
27
21
|
end
|
28
22
|
|
29
23
|
def to_s
|
@@ -31,5 +25,27 @@ module Rhino
|
|
31
25
|
end
|
32
26
|
|
33
27
|
alias_method :prototype, :getPrototype
|
28
|
+
|
29
|
+
|
30
|
+
class Prototype < J::ScriptableObject
|
31
|
+
|
32
|
+
def get(name, start)
|
33
|
+
robject = To.ruby(start)
|
34
|
+
rb_name = name.gsub(/([a-z])([A-Z])/) {"#{$1}_#{$2.downcase}"}
|
35
|
+
if (robject.public_methods(false).include?(rb_name))
|
36
|
+
method = robject.method(rb_name)
|
37
|
+
RubyFunction.new(method)
|
38
|
+
else
|
39
|
+
super(name, start)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def has(name, start)
|
44
|
+
rb_name = name.gsub(/([a-z])([A-Z])/) {"#{$1}_#{$2.downcase}"}
|
45
|
+
To.ruby(start).public_methods(false).respond_to?(rb_name) ? true : super(name,start)
|
46
|
+
end
|
47
|
+
|
48
|
+
Generic = new
|
49
|
+
end
|
34
50
|
end
|
35
51
|
end
|
data/lib/rhino/wormhole.rb
CHANGED
@@ -7,6 +7,8 @@ module Rhino
|
|
7
7
|
case object
|
8
8
|
when *JS_UNDEF then nil
|
9
9
|
when J::Wrapper then object.unwrap
|
10
|
+
when J::NativeArray then array(object)
|
11
|
+
when J::Function then NativeFunction.new(object)
|
10
12
|
when J::Scriptable then NativeObject.new(object)
|
11
13
|
else object
|
12
14
|
end
|
@@ -14,12 +16,20 @@ module Rhino
|
|
14
16
|
|
15
17
|
def javascript(object)
|
16
18
|
case object
|
17
|
-
when
|
18
|
-
when
|
19
|
+
when String,Numeric then object
|
20
|
+
when TrueClass,FalseClass then object
|
21
|
+
when Array then J::NativeArray.new(object.to_java)
|
22
|
+
when Proc,Method then RubyFunction.new(object)
|
23
|
+
when NativeObject then object.j
|
24
|
+
when J::Scriptable then object
|
19
25
|
else RubyObject.new(object)
|
20
26
|
end
|
21
27
|
end
|
22
28
|
|
23
|
-
|
29
|
+
def array(native)
|
30
|
+
native.length.times.map {|i| native.get(i,native)}
|
31
|
+
end
|
32
|
+
|
33
|
+
module_function :ruby, :javascript, :array
|
24
34
|
end
|
25
35
|
end
|
data/spec/rhino/context_spec.rb
CHANGED
@@ -66,7 +66,7 @@ describe Rhino::Context do
|
|
66
66
|
|
67
67
|
it "can call ruby functions from javascript" do
|
68
68
|
Context.open do |cxt|
|
69
|
-
cxt["say"] =
|
69
|
+
cxt["say"] = lambda {|word, times| word * times}
|
70
70
|
cxt.eval("say('Hello',2)").should == "HelloHello"
|
71
71
|
end
|
72
72
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe Rhino::RubyObject do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@class = Class.new
|
7
|
+
@instance = @class.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it "can call public locally defined ruby methods" do
|
11
|
+
class_eval do
|
12
|
+
def voo
|
13
|
+
"doo"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
eval("o.voo").should_not be_nil
|
17
|
+
eval("o.voo()").should == "doo"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "translates ruby naming conventions into javascript naming conventions, but you can still access them by their original names" do
|
21
|
+
class_eval do
|
22
|
+
def my_special_method
|
23
|
+
"hello"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
eval("o.mySpecialMethod").should_not be_nil
|
27
|
+
eval("o.mySpecialMethod()").should == "hello"
|
28
|
+
eval("o.my_special_method").should_not be_nil
|
29
|
+
eval("o.my_special_method()").should == "hello"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "hides methods not defined directly on this instance's class" do
|
33
|
+
class_eval do
|
34
|
+
def bar
|
35
|
+
end
|
36
|
+
end
|
37
|
+
eval("o.to_s").should be_nil
|
38
|
+
end
|
39
|
+
|
40
|
+
it "translated camel case properties are enumerated by default, but perl case are not"
|
41
|
+
|
42
|
+
it "will see a method that appears after the wrapper was first created" do
|
43
|
+
Rhino::Context.open do |cxt|
|
44
|
+
cxt['o'] = @instance
|
45
|
+
class_eval do
|
46
|
+
def bar
|
47
|
+
"baz!"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
cxt.eval("o.bar").should_not be_nil
|
51
|
+
cxt.eval("o.bar()").should == "baz!"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it "allows you to specify which methods should be treated as properties"
|
56
|
+
|
57
|
+
|
58
|
+
def eval(str)
|
59
|
+
Rhino::Context.open do |cxt|
|
60
|
+
cxt['o'] = @instance
|
61
|
+
cxt.eval(str)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def class_eval(&body)
|
66
|
+
@class.class_eval &body
|
67
|
+
end
|
68
|
+
end
|
data/spec/rhino/wormhole_spec.rb
CHANGED
@@ -8,7 +8,7 @@ describe Rhino::To do
|
|
8
8
|
To.ruby(J::Scriptable::NOT_FOUND).should be_nil
|
9
9
|
end
|
10
10
|
|
11
|
-
it "
|
11
|
+
it "converts javascript arrays to ruby arrays" do
|
12
12
|
J::NativeObject.new.tap do |o|
|
13
13
|
To.ruby(o).tap do |ruby_object|
|
14
14
|
ruby_object.should respond_to(:j)
|
@@ -17,6 +17,33 @@ describe Rhino::To do
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
it "wraps native javascript arrays into a ruby NativeArray wrapper" do
|
21
|
+
J::NativeArray.new([1,2,4].to_java).tap do |a|
|
22
|
+
To.ruby(a).should == [1,2,4]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "wraps native javascript functions into a ruby NativeFunction wrapper" do
|
27
|
+
|
28
|
+
c = Class.new(J::BaseFunction).class_eval do
|
29
|
+
self.tap do
|
30
|
+
def call(cxt, scope, this, args)
|
31
|
+
args.join(',')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
c.new.tap do |f|
|
37
|
+
To.ruby(f).tap do |o|
|
38
|
+
o.should_not be_nil
|
39
|
+
o.should be_kind_of(NativeObject)
|
40
|
+
o.should be_respond_to(:call)
|
41
|
+
o.call(1,2,3).should == "1,2,3"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
20
47
|
it "leaves native ruby objects alone" do
|
21
48
|
Object.new.tap do |o|
|
22
49
|
To.ruby(o).should be(o)
|
@@ -40,6 +67,15 @@ describe Rhino::To do
|
|
40
67
|
end
|
41
68
|
|
42
69
|
describe "javascript translation" do
|
70
|
+
|
71
|
+
it "passes primitives through to the js layer to let jruby and rhino do he thunking" do
|
72
|
+
to(1).should be(1)
|
73
|
+
to(2.5).should == 2.5
|
74
|
+
to("foo").should == "foo"
|
75
|
+
to(true).should be(true)
|
76
|
+
to(false).should be(false)
|
77
|
+
end
|
78
|
+
|
43
79
|
it "unwraps wrapped ruby objects before passing them to the javascript runtime" do
|
44
80
|
J::NativeObject.new.tap do |o|
|
45
81
|
To.javascript(NativeObject.new(o)).should be(o)
|
@@ -51,6 +87,27 @@ describe Rhino::To do
|
|
51
87
|
To.javascript(o).should be(o)
|
52
88
|
end
|
53
89
|
end
|
90
|
+
|
91
|
+
it "converts ruby arrays into javascript arrays" do
|
92
|
+
To.javascript([1,2,3,4,5]).tap do |a|
|
93
|
+
a.should be_kind_of(J::NativeArray)
|
94
|
+
a.get(0,a).should be(1)
|
95
|
+
a.get(1,a).should be(2)
|
96
|
+
a.get(2,a).should be(3)
|
97
|
+
a.get(3,a).should be(4)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
it "converts procs and methods into native functions" do
|
102
|
+
to(lambda {|lhs,rhs| lhs * rhs}).tap do |f|
|
103
|
+
f.should be_kind_of(J::Function)
|
104
|
+
f.call(nil, nil, nil, [7,6]).should be(42)
|
105
|
+
end
|
106
|
+
to("foo,bar,baz".method(:split)).tap do |m|
|
107
|
+
m.should be_kind_of(J::Function)
|
108
|
+
To.ruby(m.call(nil, nil, nil, ',')).should == ['foo', 'bar', 'baz']
|
109
|
+
end
|
110
|
+
end
|
54
111
|
|
55
112
|
it "creates a prototype for the object based on its class" do
|
56
113
|
Class.new.tap do |c|
|
@@ -71,4 +128,8 @@ describe Rhino::To do
|
|
71
128
|
end
|
72
129
|
end
|
73
130
|
end
|
131
|
+
|
132
|
+
def to(object)
|
133
|
+
To.javascript(object)
|
134
|
+
end
|
74
135
|
end
|
data/therubyrhino.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{therubyrhino}
|
5
|
-
s.version = "1.72.
|
5
|
+
s.version = "1.72.4"
|
6
6
|
s.platform = %q{jruby}
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.description = %q{Embed the Mozilla Rhino Javascript interpreter into Ruby}
|
12
12
|
s.email = ["cowboyd@thefrontside.net"]
|
13
13
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt"]
|
14
|
-
s.files = ["History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "lib/rhino.rb", "lib/rhino/context.rb", "lib/rhino/java.rb", "lib/rhino/native_object.rb", "lib/rhino/rhino-1.7R2.jar", "lib/rhino/
|
14
|
+
s.files = ["History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "lib/rhino.rb", "lib/rhino/context.rb", "lib/rhino/java.rb", "lib/rhino/native_function.rb", "lib/rhino/native_object.rb", "lib/rhino/rhino-1.7R2.jar", "lib/rhino/ruby_function.rb", "lib/rhino/ruby_object.rb", "lib/rhino/wormhole.rb", "script/console", "script/destroy", "script/generate", "spec/rhino/context_spec.rb", "spec/rhino/native_object_spec.rb", "spec/rhino/ruby_object_spec.rb", "spec/rhino/wormhole_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/jruby.rake", "tasks/rspec.rake", "therubyrhino.gemspec"]
|
15
15
|
s.homepage = %q{http://github.com/cowboyd/therubyrhino}
|
16
16
|
s.rdoc_options = ["--main", "README.rdoc"]
|
17
17
|
s.require_paths = ["lib"]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: therubyrhino
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.72.
|
4
|
+
version: 1.72.4
|
5
5
|
platform: jruby
|
6
6
|
authors:
|
7
7
|
- Charles Lowell
|
@@ -40,8 +40,10 @@ files:
|
|
40
40
|
- lib/rhino.rb
|
41
41
|
- lib/rhino/context.rb
|
42
42
|
- lib/rhino/java.rb
|
43
|
+
- lib/rhino/native_function.rb
|
43
44
|
- lib/rhino/native_object.rb
|
44
45
|
- lib/rhino/rhino-1.7R2.jar
|
46
|
+
- lib/rhino/ruby_function.rb
|
45
47
|
- lib/rhino/ruby_object.rb
|
46
48
|
- lib/rhino/wormhole.rb
|
47
49
|
- script/console
|
@@ -49,6 +51,7 @@ files:
|
|
49
51
|
- script/generate
|
50
52
|
- spec/rhino/context_spec.rb
|
51
53
|
- spec/rhino/native_object_spec.rb
|
54
|
+
- spec/rhino/ruby_object_spec.rb
|
52
55
|
- spec/rhino/wormhole_spec.rb
|
53
56
|
- spec/spec.opts
|
54
57
|
- spec/spec_helper.rb
|