elrpc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ module Elrpc
2
+ VERSION = "0.0.1"
3
+ end
@@ -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
@@ -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
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'elrpc'
4
+
5
+ server = Elrpc.start_server([],8888)
6
+ server.def_method "add" do |a,b|
7
+ a+b
8
+ end
9
+ server.wait
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'elrpc'
4
+
5
+ cl = Elrpc.start_client(8888)
6
+ ret = cl.call_method("echo", 1)
7
+ puts ret
8
+ cl.stop
9
+
10
+
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'elrpc'
4
+
5
+ server = Elrpc.start_server([], 8888)
6
+ server.def_method "echo" do |*arg|
7
+ arg
8
+ end
9
+ server.wait
@@ -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
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'elrpc'
4
+
5
+ methods = [
6
+ Elrpc::Method.new("method1", "args", "", &->(a) { 1 }),
7
+ Elrpc::Method.new("test2", "a,b,c", "docstring here...", &->(a,b,c) { 2 }),
8
+ ]
9
+
10
+ server = Elrpc.start_server(methods, 8888)
11
+ server.wait
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'elrpc'
4
+
5
+ server = Elrpc.start_server()
6
+ server.wait
@@ -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
@@ -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