node_module 0.1.1 → 0.1.2

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/lib/node_module.rb CHANGED
@@ -10,6 +10,20 @@ module NodeModule
10
10
  base.extend ClassMethods
11
11
  end
12
12
 
13
+ def self.js_context
14
+ @ctx ||= V8::Context.new do |ctx|
15
+ ctx.eval Opal::Builder.build('opal')
16
+ end
17
+ end
18
+
19
+ def self.convert_method_to_javascript(fn)
20
+ NodeModule.js_context.eval Opal.parse(fn)
21
+ end
22
+
23
+ def self.call_javascript_function(name, args = [])
24
+ NodeModule.js_context.eval "Opal.Object['$#{name}'].apply(this, #{args.to_json})"
25
+ end
26
+
13
27
  module ClassMethods
14
28
  def node_module(*methods)
15
29
  if methods.empty?
@@ -22,21 +36,13 @@ module NodeModule
22
36
 
23
37
  module_function
24
38
 
25
- def self.eval_js(name, fn, args)
26
- @ctx ||= V8::Context.new do |ctx|
27
- ctx.eval Opal::Builder.build('opal')
28
- end
29
-
30
- @ctx.eval Opal.parse(fn)
31
- @ctx.eval "Opal.Object.$#{name}.apply(this, #{args.to_json})"
32
- end
33
-
34
39
  def self.execute_methods_as_javascript!(methods, receiver)
35
40
  methods.each do |name|
36
- fn = receiver.instance_method(name).to_ruby
41
+ meth = receiver.instance_method(name).to_ruby
42
+ NodeModule.convert_method_to_javascript(meth)
37
43
 
38
44
  receiver.send :define_method, name do |*args|
39
- NodeModule.eval_js(name, fn, args)
45
+ NodeModule.call_javascript_function(__method__, args)
40
46
  end
41
47
  end
42
48
  end
@@ -1,3 +1,3 @@
1
1
  module NodeModule
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -12,11 +12,46 @@ describe NodeModule do
12
12
  end
13
13
  end
14
14
 
15
- describe "#hello_you" do
15
+
16
+
17
+ describe "integration" do
16
18
  let(:test_class) { TestClass.new }
17
19
 
18
- it "should say 'hello' to all the people" do
20
+ it "says 'hello' to all the people" do
19
21
  test_class.hello_you("Sarah", "Jess").must_equal "hello Sarah, Jess"
20
22
  end
21
23
  end
24
+
25
+ describe "#convert_method_to_javascript" do
26
+ let(:test_method) { "def equal?(a, b); a == b; end;" }
27
+
28
+ it "successfully turns Ruby into Opal-style Javascript" do
29
+ js = NodeModule.convert_method_to_javascript(test_method)
30
+ js.to_s.must_match /function \(a, b\) \{\s+ return a\['\$=='\]\(b\);\s+\}/
31
+ end
32
+ end
33
+
34
+ describe "#call_javascript_function" do
35
+ let(:predicate_method) { "def equal?(a, b); a == b; end;" }
36
+ let(:bang_method) { "def boom!; 'BOOM!'; end;" }
37
+
38
+ before do
39
+ NodeModule.convert_method_to_javascript(predicate_method)
40
+ NodeModule.convert_method_to_javascript(bang_method)
41
+ end
42
+
43
+ it "handles Ruby style predicate methods" do
44
+ result = NodeModule.call_javascript_function('equal?', [1, 1])
45
+ result.must_equal true
46
+
47
+ result = NodeModule.call_javascript_function('equal?', [1, 2])
48
+ result.must_equal false
49
+ end
50
+
51
+ it "handles Ruby style bang methods" do
52
+ result = NodeModule.call_javascript_function('boom!')
53
+ result.must_equal 'BOOM!'
54
+ end
55
+ end
56
+
22
57
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: node_module
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -124,7 +124,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
124
124
  version: '0'
125
125
  segments:
126
126
  - 0
127
- hash: -2290275566948015265
127
+ hash: 3868735360214896728
128
128
  required_rubygems_version: !ruby/object:Gem::Requirement
129
129
  none: false
130
130
  requirements:
@@ -133,7 +133,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
133
  version: '0'
134
134
  segments:
135
135
  - 0
136
- hash: -2290275566948015265
136
+ hash: 3868735360214896728
137
137
  requirements: []
138
138
  rubyforge_project:
139
139
  rubygems_version: 1.8.23