h8 0.0.2 → 0.0.4
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.
- checksums.yaml +4 -4
- data/.gitignore +8 -0
- data/README.md +55 -2
- data/ext/h8/JsCatcher.cpp +24 -0
- data/ext/h8/JsCatcher.h +29 -0
- data/ext/h8/allocated_resource.h +37 -0
- data/ext/h8/chain.h +191 -0
- data/ext/h8/extconf.rb +48 -30
- data/ext/h8/h8.cpp +100 -8
- data/ext/h8/h8.h +109 -42
- data/ext/h8/js_gate.cpp +18 -0
- data/ext/h8/js_gate.h +70 -31
- data/ext/h8/main.cpp +69 -25
- data/ext/h8/object_wrap.h +1 -1
- data/ext/h8/ruby_gate.cpp +117 -0
- data/ext/h8/ruby_gate.h +118 -0
- data/hybrid8.gemspec +3 -1
- data/lib/h8.rb +61 -2
- data/lib/h8/context.rb +38 -5
- data/lib/h8/value.rb +104 -19
- data/lib/h8/version.rb +1 -1
- data/spec/context_spec.rb +42 -4
- data/spec/js_gate_spec.rb +95 -16
- data/spec/ruby_gate_spec.rb +159 -0
- data/spec/spec_helper.rb +31 -1
- metadata +15 -4
- data/ext/h8/ruby_wrap.h +0 -32
@@ -0,0 +1,159 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'h8'
|
3
|
+
|
4
|
+
describe 'ruby gate' do
|
5
|
+
|
6
|
+
it 'should gate callables' do
|
7
|
+
cxt = H8::Context.new
|
8
|
+
cxt[:fn] = -> (a, b) {
|
9
|
+
a + b
|
10
|
+
}
|
11
|
+
|
12
|
+
res = cxt.eval "fn(11, 22);"
|
13
|
+
res.to_i.should == 33
|
14
|
+
cxt = nil
|
15
|
+
res = nil
|
16
|
+
GC.start
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should gate callables with varargs' do
|
20
|
+
cxt = H8::Context.new
|
21
|
+
cxt[:fn] = -> (*args) {
|
22
|
+
args.reduce(0){|all,x| all+x }
|
23
|
+
}
|
24
|
+
|
25
|
+
cxt.eval('fn(11, 22, 100);').should == 133
|
26
|
+
GC.start
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should convert nil' do
|
30
|
+
cxt = H8::Context.new
|
31
|
+
cxt[:fn] = -> {
|
32
|
+
nil
|
33
|
+
}
|
34
|
+
cxt.eval('fn();').should == nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should pass through ruby objects across js code' do
|
38
|
+
class MyObject
|
39
|
+
attr :some_val
|
40
|
+
|
41
|
+
def initialize some_val
|
42
|
+
@some_val = some_val
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
cxt = H8::Context.new
|
47
|
+
cxt[:fn] = -> (a, b) {
|
48
|
+
MyObject.new(a+b)
|
49
|
+
}
|
50
|
+
|
51
|
+
res = cxt.eval "fn(11, 22);"
|
52
|
+
res.should be_kind_of(MyObject)
|
53
|
+
res.some_val.should == 33
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should properly pass exceptions via callables' do
|
57
|
+
class MyException < StandardError;
|
58
|
+
end
|
59
|
+
cxt = H8::Context.new
|
60
|
+
cxt[:fn] = -> (a, b) {
|
61
|
+
raise MyException, "Shit happens"
|
62
|
+
}
|
63
|
+
res = cxt.eval <<-End
|
64
|
+
var result = "bad";
|
65
|
+
try {
|
66
|
+
result = fn(11, 22);
|
67
|
+
}
|
68
|
+
catch(e) {
|
69
|
+
result = { code: 'caught!', exception: e, message: e.message };
|
70
|
+
}
|
71
|
+
result;
|
72
|
+
End
|
73
|
+
res.should_not == 'bad'
|
74
|
+
res.code.should == 'caught!'
|
75
|
+
res.message.should == 'ruby exception'
|
76
|
+
x = res.exception.source
|
77
|
+
x.should be_kind_of(MyException)
|
78
|
+
x.message.should == 'Shit happens'
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should pass through uncaught ruby exceptions' do
|
82
|
+
class MyException < StandardError;
|
83
|
+
end
|
84
|
+
cxt = H8::Context.new
|
85
|
+
# pending
|
86
|
+
cxt[:fn] = -> (a, b) {
|
87
|
+
raise MyException, "Shit happens"
|
88
|
+
}
|
89
|
+
expect(-> {
|
90
|
+
res = cxt.eval <<-End
|
91
|
+
result = fn(11, 22);
|
92
|
+
End
|
93
|
+
}).to raise_error(MyException) { |e|
|
94
|
+
e.message.should == 'Shit happens'
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should have information about javascript exceptions'
|
99
|
+
|
100
|
+
context 'accessing ruby code' do
|
101
|
+
class Base
|
102
|
+
def base
|
103
|
+
raise "It should not be called"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
class Test < Base
|
108
|
+
attr :ro
|
109
|
+
attr_accessor :rw
|
110
|
+
|
111
|
+
def initialize
|
112
|
+
@ro = 'readonly'
|
113
|
+
@rw = 'not initialized'
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_args *args
|
117
|
+
args.join('-')
|
118
|
+
end
|
119
|
+
|
120
|
+
protected
|
121
|
+
|
122
|
+
def prot_method
|
123
|
+
raise 'should not be called'
|
124
|
+
end
|
125
|
+
|
126
|
+
private
|
127
|
+
|
128
|
+
def priv_method
|
129
|
+
raise 'should not be called'
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'should access object properties and methods' do
|
135
|
+
cxt = H8::Context.new
|
136
|
+
cxt[:foo] = Test.new
|
137
|
+
cxt.eval('foo.ro').should == 'readonly'
|
138
|
+
cxt.eval('foo.rw').should == 'not initialized'
|
139
|
+
cxt.eval('foo.base').should == H8::Undefined
|
140
|
+
cxt.eval('foo.send').should == H8::Undefined
|
141
|
+
cxt.eval('foo.prot_method').should == H8::Undefined
|
142
|
+
cxt.eval('foo.priv_method').should == H8::Undefined
|
143
|
+
cxt.eval('foo.test_args').should be_kind_of(Proc)
|
144
|
+
cxt.eval('foo.test_args("hi", "you")').should == 'hi-you'
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'should set ruby properties' do
|
148
|
+
cxt = H8::Context.new
|
149
|
+
cxt[:foo] = t = Test.new
|
150
|
+
cxt.eval('foo.rw="hello";')
|
151
|
+
t.rw.should == 'hello'
|
152
|
+
cxt.eval('foo.rw').should == 'hello'
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'should gate classes'
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'should retain ruby objects'
|
159
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
#
|
6
6
|
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
7
|
RSpec.configure do |config|
|
8
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
8
|
+
# config.treat_symbols_as_metadata_keys_with_true_values = true
|
9
9
|
config.run_all_when_everything_filtered = true
|
10
10
|
config.filter_run :focus
|
11
11
|
|
@@ -14,4 +14,34 @@ RSpec.configure do |config|
|
|
14
14
|
# the seed, which is printed after each run.
|
15
15
|
# --seed 1234
|
16
16
|
config.order = 'random'
|
17
|
+
|
18
|
+
config.expect_with :rspec do |expectations|
|
19
|
+
# This option will default to `true` in RSpec 4. It makes the `description`
|
20
|
+
# and `failure_message` of custom matchers include text for helper methods
|
21
|
+
# defined using `chain`, e.g.:
|
22
|
+
# be_bigger_than(2).and_smaller_than(4).description
|
23
|
+
# # => "be bigger than 2 and smaller than 4"
|
24
|
+
# ...rather than:
|
25
|
+
# # => "be bigger than 2"
|
26
|
+
expectations.syntax = [:should, :expect]
|
27
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
def true.true?
|
33
|
+
true
|
34
|
+
end
|
35
|
+
|
36
|
+
def true.false?
|
37
|
+
false
|
17
38
|
end
|
39
|
+
|
40
|
+
def false.true?
|
41
|
+
false
|
42
|
+
end
|
43
|
+
|
44
|
+
def false.false?
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: h8
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sergeych
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 2.14.0
|
69
|
-
description: 'Should be more or less replacement for broken therubyracer gem and
|
69
|
+
description: 'Should be more or less replacement for broken therubyracer gem and ruby
|
70
70
|
2.1+ '
|
71
71
|
email:
|
72
72
|
- real.sergeych@gmail.com
|
@@ -81,13 +81,22 @@ files:
|
|
81
81
|
- LICENSE.txt
|
82
82
|
- README.md
|
83
83
|
- Rakefile
|
84
|
+
- ext/.DS_Store
|
85
|
+
- ext/h8/.cproject
|
86
|
+
- ext/h8/.project
|
87
|
+
- ext/h8/JsCatcher.cpp
|
88
|
+
- ext/h8/JsCatcher.h
|
89
|
+
- ext/h8/allocated_resource.h
|
90
|
+
- ext/h8/chain.h
|
84
91
|
- ext/h8/extconf.rb
|
85
92
|
- ext/h8/h8.cpp
|
86
93
|
- ext/h8/h8.h
|
94
|
+
- ext/h8/js_gate.cpp
|
87
95
|
- ext/h8/js_gate.h
|
88
96
|
- ext/h8/main.cpp
|
89
97
|
- ext/h8/object_wrap.h
|
90
|
-
- ext/h8/
|
98
|
+
- ext/h8/ruby_gate.cpp
|
99
|
+
- ext/h8/ruby_gate.h
|
91
100
|
- hybrid8.gemspec
|
92
101
|
- lib/h8.rb
|
93
102
|
- lib/h8/context.rb
|
@@ -95,6 +104,7 @@ files:
|
|
95
104
|
- lib/h8/version.rb
|
96
105
|
- spec/context_spec.rb
|
97
106
|
- spec/js_gate_spec.rb
|
107
|
+
- spec/ruby_gate_spec.rb
|
98
108
|
- spec/spec_helper.rb
|
99
109
|
homepage: ''
|
100
110
|
licenses:
|
@@ -124,4 +134,5 @@ summary: Minimalistic and sane v8 bindings
|
|
124
134
|
test_files:
|
125
135
|
- spec/context_spec.rb
|
126
136
|
- spec/js_gate_spec.rb
|
137
|
+
- spec/ruby_gate_spec.rb
|
127
138
|
- spec/spec_helper.rb
|
data/ext/h8/ruby_wrap.h
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
#ifndef __ruby_gate_h
|
2
|
-
#define __ruby_gate_h
|
3
|
-
|
4
|
-
#include "h8.h"
|
5
|
-
#include "object_wrap.h"
|
6
|
-
|
7
|
-
namespace h8 {
|
8
|
-
|
9
|
-
class RubyWrap : public ObjectWrap {
|
10
|
-
public:
|
11
|
-
|
12
|
-
RubyWrap(H8* ctx) : context(ctx) {
|
13
|
-
ctx->registerWrap(this);
|
14
|
-
}
|
15
|
-
|
16
|
-
public void setRubyInstance(VALUE instance) {
|
17
|
-
this->instance = instance;
|
18
|
-
}
|
19
|
-
|
20
|
-
virtual ~RubyWrap() {
|
21
|
-
context->unregisterWrap(this);
|
22
|
-
}
|
23
|
-
|
24
|
-
private:
|
25
|
-
H8 *context;
|
26
|
-
VALUE instance = Qnil;
|
27
|
-
|
28
|
-
};
|
29
|
-
}
|
30
|
-
|
31
|
-
|
32
|
-
#endif
|