neovim 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -1
  3. data/.travis.yml +2 -3
  4. data/CHANGELOG.md +29 -0
  5. data/Gemfile +0 -11
  6. data/README.md +3 -3
  7. data/Rakefile +1 -1
  8. data/appveyor.yml +9 -1
  9. data/lib/neovim.rb +3 -3
  10. data/lib/neovim/client.rb +2 -3
  11. data/lib/neovim/connection.rb +69 -0
  12. data/lib/neovim/event_loop.rb +34 -34
  13. data/lib/neovim/host.rb +47 -51
  14. data/lib/neovim/host/loader.rb +1 -4
  15. data/lib/neovim/logging.rb +8 -8
  16. data/lib/neovim/message.rb +70 -0
  17. data/lib/neovim/plugin.rb +0 -3
  18. data/lib/neovim/plugin/handler.rb +6 -6
  19. data/lib/neovim/remote_object.rb +1 -1
  20. data/lib/neovim/ruby_provider.rb +25 -14
  21. data/lib/neovim/session.rb +36 -43
  22. data/lib/neovim/version.rb +1 -1
  23. data/neovim.gemspec +4 -0
  24. data/spec/acceptance/runtime/rplugin/ruby/autocmds.rb +3 -3
  25. data/spec/acceptance/runtime/rplugin/ruby/commands.rb +15 -15
  26. data/spec/acceptance/runtime/rplugin/ruby/functions.rb +5 -5
  27. data/spec/acceptance_spec.rb +19 -16
  28. data/spec/helper.rb +15 -0
  29. data/spec/neovim/connection_spec.rb +79 -0
  30. data/spec/neovim/event_loop_spec.rb +36 -50
  31. data/spec/neovim/host/loader_spec.rb +16 -9
  32. data/spec/neovim/host_spec.rb +82 -92
  33. data/spec/neovim/logging_spec.rb +6 -6
  34. data/spec/neovim/message_spec.rb +119 -0
  35. data/spec/neovim/plugin_spec.rb +31 -31
  36. data/spec/neovim/session_spec.rb +1 -1
  37. metadata +38 -15
  38. data/lib/neovim/event_loop/connection.rb +0 -78
  39. data/lib/neovim/event_loop/message_builder.rb +0 -127
  40. data/lib/neovim/event_loop/serializer.rb +0 -37
  41. data/spec/acceptance/runtime/rplugin.vim +0 -37
  42. data/spec/neovim/event_loop/connection_spec.rb +0 -89
  43. data/spec/neovim/event_loop/message_builder_spec.rb +0 -105
  44. data/spec/neovim/event_loop/serializer_spec.rb +0 -63
@@ -24,7 +24,7 @@ module Neovim
24
24
  expect(session.request(:nvim_get_current_line)).to eq(large_str)
25
25
  end
26
26
 
27
- it "fails outside of the main thread" do
27
+ it "fails outside of the main thread", :silence_thread_exceptions do
28
28
  expect {
29
29
  Thread.new { session.request(:nvim_strwidth, "foo") }.join
30
30
  }.to raise_error(/outside of the main thread/)
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.6.2
4
+ version: 0.7.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: 2017-12-06 00:00:00.000000000 Z
11
+ date: 2018-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -80,6 +80,34 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: coveralls
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: rspec
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -119,16 +147,15 @@ files:
119
147
  - lib/neovim/api.rb
120
148
  - lib/neovim/buffer.rb
121
149
  - lib/neovim/client.rb
150
+ - lib/neovim/connection.rb
122
151
  - lib/neovim/current.rb
123
152
  - lib/neovim/event_loop.rb
124
- - lib/neovim/event_loop/connection.rb
125
- - lib/neovim/event_loop/message_builder.rb
126
- - lib/neovim/event_loop/serializer.rb
127
153
  - lib/neovim/executable.rb
128
154
  - lib/neovim/host.rb
129
155
  - lib/neovim/host/loader.rb
130
156
  - lib/neovim/line_range.rb
131
157
  - lib/neovim/logging.rb
158
+ - lib/neovim/message.rb
132
159
  - lib/neovim/plugin.rb
