h8 0.2.2 → 0.2.3
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/README.md +3 -2
- data/benchmark/big.txt +121706 -0
- data/benchmark/knightsmove.coffee +48 -0
- data/benchmark/knigthsmove.rb +70 -0
- data/benchmark/process_text.coffee +12 -0
- data/benchmark/text_process.rb +51 -0
- data/benchmark/tools.rb +21 -0
- data/bin/h8 +12 -0
- data/ext/h8/h8.cpp +4 -2
- data/ext/h8/h8.h +8 -3
- data/ext/h8/js_gate.h +25 -1
- data/ext/h8/main.cpp +12 -5
- data/ext/h8/object_wrap.h +96 -102
- data/ext/h8/ruby_gate.cpp +0 -1
- data/ext/h8/ruby_gate.h +5 -3
- data/lib/h8/coffee.rb +19 -3
- data/lib/h8/command.rb +128 -0
- data/lib/h8/context.rb +14 -21
- data/lib/h8/errors.rb +9 -8
- data/lib/h8/pargser.rb +133 -0
- data/lib/h8/version.rb +1 -1
- data/lib/{h8 → scripts}/coffee-script.js +0 -0
- data/lib/scripts/globals.coffee +4 -0
- data/spec/coffee/cli_tests.coffee +50 -0
- data/spec/coffee_spec.rb +50 -0
- data/spec/command_spec.rb +72 -0
- data/spec/context_spec.rb +21 -1
- data/spec/js_gate_spec.rb +53 -1
- data/spec/pargser_spec.rb +67 -0
- data/spec/ruby_gate_spec.rb +17 -0
- metadata +21 -4
data/spec/coffee_spec.rb
CHANGED
@@ -23,6 +23,56 @@ describe 'coffeescript' do
|
|
23
23
|
H8::Coffee.eval(Cs_0).should == Res_0
|
24
24
|
H8::Context.eval(H8::Coffee.compile Cs_0).should == Res_0
|
25
25
|
H8::Context.eval(H8::Coffee.compile Cs_0).should == Res_0
|
26
|
+
H8::Context.new.coffee(Cs_0).should == Res_0
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should report syntax errors' do
|
30
|
+
script = <<-END
|
31
|
+
# Started: ok
|
32
|
+
square = (x) -> x*x
|
33
|
+
# so far so good but then...
|
34
|
+
baljkhl9399-^&
|
35
|
+
# above is bad
|
36
|
+
END
|
37
|
+
# pending
|
38
|
+
expect(->{
|
39
|
+
H8::Coffee.compile script, file_name: 'test.coffee'
|
40
|
+
}).to raise_error(H8::JsError) { |e| e.to_s.should =~ /test.coffee\:4/ }
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should report exceptions' do
|
44
|
+
src = <<-END
|
45
|
+
fnb = ->
|
46
|
+
throw new Error 'lets check'
|
47
|
+
fna = ->
|
48
|
+
fnb()
|
49
|
+
CoffeeScript.getSourceMap = (name) ->
|
50
|
+
puts "DUMMUY \#{name}"
|
51
|
+
undefined
|
52
|
+
|
53
|
+
# fna()
|
54
|
+
puts globalsIncluded
|
55
|
+
END
|
56
|
+
script = <<-END
|
57
|
+
function require(name) {
|
58
|
+
puts("REQ! "+name);
|
59
|
+
}
|
60
|
+
var res = CoffeeScript.compile(src, {sourceMap: true, filename: 'inner.coffee'});
|
61
|
+
//var sourceMaps = { 'inner.coffee' : res.sourceMap }
|
62
|
+
// puts("Compiled ok",JSON.stringify(CoffeeScript.sourceMaps));
|
63
|
+
// CoffeeScript.sourceMaps['inner'] = res.sourceMap
|
64
|
+
eval(res.js);
|
65
|
+
END
|
66
|
+
cxt = H8::Coffee.new.context
|
67
|
+
cxt[:puts] = -> (*args) { puts args.join(' ') }
|
68
|
+
cxt[:src] = src
|
69
|
+
# cxt[:src] = 'return "hello"'
|
70
|
+
begin
|
71
|
+
res = cxt.eval script, file_name: 'extest.coffee'
|
72
|
+
p res
|
73
|
+
rescue Exception=>e
|
74
|
+
puts e
|
75
|
+
end
|
26
76
|
end
|
27
77
|
|
28
78
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'h8/command'
|
3
|
+
require 'stringio'
|
4
|
+
|
5
|
+
describe 'cli' do
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@out = StringIO.new '', 'w'
|
9
|
+
@err = StringIO.new '', 'w'
|
10
|
+
@command = H8::Command.new out: @out, err: @err
|
11
|
+
end
|
12
|
+
|
13
|
+
def output
|
14
|
+
@out.string
|
15
|
+
end
|
16
|
+
|
17
|
+
def errors
|
18
|
+
@err.string
|
19
|
+
end
|
20
|
+
|
21
|
+
def run *args
|
22
|
+
@out.string = ''
|
23
|
+
@err.string = ''
|
24
|
+
@command.run *(['-e'] + args)
|
25
|
+
output
|
26
|
+
end
|
27
|
+
|
28
|
+
def make_path *path_components
|
29
|
+
File.expand_path(File.join(File.dirname(__FILE__), *path_components))
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should print usage' do
|
33
|
+
expect(-> { @command.run }).to raise_error(RuntimeError, "Must provide at least one file")
|
34
|
+
expect(@command.usage =~ /Usage:/).to be_truthy
|
35
|
+
# puts @command.usage
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should print' do
|
39
|
+
run 'print "hello"; console.log "world"; console.error "life sucks!"'
|
40
|
+
output.should == "hello\nworld\n"
|
41
|
+
errors.should == "life sucks!\n"
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should read files' do
|
45
|
+
path = make_path '../lib/h8/coffee-script.js'
|
46
|
+
length = "#{open(path).read.length}\n"
|
47
|
+
run("print open('#{path}').read().length").should == length
|
48
|
+
run("open('#{path}', 'r', (f) -> puts (" "+f.read().length) )").should == length
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should run tests' do
|
52
|
+
begin
|
53
|
+
@command.run make_path('coffee/cli_tests.coffee')
|
54
|
+
rescue
|
55
|
+
puts "Error: #{$!}\n#{$!.backtrace.join("\n")}"
|
56
|
+
end
|
57
|
+
log = @out.string.lines
|
58
|
+
failed = log[-1] !~ /All tests passed/
|
59
|
+
err = @err.string.strip
|
60
|
+
if err != ''
|
61
|
+
puts '----------- Tests Error output ---------------'
|
62
|
+
puts @err.string
|
63
|
+
end
|
64
|
+
if log.length > 1
|
65
|
+
puts '---------------- Tests output --------------------'
|
66
|
+
puts log[0..-2].join('')
|
67
|
+
puts '--------------- End tests output -----------------'
|
68
|
+
end
|
69
|
+
failed and fail 'cli_tests.coffee failed'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
data/spec/context_spec.rb
CHANGED
@@ -94,6 +94,27 @@ describe 'context' do
|
|
94
94
|
c.eval script
|
95
95
|
end
|
96
96
|
|
97
|
+
it 'should have coffee generators' do
|
98
|
+
script = <<-End
|
99
|
+
f = (base) ->
|
100
|
+
count = base;
|
101
|
+
end = base + 3;
|
102
|
+
print "F is calleed, \#{count}"
|
103
|
+
while count < end
|
104
|
+
r = yield count++
|
105
|
+
# print "yield returned \#{r}"
|
106
|
+
print 'we try'
|
107
|
+
g = f(100)
|
108
|
+
print g.next().value
|
109
|
+
print g.next().value
|
110
|
+
print g.next().value
|
111
|
+
print g.next().value
|
112
|
+
End
|
113
|
+
c = H8::Context.new
|
114
|
+
c[:print] = -> (*args) { args.join(' ') }
|
115
|
+
c.coffee script
|
116
|
+
end
|
117
|
+
|
97
118
|
it 'should work in many threads' do
|
98
119
|
# pending
|
99
120
|
sum = 0
|
@@ -125,5 +146,4 @@ describe 'context' do
|
|
125
146
|
}
|
126
147
|
end
|
127
148
|
|
128
|
-
|
129
149
|
end
|
data/spec/js_gate_spec.rb
CHANGED
@@ -83,6 +83,44 @@ describe 'js_gate' do
|
|
83
83
|
obj.foo.should == 'bar'
|
84
84
|
end
|
85
85
|
|
86
|
+
it 'should keep alive references to js objects' do
|
87
|
+
cxt = H8::Context.new
|
88
|
+
jobj = cxt.eval 'var obj={foo: "bar"}; obj;'
|
89
|
+
jobj.foo.should == 'bar'
|
90
|
+
cxt.eval 'var obj = {foo: "buzz"};'
|
91
|
+
GC.start
|
92
|
+
cxt.javascript_gc()
|
93
|
+
jobj.foo.should == 'bar'
|
94
|
+
jobj.foo.should == 'bar'
|
95
|
+
wobj = WeakRef.new jobj
|
96
|
+
jobj = nil
|
97
|
+
GC.start
|
98
|
+
expect(wobj.weakref_alive?).not_to be_truthy
|
99
|
+
cxt.javascript_gc()
|
100
|
+
cxt = nil
|
101
|
+
GC.start
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'should keep alive references to ruby objects' do
|
105
|
+
robj = 4096.times.map { |n| "-- #{n} --"}
|
106
|
+
wobj = WeakRef.new robj
|
107
|
+
cxt = H8::Context.new
|
108
|
+
cxt[:obj] = robj
|
109
|
+
GC.start
|
110
|
+
cxt.javascript_gc
|
111
|
+
expect(wobj.weakref_alive?).to be_truthy
|
112
|
+
robj = nil
|
113
|
+
GC.start
|
114
|
+
cxt.javascript_gc
|
115
|
+
expect(wobj.weakref_alive?).to be_truthy
|
116
|
+
cxt.eval 'obj = null;'
|
117
|
+
cxt[:obj] = 'nope'
|
118
|
+
cxt.javascript_gc
|
119
|
+
GC.start
|
120
|
+
# pending # Why weakref is not freeed here?
|
121
|
+
# expect(wobj.weakref_alive?).to be_falsey
|
122
|
+
end
|
123
|
+
|
86
124
|
it 'should convert simple types to ruby' do
|
87
125
|
res = H8::Context.eval("({ 'foo': 'bar', 'bar': 122, pi: 3.1415 });")
|
88
126
|
r = res.foo.to_ruby
|
@@ -189,7 +227,21 @@ describe 'js_gate' do
|
|
189
227
|
expect(-> {
|
190
228
|
res.doAdd(10, 1).should == 111
|
191
229
|
}).to raise_error(H8::JsError) { |e|
|
192
|
-
e.message.should
|
230
|
+
e.message.should =~ /Test error/
|
231
|
+
}
|
232
|
+
end
|
233
|
+
|
234
|
+
it 'should properly show syntax errors' do
|
235
|
+
script = <<-End
|
236
|
+
// Good line
|
237
|
+
var x = 112;
|
238
|
+
kjljl44; // bad line
|
239
|
+
122; // good line
|
240
|
+
End
|
241
|
+
expect(->{
|
242
|
+
H8::Context.new.eval script, file_name: 'test.js'
|
243
|
+
}).to raise_error(H8::JsError) { |e|
|
244
|
+
e.message.should =~ /at test\.js\:3\:7/
|
193
245
|
}
|
194
246
|
end
|
195
247
|
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'h8'
|
3
|
+
require 'h8/pargser'
|
4
|
+
|
5
|
+
describe 'pargser' do
|
6
|
+
|
7
|
+
it 'should parse keys' do
|
8
|
+
parser = H8::Pargser.new "-a -b -v value! other data".split
|
9
|
+
parser.key('-a', doc: 'flag to perform a action') {
|
10
|
+
@a_called = true
|
11
|
+
}
|
12
|
+
.key('-c', '-b') {
|
13
|
+
@b_called = true
|
14
|
+
}
|
15
|
+
.key('--some', default: 'test') { |v|
|
16
|
+
@defvalue = v
|
17
|
+
}
|
18
|
+
.key('-v', needs_value: true) { |v|
|
19
|
+
@v = v
|
20
|
+
}
|
21
|
+
expect(-> { parser.key('-a') }).to raise_error(H8::Pargser::Error)
|
22
|
+
|
23
|
+
passed = []
|
24
|
+
rest = parser.parse { |a| passed << a }
|
25
|
+
rest.should == passed
|
26
|
+
rest.should == ['other', 'data']
|
27
|
+
|
28
|
+
@a_called.should be_truthy
|
29
|
+
@b_called.should be_true
|
30
|
+
@v.should == 'value!'
|
31
|
+
@defvalue.should == 'test'
|
32
|
+
|
33
|
+
doc = "\t-a\n\t\tflag to perform a action\n\t-c,-b\n\t--some value (default: test)\n\t-v value (optional)"
|
34
|
+
parser.keys_doc.should == doc
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should detect required keys' do
|
38
|
+
parser = H8::Pargser.new ['hello']
|
39
|
+
parser.key('-c', needs_value: true) {}
|
40
|
+
expect(-> { parser.parse }).to raise_error(H8::Pargser::Error, 'Required key is missing: -c')
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should detect strange keys' do
|
44
|
+
parser = H8::Pargser.new '-l hello'.split
|
45
|
+
expect(->{ parser.parse }).to raise_error(H8::Pargser::Error, 'Unknown key -l')
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should pass data that looks like keys' do
|
49
|
+
res = H8::Pargser.new('-- -a --b'.split).parse
|
50
|
+
res.should == ['-a', '--b']
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should provide empty defaults' do
|
54
|
+
parser = H8::Pargser.new('hello'.split)
|
55
|
+
@t == 'wrong'
|
56
|
+
parser.key('-t', default: nil) { |val|
|
57
|
+
@t = val
|
58
|
+
}
|
59
|
+
parser.key('-q', default: false) { |val|
|
60
|
+
@q = val
|
61
|
+
}
|
62
|
+
parser.parse.should == ['hello']
|
63
|
+
@t.should == nil
|
64
|
+
@q.should == false
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
data/spec/ruby_gate_spec.rb
CHANGED
@@ -66,8 +66,24 @@ describe 'ruby gate' do
|
|
66
66
|
nil
|
67
67
|
}
|
68
68
|
cxt.eval('fn();').should == nil
|
69
|
+
cxt.eval('""+fn()').should == 'null'
|
69
70
|
end
|
70
71
|
|
72
|
+
it 'should convert strings to native string' do
|
73
|
+
cxt = H8::Context.new
|
74
|
+
cxt[:str] = src = "Пример строки"
|
75
|
+
res = 'ПРИМЕР СТРОКИ'
|
76
|
+
cxt.eval('str.toLocaleUpperCase()').should == res
|
77
|
+
up = cxt.eval('fn = function(t) { return t.toLocaleUpperCase(); }')
|
78
|
+
up.call(src).should == res
|
79
|
+
end
|
80
|
+
|
81
|
+
# it 'should convert arrays' do
|
82
|
+
# cxt = H8::Context.new
|
83
|
+
# cxt[:arr] = [1,100,2,200]
|
84
|
+
# p cxt.eval('typeof arr')
|
85
|
+
# end
|
86
|
+
|
71
87
|
it 'should pass through ruby objects across js code' do
|
72
88
|
class MyObject
|
73
89
|
attr :some_val
|
@@ -150,6 +166,7 @@ describe 'ruby gate' do
|
|
150
166
|
e.name.should == 'Error'
|
151
167
|
e.message.should =~ /test/
|
152
168
|
e.javascript_backtrace.should =~ /at bad \(eval\:4\:17\)/
|
169
|
+
e.to_s.should =~ /at bad \(eval\:4\:17\)/
|
153
170
|
end
|
154
171
|
end
|
155
172
|
|
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.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sergeych
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -72,7 +72,8 @@ description: |2
|
|
72
72
|
integration where objects can be passed between different languages several times.
|
73
73
|
email:
|
74
74
|
- real.sergeych@gmail.com
|
75
|
-
executables:
|
75
|
+
executables:
|
76
|
+
- h8
|
76
77
|
extensions:
|
77
78
|
- ext/h8/extconf.rb
|
78
79
|
extra_rdoc_files: []
|
@@ -83,6 +84,13 @@ files:
|
|
83
84
|
- LICENSE.txt
|
84
85
|
- README.md
|
85
86
|
- Rakefile
|
87
|
+
- benchmark/big.txt
|
88
|
+
- benchmark/knightsmove.coffee
|
89
|
+
- benchmark/knigthsmove.rb
|
90
|
+
- benchmark/process_text.coffee
|
91
|
+
- benchmark/text_process.rb
|
92
|
+
- benchmark/tools.rb
|
93
|
+
- bin/h8
|
86
94
|
- ext/.DS_Store
|
87
95
|
- ext/h8/.cproject
|
88
96
|
- ext/h8/.project
|
@@ -101,16 +109,22 @@ files:
|
|
101
109
|
- ext/h8/ruby_gate.h
|
102
110
|
- hybrid8.gemspec
|
103
111
|
- lib/h8.rb
|
104
|
-
- lib/h8/coffee-script.js
|
105
112
|
- lib/h8/coffee.rb
|
113
|
+
- lib/h8/command.rb
|
106
114
|
- lib/h8/context.rb
|
107
115
|
- lib/h8/errors.rb
|
116
|
+
- lib/h8/pargser.rb
|
108
117
|
- lib/h8/tools.rb
|
109
118
|
- lib/h8/value.rb
|
110
119
|
- lib/h8/version.rb
|
120
|
+
- lib/scripts/coffee-script.js
|
121
|
+
- lib/scripts/globals.coffee
|
122
|
+
- spec/coffee/cli_tests.coffee
|
111
123
|
- spec/coffee_spec.rb
|
124
|
+
- spec/command_spec.rb
|
112
125
|
- spec/context_spec.rb
|
113
126
|
- spec/js_gate_spec.rb
|
127
|
+
- spec/pargser_spec.rb
|
114
128
|
- spec/ruby_gate_spec.rb
|
115
129
|
- spec/spec_helper.rb
|
116
130
|
- spec/threading_spec.rb
|
@@ -140,9 +154,12 @@ signing_key:
|
|
140
154
|
specification_version: 4
|
141
155
|
summary: Minimalistic and fast Ruby <--> V8 integration
|
142
156
|
test_files:
|
157
|
+
- spec/coffee/cli_tests.coffee
|
143
158
|
- spec/coffee_spec.rb
|
159
|
+
- spec/command_spec.rb
|
144
160
|
- spec/context_spec.rb
|
145
161
|
- spec/js_gate_spec.rb
|
162
|
+
- spec/pargser_spec.rb
|
146
163
|
- spec/ruby_gate_spec.rb
|
147
164
|
- spec/spec_helper.rb
|
148
165
|
- spec/threading_spec.rb
|