em_remote_call 0.0.3 → 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.
- data/lib/em_remote_call/client.rb +22 -34
- data/lib/em_remote_call/server.rb +22 -21
- data/lib/em_remote_call/version.rb +1 -1
- data/spec/integration_spec.rb +11 -7
- metadata +3 -3
@@ -10,35 +10,32 @@ module EM::RemoteCall
|
|
10
10
|
define_method name do |*method_opts, &callb|
|
11
11
|
return unless self.class.remote_connection
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
end
|
16
|
-
if method_opts.last.is_a? Proc
|
17
|
-
return_block = method_opts.pop
|
18
|
-
end
|
19
|
-
argument = method_opts.shift
|
13
|
+
callback = EM::RemoteCall::Deferrable.new
|
14
|
+
callback.callback(&callb) if callb
|
20
15
|
|
21
|
-
|
22
|
-
|
23
|
-
|
16
|
+
call = {
|
17
|
+
:argument => method_opts.first, # evt. other args will get dropped
|
18
|
+
:instance => {
|
19
|
+
:class => opts[:class_name] || self.class.to_s, # own class name by default
|
20
|
+
:id => opts[:find_by] && send(opts[:find_by]) # when it's nil, it's considered a class method.
|
21
|
+
},
|
22
|
+
:method => opts[:calls] || name, # same method name by default
|
23
|
+
:deferrable_id => callback.object_id # store the callbacks object_id to retrieve it later
|
24
|
+
}
|
24
25
|
|
25
|
-
call
|
26
|
-
|
26
|
+
self.class.remote_connection.call call
|
27
|
+
return callback
|
27
28
|
end
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
|
-
class EM::RemoteCall::
|
32
|
+
class EM::RemoteCall::Deferrable
|
33
|
+
include EventMachine::Deferrable
|
32
34
|
is_a_collection :object_id
|
33
35
|
|
34
|
-
def
|
35
|
-
@callback = callb
|
36
|
-
super
|
37
|
-
end
|
38
|
-
|
39
|
-
def call(arg)
|
40
|
-
@callback.call arg
|
36
|
+
def set_deferred_status status, *args
|
41
37
|
remove_from_collection
|
38
|
+
super
|
42
39
|
end
|
43
40
|
end
|
44
41
|
|
@@ -46,22 +43,13 @@ module EM::RemoteCall::Client
|
|
46
43
|
include EM::JsonConnection::Client
|
47
44
|
|
48
45
|
def json_parsed(hash)
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
46
|
+
id = hash[:deferrable_id]
|
47
|
+
deffr = EM::RemoteCall::Deferrable.find(id)
|
48
|
+
deffr.succeed hash[:success] if hash.has_key? :success
|
49
|
+
deffr.fail hash[:error] if hash.has_key? :error
|
54
50
|
end
|
55
51
|
|
56
|
-
def call(call
|
57
|
-
if callb
|
58
|
-
callb = EM::RemoteCall::Callback.new(&callb)
|
59
|
-
call.merge!({ :callback_id => callb.object_id })
|
60
|
-
end
|
61
|
-
if return_block
|
62
|
-
return_block = EM::RemoteCall::Callback.new(&return_block)
|
63
|
-
call.merge!({ :return_block_id => return_block.object_id })
|
64
|
-
end
|
52
|
+
def call(call)
|
65
53
|
send_data call
|
66
54
|
end
|
67
55
|
end
|
@@ -1,30 +1,28 @@
|
|
1
1
|
module EM::RemoteCall; end
|
2
2
|
|
3
3
|
class EM::RemoteCall::Call
|
4
|
+
class Error < StandardError; end
|
5
|
+
class NoInstanceError < Error ; end
|
6
|
+
class NoMethodGivenError < Error; end
|
7
|
+
class NoMethodOfInstanceError < Error; end
|
8
|
+
|
4
9
|
def initialize(instance_opts, method, argument)
|
5
|
-
|
6
|
-
|
7
|
-
@
|
8
|
-
|
9
|
-
if indentifier = instance_opts[:id]
|
10
|
-
klass = EM::RemoteCall::Utils.constantize(klass) or return false
|
11
|
-
@instance = klass.find(indentifier)
|
12
|
-
else
|
13
|
-
@instance = EM::RemoteCall::Utils.constantize(klass) or return false
|
14
|
-
end
|
15
|
-
|
10
|
+
@argument = argument
|
11
|
+
@method = method or raise NoMethodError.new method
|
12
|
+
@instance = find_instance(instance_opts) or raise NoInstanceError.new instance_opts
|
13
|
+
@instance.respond_to?(@method) or raise NoMethodOfInstanceError.new "#{@instance}##{method}"
|
16
14
|
end
|
17
15
|
|
18
|
-
def
|
19
|
-
|
16
|
+
def find_instance(args)
|
17
|
+
if args[:id]
|
18
|
+
klass = EM::RemoteCall::Utils.constantize(args[:class]) or return false
|
19
|
+
@instance = klass.find(args[:id]) or return false
|
20
|
+
else
|
21
|
+
@instance = EM::RemoteCall::Utils.constantize(args[:class]) or return false
|
22
|
+
end
|
20
23
|
end
|
21
24
|
|
22
25
|
def call(&callb)
|
23
|
-
unless valid?
|
24
|
-
puts "invalid remote call: :instance => #{@instance}, :method => #{@method}, :argument => #{@argument}"
|
25
|
-
return false
|
26
|
-
end
|
27
|
-
|
28
26
|
if @argument
|
29
27
|
@instance.__send__ @method, @argument, &callb
|
30
28
|
else
|
@@ -38,10 +36,13 @@ module EM::RemoteCall::Server
|
|
38
36
|
|
39
37
|
def json_parsed(hash)
|
40
38
|
remote_call = EM::RemoteCall::Call.new hash[:instance], hash[:method].to_sym, hash[:argument]
|
41
|
-
|
42
|
-
|
39
|
+
|
40
|
+
remote_call.call do |blk_value|
|
41
|
+
send_data({:deferrable_id => hash[:deferrable_id], :success => blk_value})
|
43
42
|
end
|
44
|
-
send_data({:callback_id => hash[:return_block_id], :argument => return_value}) if hash[:return_block_id]
|
45
43
|
|
44
|
+
rescue => e
|
45
|
+
puts "#{e}: #{e.message}"
|
46
|
+
send_data( { :deferrable_id => hash[:deferrable_id], :error => {:class => e.class.name, :message => e.message} } )
|
46
47
|
end
|
47
48
|
end
|
data/spec/integration_spec.rb
CHANGED
@@ -5,7 +5,7 @@ require 'em_remote_call'
|
|
5
5
|
class Track
|
6
6
|
attr_reader :title, :artist
|
7
7
|
|
8
|
-
def initialize(opts)
|
8
|
+
def initialize(opts={})
|
9
9
|
@title, @artist = opts[:title], opts[:artist]
|
10
10
|
super
|
11
11
|
end
|
@@ -27,12 +27,16 @@ class ServerTrack < Track
|
|
27
27
|
callb.call "finished #{id}"
|
28
28
|
"started #{id}"
|
29
29
|
end
|
30
|
+
def raise_hell
|
31
|
+
EM.next_tick{raise 'foobar'}
|
32
|
+
end
|
30
33
|
end
|
31
34
|
|
32
35
|
class ClientTrack < Track
|
33
36
|
extend EM::RemoteCall
|
34
37
|
remote_method :init_track_on_server, :class_name => 'ServerTrack', :calls => :new
|
35
38
|
remote_method :play, :class_name => 'ServerTrack', :find_by => :id
|
39
|
+
remote_method :raise_hell, :class_name => 'ServerTrack', :find_by => :id
|
36
40
|
end
|
37
41
|
|
38
42
|
class EMController
|
@@ -63,7 +67,7 @@ describe EM::RemoteCall do
|
|
63
67
|
test_on_client do
|
64
68
|
callb = mock(:callb)
|
65
69
|
callb.should_receive(:foo)
|
66
|
-
ClientTrack.new
|
70
|
+
ClientTrack.new.init_track_on_server({}){callb.foo}
|
67
71
|
end
|
68
72
|
end
|
69
73
|
end
|
@@ -78,16 +82,16 @@ describe EM::RemoteCall do
|
|
78
82
|
end
|
79
83
|
end
|
80
84
|
end
|
81
|
-
describe "
|
82
|
-
it "should
|
85
|
+
describe "errbacks" do
|
86
|
+
it "should take an errback method" do
|
83
87
|
test_on_client do
|
84
88
|
callb = mock(:callb)
|
85
|
-
callb.should_receive(:
|
89
|
+
callb.should_receive(:foo).with({:class=>"RuntimeError", :message=>"foobar"})
|
86
90
|
c = ClientTrack.new(:title => 'a', :artist => 'b')
|
87
91
|
c.init_track_on_server(:title => 'a', :artist => 'b')
|
88
|
-
|
92
|
+
play_call = c.raise_hell
|
93
|
+
play_call.errback{|a| callb.foo a}
|
89
94
|
end
|
90
95
|
end
|
91
96
|
end
|
92
97
|
end
|
93
|
-
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 4
|
9
|
+
version: 0.0.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Niko Dittmann
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-22 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|