133
160
  - lib/neovim/plugin/dsl.rb
134
161
  - lib/neovim/plugin/handler.rb
@@ -164,7 +191,6 @@ files:
164
191
  - spec/acceptance/rubyfile/set_pwd_before.rb
165
192
  - spec/acceptance/rubyfile_spec.vim
166
193
  - spec/acceptance/runtime/init.vim
167
- - spec/acceptance/runtime/rplugin.vim
168
194
  - spec/acceptance/runtime/rplugin/ruby/autocmds.rb
169
195
  - spec/acceptance/runtime/rplugin/ruby/commands.rb
170
196
  - spec/acceptance/runtime/rplugin/ruby/functions.rb
@@ -180,16 +206,15 @@ files:
180
206
  - spec/neovim/api_spec.rb
181
207
  - spec/neovim/buffer_spec.rb
182
208
  - spec/neovim/client_spec.rb
209
+ - spec/neovim/connection_spec.rb
183
210
  - spec/neovim/current_spec.rb
184
- - spec/neovim/event_loop/connection_spec.rb
185
- - spec/neovim/event_loop/message_builder_spec.rb
186
- - spec/neovim/event_loop/serializer_spec.rb
187
211
  - spec/neovim/event_loop_spec.rb
188
212
  - spec/neovim/executable_spec.rb
189
213
  - spec/neovim/host/loader_spec.rb
190
214
  - spec/neovim/host_spec.rb
191
215
  - spec/neovim/line_range_spec.rb
192
216
  - spec/neovim/logging_spec.rb
217
+ - spec/neovim/message_spec.rb
193
218
  - spec/neovim/plugin_spec.rb
194
219
  - spec/neovim/remote_object_spec.rb
195
220
  - spec/neovim/ruby_provider/buffer_ext_spec.rb
@@ -211,7 +236,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
211
236
  requirements:
212
237
  - - ">="
213
238
  - !ruby/object:Gem::Version
214
- version: '0'
239
+ version: 2.2.0
215
240
  required_rubygems_version: !ruby/object:Gem::Requirement
216
241
  requirements:
217
242
  - - ">="
@@ -219,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
219
244
  version: '0'
220
245
  requirements: []
221
246
  rubyforge_project:
222
- rubygems_version: 2.6.13
247
+ rubygems_version: 2.7.3
223
248
  signing_key:
224
249
  specification_version: 4
225
250
  summary: A Ruby client for Neovim
@@ -242,7 +267,6 @@ test_files:
242
267
  - spec/acceptance/rubyfile/set_pwd_before.rb
243
268
  - spec/acceptance/rubyfile_spec.vim
244
269
  - spec/acceptance/runtime/init.vim
245
- - spec/acceptance/runtime/rplugin.vim
246
270
  - spec/acceptance/runtime/rplugin/ruby/autocmds.rb
247
271
  - spec/acceptance/runtime/rplugin/ruby/commands.rb
248
272
  - spec/acceptance/runtime/rplugin/ruby/functions.rb
@@ -258,16 +282,15 @@ test_files:
258
282
  - spec/neovim/api_spec.rb
259
283
  - spec/neovim/buffer_spec.rb
260
284
  - spec/neovim/client_spec.rb
285
+ - spec/neovim/connection_spec.rb
261
286
  - spec/neovim/current_spec.rb
262
- - spec/neovim/event_loop/connection_spec.rb
263
- - spec/neovim/event_loop/message_builder_spec.rb
264
- - spec/neovim/event_loop/serializer_spec.rb
265
287
  - spec/neovim/event_loop_spec.rb
266
288
  - spec/neovim/executable_spec.rb
267
289
  - spec/neovim/host/loader_spec.rb
268
290
  - spec/neovim/host_spec.rb
269
291
  - spec/neovim/line_range_spec.rb
270
292
  - spec/neovim/logging_spec.rb
293
+ - spec/neovim/message_spec.rb
271
294
  - spec/neovim/plugin_spec.rb
272
295
  - spec/neovim/remote_object_spec.rb
