neovim 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +10 -0
  4. data/lib/neovim/current.rb +19 -2
  5. data/lib/neovim/host.rb +3 -11
  6. data/lib/neovim/host/loader.rb +0 -2
  7. data/lib/neovim/line_range.rb +14 -2
  8. data/lib/neovim/plugin.rb +1 -4
  9. data/lib/neovim/plugin/dsl.rb +6 -14
  10. data/lib/neovim/plugin/handler.rb +2 -9
  11. data/lib/neovim/ruby_provider.rb +9 -15
  12. data/lib/neovim/session.rb +23 -70
  13. data/lib/neovim/session/api.rb +61 -0
  14. data/lib/neovim/session/event_loop.rb +108 -0
  15. data/lib/neovim/session/notification.rb +19 -0
  16. data/lib/neovim/session/request.rb +31 -0
  17. data/lib/neovim/session/rpc.rb +95 -0
  18. data/lib/neovim/session/serializer.rb +62 -0
  19. data/lib/neovim/version.rb +1 -1
  20. data/neovim.gemspec +1 -1
  21. data/spec/acceptance/neovim-ruby-host_spec.rb +0 -5
  22. data/spec/acceptance/ruby_provider_spec.rb +35 -3
  23. data/spec/helper.rb +33 -2
  24. data/spec/neovim/host_spec.rb +1 -1
  25. data/spec/neovim/plugin_spec.rb +2 -2
  26. data/spec/neovim/session/api_spec.rb +46 -0
  27. data/spec/neovim/session/event_loop_spec.rb +99 -0
  28. data/spec/neovim/session/rpc_spec.rb +108 -0
  29. data/spec/neovim/session/serializer_spec.rb +48 -0
  30. data/spec/neovim/session_spec.rb +1 -1
  31. metadata +16 -18
  32. data/lib/neovim/api.rb +0 -80
  33. data/lib/neovim/async_session.rb +0 -119
  34. data/lib/neovim/event_loop.rb +0 -128
  35. data/lib/neovim/msgpack_stream.rb +0 -80
  36. data/lib/neovim/notification.rb +0 -17
  37. data/lib/neovim/request.rb +0 -29
  38. data/spec/neovim/api_spec.rb +0 -44
  39. data/spec/neovim/async_session_spec.rb +0 -106
  40. data/spec/neovim/event_loop_spec.rb +0 -97
  41. data/spec/neovim/msgpack_stream_spec.rb +0 -46
  42. data/spec/support.rb +0 -33
@@ -3,8 +3,7 @@ require "neovim"
3
3
  require "pry"
4
4
  require "stringio"
5
5
  require "timeout"
6
-
7
- require File.expand_path("../support.rb", __FILE__)
6
+ require "fileutils"
8
7
 
9
8
  if ENV["REPORT_COVERAGE"]
10
9
  require "coveralls"
@@ -50,4 +49,36 @@ RSpec.configure do |config|
50
49
  Kernel.srand config.seed
51
50
  end
52
51
 
52
+ module Support
53
+ def self.workspace
54
+ File.expand_path("../workspace", __FILE__)
55
+ end
56
+
57
+ def self.socket_path
58
+ file_path("nvim.sock")
59
+ end
60
+
61
+ def self.port
62
+ server = TCPServer.new("0.0.0.0", 0)
63
+
64
+ begin
65
+ server.addr[1]
66
+ ensure
67
+ server.close
68
+ end
69
+ end
70
+
71
+ def self.file_path(name)
72
+ File.join(workspace, name)
73
+ end
74
+
75
+ def self.setup_workspace
76
+ FileUtils.mkdir_p(workspace)
77
+ end
78
+
79
+ def self.teardown_workspace
80
+ FileUtils.rm_rf(workspace)
81
+ end
82
+ end
83
+
53
84
  Thread.abort_on_exception = true
@@ -57,7 +57,7 @@ module Neovim
57
57
 
