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.
@@ -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