neovim 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/Gemfile +1 -0
- data/README.md +6 -2
- data/Rakefile +4 -72
- data/bin/neovim-ruby-host +3 -2
- data/lib/neovim.rb +4 -16
- data/lib/neovim/buffer.rb +21 -0
- data/lib/neovim/client.rb +35 -0
- data/lib/neovim/host.rb +6 -4
- data/lib/neovim/host/loader.rb +2 -0
- data/lib/neovim/line_range.rb +1 -1
- data/lib/neovim/logging.rb +8 -7
- data/lib/neovim/plugin/dsl.rb +1 -1
- data/lib/neovim/ruby_provider.rb +7 -10
- data/lib/neovim/ruby_provider/buffer_ext.rb +3 -3
- data/lib/neovim/ruby_provider/vim.rb +6 -1
- data/lib/neovim/ruby_provider/window_ext.rb +3 -3
- data/lib/neovim/session.rb +2 -2
- data/lib/neovim/session/api.rb +7 -1
- data/lib/neovim/session/event_loop.rb +4 -12
- data/lib/neovim/session/serializer.rb +2 -2
- data/lib/neovim/tabpage.rb +6 -0
- data/lib/neovim/version.rb +1 -1
- data/lib/neovim/window.rb +19 -1
- data/script/generate_docs +71 -0
- data/{bin → script}/j2mp +0 -0
- data/{bin → script}/mp2j +0 -0
- data/spec/acceptance/neovim-ruby-host_spec.rb +1 -6
- data/spec/acceptance/ruby_provider_spec.rb +17 -33
- data/spec/helper.rb +42 -37
- data/spec/neovim/buffer_spec.rb +1 -1
- data/spec/neovim/client_spec.rb +1 -1
- data/spec/neovim/current_spec.rb +1 -1
- data/spec/neovim/host/loader_spec.rb +2 -0
- data/spec/neovim/host_spec.rb +25 -5
- data/spec/neovim/line_range_spec.rb +2 -2
- data/spec/neovim/logging_spec.rb +56 -0
- data/spec/neovim/plugin_spec.rb +9 -0
- data/spec/neovim/remote_object_spec.rb +5 -1
- data/spec/neovim/ruby_provider/buffer_ext_spec.rb +5 -5
- data/spec/neovim/ruby_provider/vim_spec.rb +32 -0
- data/spec/neovim/ruby_provider/window_ext_spec.rb +22 -8
- data/spec/neovim/session/api_spec.rb +24 -5
- data/spec/neovim/session/event_loop_spec.rb +54 -1
- data/spec/neovim/session/notification_spec.rb +20 -0
- data/spec/neovim/session/request_spec.rb +36 -0
- data/spec/neovim/session/rpc_spec.rb +12 -0
- data/spec/neovim/session/serializer_spec.rb +14 -0
- data/spec/neovim/session_spec.rb +4 -4
- data/spec/neovim/window_spec.rb +17 -1
- data/spec/neovim_spec.rb +4 -20
- metadata +13 -4
data/{bin → script}/j2mp
RENAMED
File without changes
|
data/{bin → script}/mp2j
RENAMED
File without changes
|
@@ -15,17 +15,12 @@ RSpec.describe "neovim-ruby-host" do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
it "fails when attached to a TTY" do
|
18
|
-
yielded = false
|
19
|
-
|
20
18
|
PTY.spawn(host_exe) do |rd, wr, pid|
|
21
|
-
yielded = true
|
22
19
|
expect(rd.gets).to match(/can't run.+interactively/i)
|
23
20
|
|
24
21
|
_, status = Process.waitpid2(pid)
|
25
22
|
expect(status.exitstatus).to be(1)
|
26
23
|
end
|
27
|
-
|
28
|
-
expect(yielded).to be(true)
|
29
24
|
end
|
30
25
|
|
31
26
|
it "loads and runs plugins from Ruby source files" do
|
@@ -46,7 +41,7 @@ RSpec.describe "neovim-ruby-host" do
|
|
46
41
|
end
|
47
42
|
RUBY
|
48
43
|
|
49
|
-
nvim = Neovim.attach_child(
|
44
|
+
nvim = Neovim.attach_child(Support.child_argv)
|
50
45
|
|
51
46
|
nvim.command("let host = rpcstart('#{host_exe}', ['#{plugin_path}'])")
|
52
47
|
|
@@ -2,7 +2,7 @@ require "helper"
|
|
2
2
|
|
3
3
|
RSpec.describe "ruby_provider" do
|
4
4
|
let!(:nvim) do
|
5
|
-
Neovim.attach_child(
|
5
|
+
Neovim.attach_child(Support.child_argv)
|
6
6
|
end
|
7
7
|
|
8
8
|
around do |spec|
|
@@ -15,15 +15,14 @@ RSpec.describe "ruby_provider" do
|
|
15
15
|
begin
|
16
16
|
spec.run
|
17
17
|
ensure
|
18
|
-
nvim.
|
18
|
+
nvim.shutdown
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
describe "ruby_execute" do
|
23
|
-
it "
|
24
|
-
ruby = "VIM.
|
23
|
+
it "exposes the VIM constant" do
|
24
|
+
ruby = "VIM.equal?(Vim) || raise".inspect
|
25
25
|
nvim.eval("rpcrequest(host, 'ruby_execute', #{ruby})")
|
26
|
-
expect(nvim.eval("g:myvar")).to eq([1, 2])
|
27
26
|
end
|
28
27
|
|
29
28
|
it "exposes the $curwin variable" do
|
@@ -43,31 +42,31 @@ RSpec.describe "ruby_provider" do
|
|
43
42
|
end
|
44
43
|
|
45
44
|
it "persists state between requests" do
|
46
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', 'def foo;
|
45
|
+
nvim.eval("rpcrequest(host, 'ruby_execute', 'def foo; Vim.command(\"let g:called = 1\"); end')")
|
47
46
|
expect { nvim.get_var("called") }.to raise_error(/key not found/i)
|
48
47
|
|
49
48
|
nvim.eval("rpcrequest(host, 'ruby_execute', 'foo')")
|
50
49
|
expect(nvim.get_var("called")).to be(1)
|
51
50
|
end
|
52
51
|
|
53
|
-
it "persists instance state in
|
52
|
+
it "persists instance state in $curbuf" do
|
54
53
|
nvim.eval("rpcrequest(host, 'ruby_execute', '$curbuf.instance_variable_set(:@foo, 123)')")
|
55
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', '
|
54
|
+
nvim.eval("rpcrequest(host, 'ruby_execute', 'Vim.command(\"let g:foo = \#{$curbuf.instance_variable_get(:@foo)}\")')")
|
56
55
|
|
57
56
|
expect(nvim.get_var("foo")).to be(123)
|
58
|
-
|
59
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', '$curwin.instance_variable_set(:@bar, 456)')")
|
60
|
-
nvim.eval("rpcrequest(host, 'ruby_execute', 'VIM.command(\"let g:bar = \#{$curwin.instance_variable_get(:@bar)}\")')")
|
61
|
-
|
62
|
-
expect(nvim.get_var("bar")).to be(456)
|
63
57
|
end
|
64
58
|
end
|
65
59
|
|
66
60
|
describe "ruby_execute_file" do
|
67
61
|
let(:script_path) { Support.file_path("script.rb") }
|
68
62
|
|
63
|
+
it "exposes the VIM constant" do
|
64
|
+
File.write(script_path, "VIM.equal?(Vim) || raise")
|
65
|
+
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
66
|
+
end
|
67
|
+
|
69
68
|
it "runs ruby from a file" do
|
70
|
-
File.write(script_path, "
|
69
|
+
File.write(script_path, "Vim.command('let myvar = [1, 2]')")
|
71
70
|
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
72
71
|
expect(nvim.eval("g:myvar")).to eq([1, 2])
|
73
72
|
end
|
@@ -90,7 +89,7 @@ RSpec.describe "ruby_provider" do
|
|
90
89
|
end
|
91
90
|
|
92
91
|
it "persists state between requests" do
|
93
|
-
File.write(script_path, "def foo;
|
92
|
+
File.write(script_path, "def foo; Vim.command(\"let g:called = 1\"); end")
|
94
93
|
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
95
94
|
expect { nvim.get_var("called") }.to raise_error(/key not found/i)
|
96
95
|
|
@@ -100,7 +99,7 @@ RSpec.describe "ruby_provider" do
|
|
100
99
|
|
101
100
|
it "can run the same file multiple times" do
|
102
101
|
nvim.set_var("called", 0)
|
103
|
-
File.write(script_path, "
|
102
|
+
File.write(script_path, "Vim.command(\"let g:called += 1\")")
|
104
103
|
|
105
104
|
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
106
105
|
expect(nvim.get_var("called")).to be(1)
|
@@ -109,14 +108,14 @@ RSpec.describe "ruby_provider" do
|
|
109
108
|
expect(nvim.get_var("called")).to be(2)
|
110
109
|
end
|
111
110
|
|
112
|
-
it "persists instance state in
|
111
|
+
it "persists instance state in $curbuf" do
|
113
112
|
File.write(script_path, <<-RUBY)
|
114
113
|
def $curbuf.foo
|
115
114
|
@foo ||= 0
|
116
115
|
@foo += 1
|
117
116
|
end
|
118
117
|
|
119
|
-
|
118
|
+
Vim.command("let g:foo = \#{$curbuf.foo}")
|
120
119
|
RUBY
|
121
120
|
|
122
121
|
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
@@ -124,21 +123,6 @@ RSpec.describe "ruby_provider" do
|
|
124
123
|
|
125
124
|
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
126
125
|
expect(nvim.get_var("foo")).to be(2)
|
127
|
-
|
128
|
-
File.write(script_path, <<-RUBY)
|
129
|
-
def $curwin.bar
|
130
|
-
@bar ||= 0
|
131
|
-
@bar += 1
|
132
|
-
end
|
133
|
-
|
134
|
-
VIM.command("let g:bar = \#{$curwin.bar}")
|
135
|
-
RUBY
|
136
|
-
|
137
|
-
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
138
|
-
expect(nvim.get_var("bar")).to be(1)
|
139
|
-
|
140
|
-
nvim.eval("rpcrequest(host, 'ruby_execute_file', '#{script_path}')")
|
141
|
-
expect(nvim.get_var("bar")).to be(2)
|
142
126
|
end
|
143
127
|
end
|
144
128
|
|
data/spec/helper.rb
CHANGED
@@ -1,16 +1,53 @@
|
|
1
1
|
require "bundler/setup"
|
2
|
+
|
3
|
+
if ENV["REPORT_COVERAGE"]
|
4
|
+
require "coveralls"
|
5
|
+
Coveralls.wear!
|
6
|
+
end
|
7
|
+
|
8
|
+
require "fileutils"
|
2
9
|
require "neovim"
|
3
10
|
require "pry"
|
4
11
|
require "stringio"
|
5
12
|
require "timeout"
|
6
|
-
require "fileutils"
|
7
13
|
|
8
|
-
|
9
|
-
|
10
|
-
|
14
|
+
module Support
|
15
|
+
def self.workspace
|
16
|
+
File.expand_path("../workspace", __FILE__)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.socket_path
|
20
|
+
file_path("nvim.sock")
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.tcp_port
|
24
|
+
server = TCPServer.new("0.0.0.0", 0)
|
25
|
+
|
26
|
+
begin
|
27
|
+
server.addr[1]
|
28
|
+
ensure
|
29
|
+
server.close
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.file_path(name)
|
34
|
+
File.join(workspace, name)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.setup_workspace
|
38
|
+
FileUtils.mkdir_p(workspace)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.teardown_workspace
|
42
|
+
FileUtils.rm_rf(workspace)
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.child_argv
|
46
|
+
["nvim", "--headless", "-i", "NONE", "-u", "NONE", "-n"]
|
47
|
+
end
|
11
48
|
end
|
12
49
|
|
13
|
-
unless system("
|
50
|
+
unless system("#{Support.child_argv.join(" ")} +q")
|
14
51
|
warn("Can't find `nvim` executable. See installation instructions:")
|
15
52
|
warn("https://github.com/neovim/neovim/wiki/Installing-Neovim")
|
16
53
|
exit(1)
|
@@ -49,36 +86,4 @@ RSpec.configure do |config|
|
|
49
86
|
Kernel.srand config.seed
|
50
87
|
end
|
51
88
|
|
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
|
-
|
84
89
|
Thread.abort_on_exception = true
|
data/spec/neovim/buffer_spec.rb
CHANGED
data/spec/neovim/client_spec.rb
CHANGED
data/spec/neovim/current_spec.rb
CHANGED
data/spec/neovim/host_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "helper"
|
2
|
+
require "neovim/host"
|
2
3
|
|
3
4
|
module Neovim
|
4
5
|
RSpec.describe Host do
|
@@ -6,17 +7,36 @@ module Neovim
|
|
6
7
|
let(:client) { instance_double(Client) }
|
7
8
|
let(:host) { Host.new(session, client) }
|
8
9
|
|
9
|
-
describe ".
|
10
|
-
it "
|
10
|
+
describe ".run" do
|
11
|
+
it "loads plugins and runs the host event loop" do
|
11
12
|
paths = ["/foo", "/bar"]
|
13
|
+
|
14
|
+
expect(Host).to receive(:new).and_return(host)
|
15
|
+
expect(host).to receive(:run)
|
16
|
+
|
12
17
|
loader = instance_double(Host::Loader)
|
13
18
|
|
19
|
+
expect(loader).to receive(:load).with(paths)
|
14
20
|
expect(Host::Loader).to receive(:new).
|
15
|
-
with(
|
21
|
+
with(host).
|
16
22
|
and_return(loader)
|
17
|
-
expect(loader).to receive(:load).with(paths)
|
18
23
|
|
19
|
-
Host.
|
24
|
+
Host.run(paths, :session => session, :client => client)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#run" do
|
29
|
+
it "runs the session event loop and handles messages" do
|
30
|
+
message = double(:message)
|
31
|
+
expect(session).to receive(:run).and_yield(message)
|
32
|
+
expect(host).to receive(:handle).with(message)
|
33
|
+
|
34
|
+
host.run
|
35
|
+
end
|
36
|
+
|
37
|
+
it "rescues session exceptions", :silence_logging do
|
38
|
+
expect(session).to receive(:run).and_raise("BOOM")
|
39
|
+
expect { host.run }.not_to raise_error
|
20
40
|
end
|
21
41
|
end
|
22
42
|
|
@@ -2,7 +2,7 @@ require "helper"
|
|
2
2
|
|
3
3
|
module Neovim
|
4
4
|
RSpec.describe LineRange do
|
5
|
-
let(:client) { Neovim.attach_child(
|
5
|
+
let(:client) { Neovim.attach_child(Support.child_argv) }
|
6
6
|
let(:buffer) { client.current.buffer }
|
7
7
|
let(:line_range) { LineRange.new(buffer, 0, -1) }
|
8
8
|
let(:sub_range) { LineRange.new(buffer, 1, 2) }
|
@@ -18,7 +18,7 @@ module Neovim
|
|
18
18
|
|
19
19
|
it "is enumerable" do
|
20
20
|
expect(line_range).to be_an(Enumerable)
|
21
|
-
expect(line_range).to
|
21
|
+
expect(line_range.each.to_a).to eq(["1", "2", "3", "4"])
|
22
22
|
end
|
23
23
|
|
24
24
|
describe "#to_a" do
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
module Neovim
|
4
|
+
RSpec.describe Logging do
|
5
|
+
around do |spec|
|
6
|
+
old_logger = Logging.logger
|
7
|
+
|
8
|
+
begin
|
9
|
+
Logging.send(:remove_instance_variable, :@logger)
|
10
|
+
spec.run
|
11
|
+
ensure
|
12
|
+
Logging.logger = old_logger
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe ".logger" do
|
17
|
+
it "fetches the output from $NVIM_RUBY_LOG_FILE" do
|
18
|
+
logger = instance_double(Logger, :level= => nil)
|
19
|
+
expect(Logger).to receive(:new).with("/tmp/nvim.log").and_return(logger)
|
20
|
+
Logging.logger("NVIM_RUBY_LOG_FILE" => "/tmp/nvim.log")
|
21
|
+
expect(Logging.logger).to be(logger)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "defaults the output to STDERR" do
|
25
|
+
logger = instance_double(Logger, :level= => nil)
|
26
|
+
expect(Logger).to receive(:new).with(STDERR).and_return(logger)
|
27
|
+
Logging.logger({})
|
28
|
+
expect(Logging.logger).to be(logger)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "fetches the level from $NVIM_RUBY_LOG_LEVEL as a string" do
|
32
|
+
logger = instance_double(Logger)
|
33
|
+
expect(Logger).to receive(:new).and_return(logger)
|
34
|
+
expect(logger).to receive(:level=).with(Logger::DEBUG)
|
35
|
+
Logging.logger("NVIM_RUBY_LOG_LEVEL" => "DEBUG")
|
36
|
+
expect(Logging.logger).to be(logger)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "fetches the level from $NVIM_RUBY_LOG_LEVEL as an integer" do
|
40
|
+
logger = instance_double(Logger)
|
41
|
+
expect(Logger).to receive(:new).and_return(logger)
|
42
|
+
expect(logger).to receive(:level=).with(0)
|
43
|
+
Logging.logger("NVIM_RUBY_LOG_LEVEL" => "0")
|
44
|
+
expect(Logging.logger).to be(logger)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "defaults the level to WARN" do
|
48
|
+
logger = instance_double(Logger)
|
49
|
+
expect(Logger).to receive(:new).and_return(logger)
|
50
|
+
expect(logger).to receive(:level=).with(Logger::WARN)
|
51
|
+
Logging.logger({})
|
52
|
+
expect(Logging.logger).to be(logger)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/spec/neovim/plugin_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "helper"
|
2
|
+
require "neovim/plugin"
|
2
3
|
|
3
4
|
module Neovim
|
4
5
|
RSpec.describe Plugin do
|
@@ -13,6 +14,8 @@ module Neovim
|
|
13
14
|
expect(plugin.handlers.size).to be(1)
|
14
15
|
handler = plugin.handlers.first
|
15
16
|
|
17
|
+
expect(handler.sync?).to be(false)
|
18
|
+
expect(handler.qualified?).to be(true)
|
16
19
|
expect(handler.block).to eq(cmd_block)
|
17
20
|
expect(handler.qualified_name).to eq("source:command:Foo")
|
18
21
|
expect(handler.to_spec).to eq(
|
@@ -33,6 +36,8 @@ module Neovim
|
|
33
36
|
expect(plugin.handlers.size).to be(1)
|
34
37
|
handler = plugin.handlers.first
|
35
38
|
|
39
|
+
expect(handler.sync?).to be(false)
|
40
|
+
expect(handler.qualified?).to be(true)
|
36
41
|
expect(handler.block).to eq(au_block)
|
37
42
|
expect(handler.qualified_name).to eq("source:autocmd:BufEnter:*.rb")
|
38
43
|
expect(handler.to_spec).to eq(
|
@@ -53,6 +58,8 @@ module Neovim
|
|
53
58
|
expect(plugin.handlers.size).to be(1)
|
54
59
|
handler = plugin.handlers.first
|
55
60
|
|
61
|
+
expect(handler.sync?).to be(false)
|
62
|
+
expect(handler.qualified?).to be(true)
|
56
63
|
expect(handler.block).to eq(fun_block)
|
57
64
|
expect(handler.qualified_name).to eq("source:function:Foo")
|
58
65
|
expect(handler.to_spec).to eq(
|
@@ -73,6 +80,8 @@ module Neovim
|
|
73
80
|
expect(plugin.handlers.size).to be(1)
|
74
81
|
handler = plugin.handlers.first
|
75
82
|
|
83
|
+
expect(handler.sync?).to be(true)
|
84
|
+
expect(handler.qualified?).to be(false)
|
76
85
|
expect(handler.block).to eq(cmd_block)
|
77
86
|
expect(handler.qualified_name).to eq("Foo")
|
78
87
|
end
|