58
58
  it "doesn't add top-level RPCs to specs" do
59
59
  plugin = Plugin.from_config_block("source") do |plug|
60
- plug.rpc(:Foo)
60
+ plug.__send__(:rpc, :Foo)
61
61
  end
62
62
 
63
63
  expect {
@@ -67,7 +67,7 @@ module Neovim
67
67
  cmd_block = Proc.new {}
68
68
 
69
69
  plugin = Plugin.from_config_block("source") do |plug|
70
- plug.rpc("Foo", :sync => true, &cmd_block)
70
+ plug.__send__(:rpc, "Foo", &cmd_block)
71
71
  end
72
72
 
73
73
  expect(plugin.handlers.size).to be(1)
@@ -98,7 +98,7 @@ module Neovim
98
98
 
99
99
  it "doesn't include specs for top-level RPCs" do
100
100
  plugin = Plugin.from_config_block("source") do |plug|
101
- plug.rpc("Foo", :sync => true)
101
+ plug.__send__(:rpc, "Foo")
102
102
  end
103
103
 
104
104
  expect(plugin.specs).to eq([])
@@ -0,0 +1,46 @@
1
+ require "helper"
2
+
3
+ module Neovim
4
+ class Session
5
+ RSpec.describe API do
6
+ describe ".null" do
7
+ it "returns an empty API object" do
8
+ api = API.null
9
+
10
+ expect(api.types).to be_empty
11
+ expect(api.functions).to be_empty
12
+ end
13
+ end
14
+
15
+ describe "#function" do
16
+ it "returns a corresponding Function object" do
17
+ api = API.new(
18
+ [nil, {"functions" => [
19
+ {"name" => "vim_strwidth", "async" => false}
20
+ ]}]
21
+ )
22
+
23
+ function = api.function("vim_strwidth")
24
+ expect(function).to be_a(API::Function)
25
+ expect(function.name).to eq("vim_strwidth")
26
+ expect(function.async).to be(false)
27
+ end
28
+ end
29
+
30
+ describe "#functions_with_prefix" do
31
+ it "returns relevant functions" do
32
+ api = API.new(
33
+ [nil, {"functions" => [
34
+ {"name" => "vim_strwidth"},
35
+ {"name" => "buffer_get_lines"}
36
+ ]}]
37
+ )
38
+
39
+ functions = api.functions_with_prefix("vim_")
40
+ expect(functions.size).to be(1)
41
+ expect(functions.first.name).to eq("vim_strwidth")
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,99 @@
1
+ require "helper"
2
+ require "socket"
3
+
4
+ module Neovim
5
+ class Session
6
+ RSpec.describe EventLoop do
7
+ shared_context "socket behavior" do
8
+ it "sends and receives data" do
9
+ request = nil
10
+
11
+ server_thread = Thread.new do
12
+ client = server.accept
13
+ request = client.readpartial(1024)
14
+
15
+ client.write("res")
16
+ client.close
17
+ server.close
18
+ end
19
+
20
+ response = nil
21
+ event_loop.write("req").run do |msg|
22
+ response = msg
23
+ event_loop.stop
24
+ end
25
+
26
+ server_thread.join
27
+ event_loop.shutdown
28
+ expect(request).to eq("req")
29
+ expect(response).to eq("res")
30
+ end
31
+ end
32
+
33
+ context "tcp" do
34
+ let!(:server) { TCPServer.new("0.0.0.0", 0) }
35
+ let!(:event_loop) { EventLoop.tcp("0.0.0.0", server.addr[1]) }
36
+
37
+ include_context "socket behavior"
38
+ end
39
+
40
+ context "unix" do
41
+ let!(:server) { UNIXServer.new(Support.socket_path) }
42
+ let!(:event_loop) { EventLoop.unix(Support.socket_path) }
43
+
44
+ include_context "socket behavior"
45
+ end
46
+
47
+ context "stdio" do
48
+ it "sends and receives data" do
49
+ old_stdout = STDOUT.dup
50
+ old_stdin = STDIN.dup
51
+
52
+ begin
53
+ srv_stdout, cl_stdout = IO.pipe
54
+ cl_stdin, srv_stdin = IO.pipe
55
+
56
+ STDOUT.reopen(cl_stdout)
57
+ STDIN.reopen(cl_stdin)
58
+
59
+ event_loop = EventLoop.stdio
60
+ request = nil
61
+
62
+ server_thread = Thread.new do
63
+ request = srv_stdout.readpartial(1024)
64
+ srv_stdin.write("res")
65
+ end
66
+
67
+ response = nil
68
+ event_loop.write("req").run do |msg|
69
+ response = msg
70
+ event_loop.stop
71
+ end
72
+
73
+ server_thread.join
74
+ expect(request).to eq("req")
75
+ expect(response).to eq("res")
76
+ ensure
77
+ STDOUT.reopen(old_stdout)
78
+ STDIN.reopen(old_stdin)
79
+ end
80
+ end
81
+ end
82
+
83
+ context "child" do
84
+ it "sends and receives data" do
85
+ event_loop = EventLoop.child(["nvim", "-n", "-u", "NONE"])
86
+ input = MessagePack.pack([0, 0, :vim_strwidth, ["hi"]])
87
+
88
+ response = nil
89
+ event_loop.write(input).run do |msg|
90
+ response = msg
91
+ event_loop.shutdown
92
+ end
93
+
94
+ expect(response).to eq(MessagePack.pack([1, 0, nil, 2]))
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,108 @@
1
+ require "helper"
2
+
3
+ module Neovim
4
+ class Session
5
+ RSpec.describe RPC do
6
+ shared_context "rpc behavior" do
7
+ it "receives requests" do
8
+ serializer = Serializer.new(event_loop)
9
+ rpc = RPC.new(serializer)
10
+
11
+ server_thread = Thread.new do
12
+ client = server.accept
13
+ client.write(
14
+ MessagePack.pack(
15
+ [0, 123, "func", [1, 2, 3]]
16
+ )
17
+ )
18
+ end
19
+
20
+ request = nil
21
+ rpc.run do |msg|
22
+ request = msg
23
+ rpc.shutdown
24
+ end
25
+
26
+ server_thread.join
27
+
28
+ expect(request).to be_a(Request)
29
+ expect(request.method_name).to eq("func")
30
+ expect(request.arguments).to eq([1, 2, 3])
31
+ end
32
+
33
+ it "receives notifications" do
34
+ serializer = Serializer.new(event_loop)
35
+ rpc = RPC.new(serializer)
36
+
37
+ server_thread = Thread.new do
38
+ client = server.accept
39
+ client.write(
40
+ MessagePack.pack(
41
+ [2, "func", [1, 2, 3]]
42
+ )
43
+ )
44
+ end
45
+
46
+ notification = nil
47
+ rpc.run do |message|
48
+ notification = message
49
+ rpc.shutdown
50
+ end
51
+
52
+ server_thread.join
53
+
54
+ expect(notification).to be_a(Notification)
55
+ expect(notification.method_name).to eq("func")
56
+ expect(notification.arguments).to eq([1, 2, 3])
57
+ end
58
+
59
+ it "receives responses to requests" do
60
+ serializer = Serializer.new(event_loop)
61
+ rpc = RPC.new(serializer)
62
+ request = nil
63
+
64
+ server_thread = Thread.new do
65
+ client = server.accept
66
+ request = client.readpartial(1024)
67
+
68
+ client.write(
69
+ MessagePack.pack(
70
+ [1, 0, [0, "error"], "result"]
71
+ )
72
+ )
73
+ end
74
+
75
+ error, result = nil
76
+ rpc.request("func", 1, 2, 3) do |err, res|
77
+ error, result = err, res
78
+ rpc.shutdown
79
+ end.run
80
+
81
+ expect(error).to eq("error")
82
+ expect(result).to eq("result")
83
+
84
+ server_thread.join
85
+ rpc.shutdown
86
+
87
+ expect(request).to eq(
88
+ MessagePack.pack([0, 0, "func", [1, 2, 3]])
89
+ )
90
+ end
91
+ end
92
+
93
+ context "tcp" do
94
+ let!(:server) { TCPServer.new("0.0.0.0", 0) }
95
+ let!(:event_loop) { EventLoop.tcp("0.0.0.0", server.addr[1]) }
96
+
97
+ include_context "rpc behavior"
98
+ end
99
+
100
+ context "unix" do
101
+ let!(:server) { UNIXServer.new(Support.socket_path) }
102
+ let!(:event_loop) { EventLoop.unix(Support.socket_path) }
103
+
104
+ include_context "rpc behavior"
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,48 @@
1
+ require "socket"
2
+ require "helper"
3
+
4
+ module Neovim
5
+ class Session
6
+ RSpec.describe Serializer do
7
+ shared_context "serializer behavior" do
8
+ it "sends and receives data" do
9
+ serializer = Serializer.new(event_loop)
10
+ request = nil
11
+
12
+ server_thread = Thread.new do
13
+ client = server.accept
14
+ request = client.readpartial(1024)
15
+
16
+ client.write(MessagePack.pack(["res"]))
17
+ client.close
18
+ server.close
19
+ end
20
+
21
+ response = nil
22
+ serializer.write(["req"]).run do |message|
23
+ response = message
24
+ serializer.shutdown
25
+ end
26
+
27
+ server_thread.join
28
+ expect(request).to eq(MessagePack.pack(["req"]))
29
+ expect(response).to eq(["res"])
30
+ end
31
+ end
32
+
33
+ context "tcp" do
34
+ let!(:server) { TCPServer.new("0.0.0.0", 0) }
35
+ let!(:event_loop) { EventLoop.tcp("0.0.0.0", server.addr[1]) }
36
+
37
+ include_context "serializer behavior"
38
+ end
39
+
40
+ context "unix" do
41
+ let!(:server) { UNIXServer.new(Support.socket_path) }
42
+ let!(:event_loop) { EventLoop.unix(Support.socket_path) }
43
+
44
+ include_context "serializer behavior"
45
+ end
46
+ end
47
+ end
48
+ end
@@ -74,7 +74,7 @@ module Neovim
74
74
  session.shutdown
75
75
  end
76
76
 
77
- expect(message).to be_a(Notification)
77
+ expect(message).to be_a(Session::Notification)
78
78
  expect(message.method_name).to eq("my_event")
79
79
  expect(message.arguments).to eq(["foo"])
80
80
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neovim
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Genco
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-17 00:00:00.000000000 Z
11
+ date: 2016-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -100,28 +100,28 @@ files:
100
100
  - bin/mp2j
101
101
  - bin/neovim-ruby-host
102
102
  - lib/neovim.rb
103
- - lib/neovim/api.rb
104
- - lib/neovim/async_session.rb
105
103
  - lib/neovim/buffer.rb
106
104
  - lib/neovim/client.rb
107
105
  - lib/neovim/current.rb
108
- - lib/neovim/event_loop.rb
109
106
  - lib/neovim/host.rb
110
107
  - lib/neovim/host/loader.rb
111
108
  - lib/neovim/line_range.rb
112
109
  - lib/neovim/logging.rb
113
- - lib/neovim/msgpack_stream.rb
114
- - lib/neovim/notification.rb
115
110
  - lib/neovim/plugin.rb
116
111
  - lib/neovim/plugin/dsl.rb
117
112
  - lib/neovim/plugin/handler.rb
118
113
  - lib/neovim/remote_object.rb
119
- - lib/neovim/request.rb
120
114
  - lib/neovim/ruby_provider.rb
121
115
  - lib/neovim/ruby_provider/buffer_ext.rb
122
116
  - lib/neovim/ruby_provider/vim.rb
123
117
  - lib/neovim/ruby_provider/window_ext.rb
124
118
  - lib/neovim/session.rb
119
+ - lib/neovim/session/api.rb
120
+ - lib/neovim/session/event_loop.rb
121
+ - lib/neovim/session/notification.rb
122
+ - lib/neovim/session/request.rb
123
+ - lib/neovim/session/rpc.rb
124
+ - lib/neovim/session/serializer.rb
125
125
  - lib/neovim/tabpage.rb
126
126
  - lib/neovim/version.rb
127
127
  - lib/neovim/window.rb
@@ -129,24 +129,23 @@ files:
129
129
  - spec/acceptance/neovim-ruby-host_spec.rb
130
130
  - spec/acceptance/ruby_provider_spec.rb
131
131
  - spec/helper.rb
132
- - spec/neovim/api_spec.rb
133
- - spec/neovim/async_session_spec.rb
134
132
  - spec/neovim/buffer_spec.rb
135
133
  - spec/neovim/client_spec.rb
136
134
  - spec/neovim/current_spec.rb
137
- - spec/neovim/event_loop_spec.rb
138
135
  - spec/neovim/host/loader_spec.rb
139
136
  - spec/neovim/host_spec.rb
140
137
  - spec/neovim/line_range_spec.rb
141
- - spec/neovim/msgpack_stream_spec.rb
142
138
  - spec/neovim/plugin_spec.rb
143
139
  - spec/neovim/remote_object_spec.rb
144
140
  - spec/neovim/ruby_provider/buffer_ext_spec.rb
145
141
  - spec/neovim/ruby_provider/window_ext_spec.rb
142
+ - spec/neovim/session/api_spec.rb
143
+ - spec/neovim/session/event_loop_spec.rb
144
+ - spec/neovim/session/rpc_spec.rb
145
+ - spec/neovim/session/serializer_spec.rb
146
146
  - spec/neovim/session_spec.rb
147
147
  - spec/neovim/window_spec.rb
148
148
  - spec/neovim_spec.rb
149
- - spec/support.rb
150
149
  homepage: https://github.com/alexgenco/neovim-ruby
151
150
  licenses:
152
151
  - MIT
@@ -175,22 +174,21 @@ test_files:
175
174
  - spec/acceptance/neovim-ruby-host_spec.rb
176
175
  - spec/acceptance/ruby_provider_spec.rb
177
176
  - spec/helper.rb
178
- - spec/neovim/api_spec.rb
179
- - spec/neovim/async_session_spec.rb
180
177
  - spec/neovim/buffer_spec.rb
181
178
  - spec/neovim/client_spec.rb
182
179
  - spec/neovim/current_spec.rb
183
- - spec/neovim/event_loop_spec.rb
184
180
  - spec/neovim/host/loader_spec.rb
185
181
  - spec/neovim/host_spec.rb
186
182
  - spec/neovim/line_range_spec.rb
187
- - spec/neovim/msgpack_stream_spec.rb
188
183
  - spec/neovim/plugin_spec.rb
189
184
  - spec/neovim/remote_object_spec.rb
190
185
  - spec/neovim/ruby_provider/buffer_ext_spec.rb
191
186
  - spec/neovim/ruby_provider/window_ext_spec.rb
187
+ - spec/neovim/session/api_spec.rb
188
+ - spec/neovim/session/event_loop_spec.rb
189
+ - spec/neovim/session/rpc_spec.rb
190
+ - spec/neovim/session/serializer_spec.rb
192
191
  - spec/neovim/session_spec.rb
193
192
  - spec/neovim/window_spec.rb
194
193
  - spec/neovim_spec.rb
195
- - spec/support.rb
196
194
  has_rdoc: