elrpc 0.0.1
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 +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
|