elrpc 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +135 -0
- data/Rakefile +2 -0
- data/elrpc.gemspec +25 -0
- data/lib/elrpc.rb +697 -0
- data/lib/elrpc/version.rb +3 -0
- data/sample/echo-client.el +28 -0
- data/sample/echo-client.rb +22 -0
- data/sample/echo.rb +15 -0
- data/test/_add.rb +9 -0
- data/test/_call_echo.rb +10 -0
- data/test/_echo.rb +9 -0
- data/test/_errors.rb +15 -0
- data/test/_methods.rb +11 -0
- data/test/_process.rb +6 -0
- data/test/echo-bench.rb +40 -0
- data/test/test-epc.rb +164 -0
- metadata +127 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
(require 'epc)
|
2
|
+
|
3
|
+
(let (epc)
|
4
|
+
;; start a child process
|
5
|
+
;; bundle exec
|
6
|
+
(setq epc (epc:start-epc "bundle" '("exec" "ruby" "echo.rb")))
|
7
|
+
|
8
|
+
;; system ruby
|
9
|
+
;;(setq epc (epc:start-epc "ruby" '("_echo.rb")))
|
10
|
+
|
11
|
+
;; debug process (manual connection)
|
12
|
+
;;(setq epc (epc:start-epc-debug 8888))
|
13
|
+
|
14
|
+
|
15
|
+
;; asynchronous calling
|
16
|
+
(deferred:$
|
17
|
+
(epc:call-deferred epc 'echo '("hello"))
|
18
|
+
(deferred:nextc it
|
19
|
+
(lambda (x) (message "Return : %S" x))))
|
20
|
+
|
21
|
+
;; synchronous calling (debug purpose)
|
22
|
+
(message "%S" (epc:call-sync epc 'echo '(world)))
|
23
|
+
|
24
|
+
;;
|
25
|
+
(epc:stop-epc epc)
|
26
|
+
)
|
27
|
+
|
28
|
+
;; just `eval-last-sexp' here
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'elrpc'
|
4
|
+
|
5
|
+
# start a child process
|
6
|
+
cl = Elrpc.start_process(["ruby","echo.rb"])
|
7
|
+
|
8
|
+
# synchronous calling
|
9
|
+
puts cl.call_method("echo", "1 hello")
|
10
|
+
|
11
|
+
# asynchronous calling
|
12
|
+
cl.call_method_async("echo", "3 world") do |err, value|
|
13
|
+
puts value
|
14
|
+
end
|
15
|
+
|
16
|
+
puts "2 wait"
|
17
|
+
sleep 0.2
|
18
|
+
|
19
|
+
puts "4 ok"
|
20
|
+
|
21
|
+
# kill the child process
|
22
|
+
cl.stop
|
data/sample/echo.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'elrpc'
|
4
|
+
|
5
|
+
# start server
|
6
|
+
server = Elrpc.start_server()
|
7
|
+
|
8
|
+
# define a method
|
9
|
+
server.def_method "echo" do |arg|
|
10
|
+
# just return the given argument value
|
11
|
+
arg
|
12
|
+
end
|
13
|
+
|
14
|
+
# sleep the main thread and wait for closing connection
|
15
|
+
server.wait
|
data/test/_add.rb
ADDED
data/test/_call_echo.rb
ADDED
data/test/_echo.rb
ADDED
data/test/_errors.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'elrpc'
|
4
|
+
|
5
|
+
server = Elrpc.start_server([],8888)
|
6
|
+
server.def_method "num_error" do |arg|
|
7
|
+
1/0
|
8
|
+
end
|
9
|
+
server.def_method "raise_error" do |arg|
|
10
|
+
raise "Raise!"
|
11
|
+
end
|
12
|
+
server.def_method "echo" do |*arg|
|
13
|
+
arg
|
14
|
+
end
|
15
|
+
server.wait
|
data/test/_methods.rb
ADDED
data/test/_process.rb
ADDED
data/test/echo-bench.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'elrpc'
|
4
|
+
require 'benchmark'
|
5
|
+
require 'monitor'
|
6
|
+
|
7
|
+
cl = Elrpc.start_process(["ruby","#{__dir__}/_echo.rb"])
|
8
|
+
|
9
|
+
rnd = Random.new 1000
|
10
|
+
array = (1..100).map {|i| rnd.rand*10000 }
|
11
|
+
hash = array.inject({}) {|h, i| h[i] = rnd.rand*10000; h }
|
12
|
+
str = array.join("")
|
13
|
+
|
14
|
+
n = 2000
|
15
|
+
Benchmark.bm(10) do |x|
|
16
|
+
tint = x.report("int") { n.times { cl.call_method("echo", 1) } }
|
17
|
+
tinta = x.report("int_a") do
|
18
|
+
wait_lock = Mutex.new
|
19
|
+
wait_cv = ConditionVariable.new
|
20
|
+
count = 0
|
21
|
+
n.times do
|
22
|
+
cl.call_method_async("echo", 1) do |val|
|
23
|
+
count += 1
|
24
|
+
wait_lock.synchronize do
|
25
|
+
wait_cv.signal if count == n
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
wait_lock.synchronize do
|
30
|
+
wait_cv.wait(wait_lock)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
tstr = x.report("string") { n.times { cl.call_method("echo", str) } }
|
34
|
+
tarr = x.report("array") { n.times { cl.call_method("echo", array) } }
|
35
|
+
thsh = x.report("hash") { n.times { cl.call_method("echo", hash) } }
|
36
|
+
puts sprintf("(call/sec) int: %.1f int_async: %.1f string: %.1f array: %.1f hash: %.1f",
|
37
|
+
n/tint.total, n/tinta.total, n/tstr.total, n/tarr.total, n/thsh.total)
|
38
|
+
end
|
39
|
+
|
40
|
+
cl.stop
|
data/test/test-epc.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'elrpc'
|
5
|
+
|
6
|
+
def base(file)
|
7
|
+
"#{__dir__}/#{file}"
|
8
|
+
end
|
9
|
+
|
10
|
+
STDOUT.sync = true
|
11
|
+
|
12
|
+
class TestEPC < Test::Unit::TestCase
|
13
|
+
|
14
|
+
sub_test_case "01 Process" do
|
15
|
+
test "Start with port num and Getting it" do
|
16
|
+
port = nil
|
17
|
+
IO.popen(["ruby", base("_echo.rb")]) do |io|
|
18
|
+
port = io.readline.strip
|
19
|
+
Process.kill("TERM",io.pid)
|
20
|
+
end
|
21
|
+
assert_equal("8888", port)
|
22
|
+
end
|
23
|
+
|
24
|
+
test "Start without port num and getting the port num" do
|
25
|
+
port = nil
|
26
|
+
IO.popen(["ruby", base("_process.rb")]) do |io|
|
27
|
+
port = io.readline
|
28
|
+
Process.kill("TERM",io.pid)
|
29
|
+
end
|
30
|
+
assert_true(port.to_i > 0)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
def with_epc(progname)
|
37
|
+
IO.popen(["ruby", base(progname)]) do |io|
|
38
|
+
port = io.readline.to_i
|
39
|
+
thread = Thread.start { loop { puts io.readline } }
|
40
|
+
client = Elrpc.start_client(port)
|
41
|
+
client.logger.level = Logger::ERROR
|
42
|
+
begin
|
43
|
+
yield client
|
44
|
+
rescue => e
|
45
|
+
Process.kill("TERM",io.pid)
|
46
|
+
raise e
|
47
|
+
ensure
|
48
|
+
client.stop
|
49
|
+
thread.kill
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
sub_test_case "02 Echo" do
|
56
|
+
|
57
|
+
test "Echo sync" do
|
58
|
+
with_epc "_echo.rb" do |client|
|
59
|
+
ret = client.call_method("echo", "hello")
|
60
|
+
assert_equal "hello", ret[0]
|
61
|
+
ret = client.call_method("echo", 12345)
|
62
|
+
assert_equal 12345, ret[0]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
test "Echo async" do
|
67
|
+
with_epc "_echo.rb" do |client|
|
68
|
+
client.call_method_async("echo", "hello") do |err, ret|
|
69
|
+
assert_equal "hello", ret[0]
|
70
|
+
end
|
71
|
+
client.call_method_async("echo", -12.345) do |err, ret|
|
72
|
+
assert_equal -12.345, ret[0]
|
73
|
+
client.stop
|
74
|
+
end
|
75
|
+
client.wait
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
sub_test_case "03 Add" do
|
82
|
+
|
83
|
+
test "Add sync" do
|
84
|
+
with_epc "_add.rb" do |client|
|
85
|
+
ret = client.call_method("add", 1, 2)
|
86
|
+
assert_equal 3, ret
|
87
|
+
ret = client.call_method("add", "A", "B")
|
88
|
+
assert_equal "AB", ret
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
test "Add async" do
|
93
|
+
with_epc "_add.rb" do |client|
|
94
|
+
client.call_method_async("add", 3, 4) do |err, ret|
|
95
|
+
assert_equal 7, ret
|
96
|
+
end
|
97
|
+
client.call_method_async("add", "C","D") do |err, ret|
|
98
|
+
assert_equal "CD", ret
|
99
|
+
client.stop
|
100
|
+
end
|
101
|
+
client.wait
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
sub_test_case "04 Errors" do
|
107
|
+
|
108
|
+
test "Error sync" do
|
109
|
+
with_epc "_errors.rb" do |client|
|
110
|
+
assert_raise_message /divided by 0/ do
|
111
|
+
ret = client.call_method("num_error")
|
112
|
+
end
|
113
|
+
assert_raise_message /Raise!/ do
|
114
|
+
ret = client.call_method("raise_error")
|
115
|
+
end
|
116
|
+
ret = client.call_method("echo", "recover!!")
|
117
|
+
assert_equal "recover!!", ret[0]
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
test "Error async" do
|
122
|
+
with_epc "_errors.rb" do |client|
|
123
|
+
client.call_method_async("num_error") do |err, ret|
|
124
|
+
assert_equal "divided by 0", err.remote_message
|
125
|
+
end
|
126
|
+
client.call_method_async("raise_error") do |err, ret|
|
127
|
+
assert_equal "Raise!", err.remote_message
|
128
|
+
client.stop
|
129
|
+
end
|
130
|
+
client.wait
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
test "EPC Error" do
|
135
|
+
with_epc "_echo.rb" do |client|
|
136
|
+
assert_raise_kind_of Elrpc::EPCStackError do
|
137
|
+
client.call_method("echo", Elparser::Parser.new )
|
138
|
+
end
|
139
|
+
assert_raise_kind_of Elrpc::EPCStackError do
|
140
|
+
client.call_method("echo??", 1 )
|
141
|
+
end
|
142
|
+
ret = client.call_method("echo", "recover!!")
|
143
|
+
assert_equal "recover!!", ret[0]
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
sub_test_case "05 Query" do
|
150
|
+
test "Query sync" do
|
151
|
+
with_epc "_methods.rb" do |client|
|
152
|
+
ret = client.query_methods
|
153
|
+
assert_equal 2, ret.size
|
154
|
+
assert_equal :method1, ret[0][0]
|
155
|
+
assert_equal "args", ret[0][1]
|
156
|
+
assert_equal "", ret[0][2]
|
157
|
+
assert_equal :test2, ret[1][0]
|
158
|
+
assert_equal "a,b,c", ret[1][1]
|
159
|
+
assert_equal "docstring here...", ret[1][2]
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: elrpc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- SAKURAI Masashi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-02-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: elparser
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.7'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.7'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: test-unit
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
description: EPC (RPC stack for the Emacs Lisp) for Ruby.
|
70
|
+
email:
|
71
|
+
- m.sakurai@kiwanami.net
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
77
|
+
- Gemfile
|
78
|
+
- LICENSE.txt
|
79
|
+
- README.md
|
80
|
+
- Rakefile
|
81
|
+
- elrpc.gemspec
|
82
|
+
- lib/elrpc.rb
|
83
|
+
- lib/elrpc/version.rb
|
84
|
+
- sample/echo-client.el
|
85
|
+
- sample/echo-client.rb
|
86
|
+
- sample/echo.rb
|
87
|
+
- test/_add.rb
|
88
|
+
- test/_call_echo.rb
|
89
|
+
- test/_echo.rb
|
90
|
+
- test/_errors.rb
|
91
|
+
- test/_methods.rb
|
92
|
+
- test/_process.rb
|
93
|
+
- test/echo-bench.rb
|
94
|
+
- test/test-epc.rb
|
95
|
+
homepage: https://github.com/kiwanami/ruby-elrpc
|
96
|
+
licenses:
|
97
|
+
- MIT
|
98
|
+
metadata: {}
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options: []
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
requirements: []
|
114
|
+
rubyforge_project:
|
115
|
+
rubygems_version: 2.4.3
|
116
|
+
signing_key:
|
117
|
+
specification_version: 4
|
118
|
+
summary: EPC (RPC stack for the Emacs Lisp) for Ruby.
|
119
|
+
test_files:
|
120
|
+
- test/_add.rb
|
121
|
+
- test/_call_echo.rb
|
122
|
+
- test/_echo.rb
|
123
|
+
- test/_errors.rb
|
124
|
+
- test/_methods.rb
|
125
|
+
- test/_process.rb
|
126
|
+
- test/echo-bench.rb
|
127
|
+
- test/test-epc.rb
|