neovim 0.3.0 → 0.3.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.
- 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
|