273
296
  - spec/neovim/ruby_provider/buffer_ext_spec.rb
@@ -1,78 +0,0 @@
1
- require "neovim/logging"
2
- require "socket"
3
-
4
- module Neovim
5
- class EventLoop
6
- # The lowest level interface to reading from and writing to +nvim+.
7
- #
8
- # @api private
9
- class Connection
10
- include Logging
11
-
12
- def self.tcp(host, port)
13
- socket = Socket.tcp(host, port)
14
- new(socket, socket)
15
- end
16
-
17
- def self.unix(path)
18
- socket = Socket.unix(path)
19
- new(socket, socket)
20
- end
21
-
22
- def self.child(_argv)
23
- argv = _argv.include?("--embed") ? _argv : _argv + ["--embed"]
24
-
25
- io = ::IO.popen(argv, "rb+").tap do |_io|
26
- Process.detach(_io.pid)
27
- end
28
-
29
- new(io, io)
30
- end
31
-
32
- def self.stdio
33
- new(STDIN, STDOUT)
34
- end
35
-
36
- def initialize(rd, wr)
37
- @rd, @wr = [rd, wr].map(&:binmode)
38
- @running = false
39
- end
40
-
41
- # Write data to the underlying +IO+. This will block until all the
42
- # data has been written.
43
- def write(data)
44
- written = 0
45
- total = data.bytesize
46
- log(:debug) { {:bytes => total} }
47
-
48
- begin
49
- while written < total
50
- written += @wr.write_nonblock(data[written..-1])
51
- end
52
- rescue ::IO::WaitWritable
53
- ::IO.select(nil, [@wr], nil, 1)
54
- retry
55
- ensure
56
- @wr.flush
57
- end
58
- end
59
-
60
- def read
61
- @rd.readpartial(1024 * 16).tap do |bytes|
62
- log(:debug) { {:bytes => bytes.bytesize} }
63
- yield bytes
64
- end
65
- end
66
-
67
- # Close underlying +IO+s.
68
- def close
69
- [@rd, @wr].each do |io|
70
- begin
71
- io.close
72
- rescue ::IOError
73
- end
74
- end
75
- end
76
- end
77
- end
78
- end
@@ -1,127 +0,0 @@
1
- require "neovim/logging"
2
-
3
- module Neovim
4
- class EventLoop
5
- # Handles formatting RPC messages and registering response callbacks for
6
- # requests.
7
- #
8
- # @api private
9
- class MessageBuilder
10
- module StructToH
11
- def to_h
12
- each_pair.inject({}) { |acc, (k, v)| acc.merge(k => v) }
13
- end
14
- end
15
-
16
- class Request < Struct.new(:id, :method_name, :arguments)
17
- include StructToH
18
-
19
- def sync?
20
- true
21
- end
22
-
23
- def to_h
24
- super.merge(:type => :request)
25
- end
26
- end
27
-
28
- class Notification < Struct.new(:method_name, :arguments)
29
- include StructToH
30
-
31
- def sync?
32
- false
33
- end
34
-
35
- def to_h
36
- super.merge(:type => :notification)
37
- end
38
- end
39
-
40
- class Response < Struct.new(:request_id, :value, :error)
41
- include StructToH
42
-
43
- def value!
44
- error ? raise(error) : value
45
- end
46
-
47
- def to_h
48
- super.merge(:type => :response)
49
- end
50
- end
51
-
52
- include Logging
53
-
54
- def initialize
55
- @request_id = 0
56
- @pending_requests = {}
57
- end
58
-
59
- def write(type, *write_args)
60
- case type
61
- when :request
62
- method, args, response_handler = write_args
63
-
64
- @request_id += 1
65
- @pending_requests[@request_id] = response_handler
66
-
67
- log(:debug) do
68
- {
69
- :type => type,
70
- :request_id => @request_id,
71
- :method_name => method,
72
- :arguments => args,
73
- }
74
- end
75
-
76
- yield [0, @request_id, method, args]
77
- when :response
78
- reqid, value, error = write_args
79
-
80
- log(:debug) do
81
- {
82
- :type => type,
83
- :request_id => reqid,
84
- :value => value,
85
- :error => error,
86
- }
87
- end
88
-
89
- yield [1, reqid, error, value]
90
- when :notification
91
- method, args = write_args
92
-
93
- log(:debug) do
94
- {
95
- :type => type,
96
- :method_name => method,
97
- :arguments => args,
98
- }
99
- end
100
-
101
- yield [2, method, args]
102
- else
103
- raise "Unknown RPC message type #{type}"
104
- end
105
- end
106
-
107
- def read((kind, *payload))
108
- case kind
109
- when 0
110
- message = Request.new(*payload)
111
- log(:debug) { message.to_h }
112
- yield message
113
- when 2
114
- message = Notification.new(*payload)
115
- log(:debug) { message.to_h }
116
- yield message
117
- when 1
118
- reqid, (_, error), result = payload
119
- handler = @pending_requests.delete(reqid) || Proc.new {}
120
- message = Response.new(reqid, result, error)
121
- log(:debug) { message.to_h }
122
- handler.call(message)
123
- end
124
- end
125
- end
126
- end
127
- end
@@ -1,37 +0,0 @@
1
- require "neovim/logging"
2
- require "msgpack"
3
-
4
- module Neovim
5
- class EventLoop
6
- # Handles serializing RPC messages to and from MessagePack
7
- #
8
- # @api private
9
- class Serializer
10
- include Logging
11
-
12
- def initialize(unpacker = MessagePack::Unpacker.new)
13
- @unpacker = unpacker
14
- end
15
-
16
- # Serialize an RPC message
17
- def write(obj)
18
- log(:debug) { {:object => obj} }
19
- yield MessagePack.pack(obj)
20
- end
21
-
22
- def read(bytes)
23
- @unpacker.feed_each(bytes) do |obj|
24
- log(:debug) { {:object => obj} }
25
- yield obj
26
- end
27
- end
28
-
29
- def register_type(id, &block)
30
- @unpacker.register_type(id) do |data|
31
- index = MessagePack.unpack(data)
32
- block.call(index)
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,37 +0,0 @@
1
- " python3 plugins
2
-
3
-
4
- " ruby plugins
5
- call remote#host#RegisterPlugin('ruby', './runtime/rplugin/ruby/autocmds.rb', [
6
- \ {'sync': v:false, 'name': 'BufEnter', 'type': 'autocmd', 'opts': {'pattern': '*.rb'}},
7
- \ {'sync': v:false, 'name': 'BufEnter', 'type': 'autocmd', 'opts': {'pattern': '*.c', 'eval': 'g:to_eval'}},
8
- \ ])
9
- call remote#host#RegisterPlugin('ruby', './runtime/rplugin/ruby/commands.rb', [
10
- \ {'sync': v:false, 'name': 'RPluginCommandNargs0', 'type': 'command', 'opts': {}},
11
- \ {'sync': v:false, 'name': 'RPluginCommandNargs1', 'type': 'command', 'opts': {'nargs': 1}},
12
- \ {'sync': v:false, 'name': 'RPluginCommandNargsN', 'type': 'command', 'opts': {'nargs': '*'}},
13
- \ {'sync': v:false, 'name': 'RPluginCommandNargsQ', 'type': 'command', 'opts': {'nargs': '?'}},
14
- \ {'sync': v:false, 'name': 'RPluginCommandNargsP', 'type': 'command', 'opts': {'nargs': '+'}},
15
- \ {'sync': v:false, 'name': 'RPluginCommandRange', 'type': 'command', 'opts': {'range': ''}},
16
- \ {'sync': v:false, 'name': 'RPluginCommandRangeP', 'type': 'command', 'opts': {'range': '%'}},
17
- \ {'sync': v:false, 'name': 'RPluginCommandRangeN', 'type': 'command', 'opts': {'range': '1'}},
18
- \ {'sync': v:false, 'name': 'RPluginCommandCountN', 'type': 'command', 'opts': {'count': 1}},
19
- \ {'sync': v:false, 'name': 'RPluginCommandBang', 'type': 'command', 'opts': {'bang': ''}},
20
- \ {'sync': v:false, 'name': 'RPluginCommandRegister', 'type': 'command', 'opts': {'register': ''}},
21
- \ {'sync': v:false, 'name': 'RPluginCommandCompletion', 'type': 'command', 'opts': {'complete': 'buffer'}},
22
- \ {'sync': v:false, 'name': 'RPluginCommandEval', 'type': 'command', 'opts': {'eval': 'g:to_eval'}},
23
- \ {'sync': v:true, 'name': 'RPluginCommandSync', 'type': 'command', 'opts': {}},
24
- \ {'sync': v:true, 'name': 'RPluginCommandRecursive', 'type': 'command', 'opts': {'nargs': 1}},
25
- \ ])
26
- call remote#host#RegisterPlugin('ruby', './runtime/rplugin/ruby/functions.rb', [
27
- \ {'sync': v:false, 'name': 'RPluginFunctionArgs', 'type': 'function', 'opts': {}},
28
- \ {'sync': v:false, 'name': 'RPluginFunctionRange', 'type': 'function', 'opts': {'range': ''}},
29
- \ {'sync': v:false, 'name': 'RPluginFunctionEval', 'type': 'function', 'opts': {'eval': 'g:to_eval'}},
30
- \ {'sync': v:true, 'name': 'RPluginFunctionSync', 'type': 'function', 'opts': {}},
31
- \ {'sync': v:true, 'name': 'RPluginFunctionRecursive', 'type': 'function', 'opts': {'nargs': 1}},
32
- \ ])
33
-
34
-
35
- " python plugins
36
-
37
-
@@ -1,89 +0,0 @@
1
- require "helper"
2
-
3
- module Neovim
4
- class EventLoop
5
- RSpec.describe Connection do
6
- let(:nil_io) { StringIO.new }
7
-
8
- describe "#write" do
9
- it "writes to the underlying file descriptor" do
10
- rd, wr = IO.pipe
11
- connection = Connection.new(nil_io, wr)
12
- connection.write("some data")
13
- wr.close
14
-
15
- expect(rd.read).to eq("some data")
16
- end
17
-
18
- it "writes large amounts of data" do
19
- port = Support.tcp_port
20
-
21
- server_thr = Thread.new do
22
- read_result = ""
23
-
24
- TCPServer.open("127.0.0.1", port) do |server|
25
- client = server.accept
26
-
27
- loop do
28
- begin
29
- read_result << client.readpartial(1024 * 16)
30
- rescue EOFError
31
- break
32
- end
33
- end
34
- client.close
35
- end
36
-
37
- read_result
38
- end
39
-
40
- begin
41
- socket = Socket.tcp("127.0.0.1", port)
42
- rescue Errno::ECONNREFUSED
43
- retry
44
- end
45
-
46
- big_data = Array.new(1024 * 16) { SecureRandom.hex(4) }.join
47
- connection = Connection.new(nil_io, socket)
48
-
49
- connection.write(big_data)
50
- socket.close
51
- expect(server_thr.value).to eq(big_data)
52
- end
53
- end
54
-
55
- describe "#read" do
56
- it "yields data from the underlying file descriptor" do
57
- rd, wr = IO.pipe
58
- wr.write("some data")
59
- wr.close
60
-
61
- connection = Connection.new(rd, nil_io)
62
-
63
- expect do |y|
64
- connection.read(&y)
65
- end.to yield_with_args("some data")
66
- end
67
- end
68
-
69
- describe "#close" do
70
- it "closes IO handles" do
71
- rd, wr = ::IO.pipe
72
- Connection.new(rd, wr).close
73
-
74
- expect(rd).to be_closed
75
- expect(wr).to be_closed
76
- end
77
-
78
- it "kills spawned processes" do
79
- io = ::IO.popen("cat", "rb+")
80
- pid = io.pid
81
- expect(pid).to respond_to(:to_int)
82
-
83
- Connection.new(io, nil_io).close
84
- expect { Process.kill(0, pid) }.to raise_error(Errno::ESRCH)
85
- end
86
- end
87
- end
88
- end
89
- end