neovim 0.0.4 → 0.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6d788e73532acb46ec8b33b5391fb1a1077bd69d
4
- data.tar.gz: 3456c2d23d5f98802b0bbb2ac29612e20a51e11c
3
+ metadata.gz: 92074f47bd93b7fbca51aa3b74e813adb8b1004c
4
+ data.tar.gz: 2c19393d6a5c38342bc30350e5c5da352fff101c
5
5
  SHA512:
6
- metadata.gz: fa3098403bd3e78a7b56eaf21f8810190d1cb34b17fd8365cfe424537294440b99351d67b33408e3d1f4b094cd2013f193be87b1eb66db6f4d4c6b59cb9e084a
7
- data.tar.gz: 5a12541cec062aa8643decc49b580aa76c562f734d1319ce77e8284a503b2b37a6afa9eb075abbe9e2d97278a003a301ea2d51dc469bc05713f1bc121b25e3e1
6
+ metadata.gz: 0c22b67f54f42edcdbc7a062ff972725508c69810627dd51e3c5ece458dd9c1187cc6e87149044dd4786302181297d5ebc3acb8ed4b29a33c069e2c61c0cb52b
7
+ data.tar.gz: 3c9dc7fc608a08a0db6ed8a9174b93b5487163745661174c883fe2726be02259e448b1e3e8c79bfda25b082d012e27bdc5fc22fed78e2e826f7395faf669a0f8
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ spec/reports
16
16
  test/tmp
17
17
  test/version_tmp
18
18
  tmp
19
+ spec/workspace
@@ -27,4 +27,4 @@ addons:
27
27
 
28
28
  env: REPORT_COVERAGE=1
29
29
  before_script: travis_retry bundle exec rake neovim:install
30
- script: travis_retry bundle exec rake
30
+ script: bundle exec rake
data/README.md CHANGED
@@ -42,34 +42,31 @@ The client's interface is generated at runtime from the `vim_get_api_info` RPC c
42
42
  The `neovim-ruby-host` executable can be used to spawn Ruby plugins via the `rpcstart` command. A plugin can be defined like this:
43
43
 
44
44
  ```ruby
45
- # my_plugin.rb
45
+ # $VIMRUNTIME/rplugin/ruby/my_plugin.rb
46
46
 
47
47
  Neovim.plugin do |plug|
48
- # Define a command called "Add" which returns the sum of two numbers
49
- # The `:sync => true` option tells nvim to wait for a response.
50
- # The result of the block will be returned to nvim.
51
- plug.command(:Add, :nargs => 2, :sync => true) do |nvim, x, y|
52
- x + y
53
- end
54
-
55
- # Define a command called "SetLine" which sets the current line
56
- # This command is asynchronous, so nvim won't wait for a response.
48
+ # Define a command called "SetLine" which sets the current line to the sum of
49
+ # two values. This command is executed asynchronously, so the return value is
50
+ # ignored.
57
51
  plug.command(:SetLine, :nargs => 1) do |nvim, str|
58
52
  nvim.current.line = str
59
53
  end
60
- end
61
- ```
62
-
63
- You can start this plugin via the `rpcstart` nvim function. The resulting channel ID can be used to send requests and notifications to the plugin.
64
54
 
65
- ```viml
66
- let host = rpcstart("neovim-ruby-host", ["./my_plugin.rb"])
55
+ # Define a function called "Sum" which sets the current line. This function
56
+ # is executed synchronously, so the result of the block will be returned to
57
+ # nvim.
58
+ plug.function(:Sum, :nargs => 2, :sync => true) do |nvim, x, y|
59
+ x + y
60
+ end
67
61
 
68
- let result = rpcrequest(host, "Add", 1, 2) " result is set to 3
69
- call rpcnotify(host, "SetLine", "Foo") " current line is set to 'Foo'
62
+ # Define an autocmd for the BufEnter event on Ruby files.
63
+ plug.autocmd(:BufEnter, :pattern => "*.rb") do |nvim|
64
+ nvim.command("echom 'Ruby file, eh?'")
65
+ end
66
+ end
70
67
  ```
71
68
 
72
- Plugin functionality is very limited right now. Besides `command`, the plugin DSL exposes the `function` and `autocmd` directives, however they are functionally almost identical to `command`. Their purpose is to define a manifest that nvim can load via the `UpdateRemotePlugins` command, which will generate the actual `command`, `function`, and `autocmd` definitions. This piece has not yet been implemented.
69
+ After a call to `:UpdateRemotePlugins`, plugins will be auto-loaded from the `$VIMRUNTIME/rplugin/ruby` directory.
73
70
 
74
71
  ## Contributing
75
72
 
@@ -35,7 +35,13 @@ module Neovim
35
35
  end
36
36
  end
37
37
 
38
+ def self.logger=(logger)
39
+ Logging.logger = logger
40
+ end
38
41
 
42
+ def self.logger
43
+ Logging.logger
44
+ end
39
45
 
40
46
  def self.attach_event_loop(event_loop)
41
47
  msgpack_stream = MsgpackStream.new(event_loop)
@@ -1,8 +1,11 @@
1
+ require "neovim/logging"
1
2
  require "neovim/request"
2
3
  require "neovim/notification"
3
4
 
4
5
  module Neovim
5
6
  class AsyncSession
7
+ include Logging
8
+
6
9
  def initialize(msgpack_stream)
7
10
  @msgpack_stream = msgpack_stream
8
11
  @request_id = 0
@@ -49,6 +52,9 @@ module Neovim
49
52
  end
50
53
 
51
54
  @msgpack_stream.run(msg_cb, setup_cb)
55
+ rescue => e
56
+ fatal("got unexpected error #{e}")
57
+ debug(e.backtrace.join("\n"))
52
58
  end
53
59
  end
54
60
  end
@@ -10,5 +10,14 @@ module Neovim
10
10
  def lines=(arr)
11
11
  lines[0..-1] = arr
12
12
  end
13
+
14
+ def range
15
+ @range ||= LineRange.new(self, 0, -1)
16
+ end
17
+
18
+ def range=(_range)
19
+ _end = _range.exclude_end? ? _range.end - 1 : _range.end
20
+ @range = LineRange.new(self, _range.begin, _end)
21
+ end
13
22
  end
14
23
  end
@@ -42,14 +42,5 @@ module Neovim
42
42
  tabpage = Tabpage.new(tabpage_index, @session)
43
43
  @session.request(:vim_set_current_tabpage, tabpage)
44
44
  end
45
-
46
- def range
47
- @range ||= LineRange.new(buffer, 0, -1)
48
- end
49
-
50
- def range=(_range)
51
- _end = _range.exclude_end? ? _range.end - 1 : _range.end
52
- @range = LineRange.new(buffer, _range.begin, _end)
53
- end
54
45
  end
55
46
  end
@@ -1,7 +1,10 @@
1
+ require "neovim/logging"
1
2
  require "socket"
2
3
 
3
4
  module Neovim
4
5
  class EventLoop
6
+ include Logging
7
+
5
8
  def self.tcp(host, port)
6
9
  socket = TCPSocket.new(host, port)
7
10
  new(socket, socket)
@@ -30,6 +33,7 @@ module Neovim
30
33
  def send(data)
31
34
  start = 0
32
35
  size = data.size
36
+ debug("sending #{data.inspect}")
33
37
 
34
38
  begin
35
39
  while start < size
@@ -48,9 +52,15 @@ module Neovim
48
52
 
49
53
  loop do
50
54
  break unless @running
51
- message_callback.call(@rd.readpartial(1024 * 16))
55
+ message = @rd.readpartial(1024 * 16)
56
+ debug("received #{message.inspect}")
57
+ message_callback.call(message)
52
58
  end
53
59
  rescue EOFError
60
+ warn("got EOFError")
61
+ rescue => e
62
+ fatal("got unexpected error #{e}")
63
+ debug(e.backtrace.join("\n"))
54
64
  end
55
65
  end
56
66
  end
@@ -1,7 +1,12 @@
1
+ require "neovim/logging"
1
2
  require "neovim/manifest"
2
3
 
3
4
  module Neovim
4
5
  class Host
6
+ include Logging
7
+
8
+ attr_reader :manifest
9
+
5
10
  def self.load_from_files(rplugin_paths, target_manifest=Manifest.new)
6
11
  old_manifest = Neovim.__configured_plugin_manifest
7
12
  old_path = Neovim.__configured_plugin_path
@@ -21,8 +26,6 @@ module Neovim
21
26
  end
22
27
  end
23
28
 
24
- attr_reader :manifest
25
-
26
29
  def initialize(manifest)
27
30
  @manifest = manifest
28
31
  @event_loop = EventLoop.stdio
@@ -32,10 +35,14 @@ module Neovim
32
35
 
33
36
  def run
34
37
  callback = Proc.new do |msg|
38
+ debug("received #{msg.inspect}")
35
39
  @manifest.handle(msg, client)
36
40
  end
37
41
 
38
42
  @async_session.run(callback, callback)
43
+ rescue => e
44
+ fatal("got unexpected error #{e}")
45
+ debug(e.backtrace.join("\n"))
39
46
  end
40
47
 
41
48
  private
@@ -0,0 +1,50 @@
1
+ require "logger"
2
+ require "stringio"
3
+
4
+ module Neovim
5
+ module Logging
6
+ class << self
7
+ attr_writer :logger
8
+ end
9
+
10
+ def self.logger
11
+ return @logger if instance_variable_defined?(:@logger)
12
+
13
+ if ENV["NVIM_RUBY_LOG_FILE"]
14
+ @logger = Logger.new(ENV["NVIM_RUBY_LOG_FILE"])
15
+ else
16
+ @logger = Logger.new(STDERR)
17
+ end
18
+
19
+ if ENV["NVIM_RUBY_LOG_LEVEL"]
20
+ @logger.level = Integer(ENV["NVIM_RUBY_LOG_LEVEL"])
21
+ else
22
+ @logger.level = Logger::WARN
23
+ end
24
+
25
+ @logger
26
+ end
27
+
28
+ private
29
+
30
+ def fatal(msg)
31
+ logger.fatal(self.class) { msg }
32
+ end
33
+
34
+ def warn(msg)
35
+ logger.warn(self.class) { msg }
36
+ end
37
+
38
+ def info(msg)
39
+ logger.info(self.class) { msg }
40
+ end
41
+
42
+ def debug(msg)
43
+ logger.debug(self.class) { msg }
44
+ end
45
+
46
+ def logger
47
+ Logging.logger
48
+ end
49
+ end
50
+ end
@@ -1,5 +1,9 @@
1
+ require "neovim/logging"
2
+
1
3
  module Neovim
2
4
  class Manifest
5
+ include Logging
6
+
3
7
  attr_reader :handlers, :specs
4
8
 
5
9
  def initialize
@@ -19,16 +23,23 @@ module Neovim
19
23
  def handle(msg, client)
20
24
  default_handler = msg.sync? ? default_sync_handler : default_async_handler
21
25
  @handlers.fetch(msg.method_name, default_handler).call(client, msg)
26
+ rescue => e
27
+ fatal("got unexpected error #{e}")
28
+ debug(e.backtrace.join("\n"))
22
29
  end
23
30
 
24
31
  private
25
32
 
26
33
  def poll_handler
27
- @poll_handler ||= Proc.new { |_, req| req.respond("ok") }
34
+ @poll_handler ||= Proc.new do |_, req|
35
+ debug("received 'poll' request #{req.inspect}")
36
+ req.respond("ok")
37
+ end
28
38
  end
29
39
 
30
40
  def specs_handler
31
41
  @specs_handler ||= Proc.new do |_, req|
42
+ debug("received 'specs' request #{req.inspect}")
32
43
  source = req.arguments.fetch(0)
33
44
 
34
45
  if @specs.key?(source)
@@ -49,13 +60,15 @@ module Neovim
49
60
 
50
61
  def wrap_sync(handler)
51
62
  Proc.new do |client, request|
52
- request.respond(handler.call(client, *request.arguments))
63
+ debug("received #{request.inspect}")
64
+ request.respond(handler.call(client, *request.arguments[0]))
53
65
  end
54
66
  end
55
67
 
56
68
  def wrap_async(handler)
57
69
  Proc.new do |client, notification|
58
- handler.call(client, *notification.arguments)
70
+ debug("received #{notification.inspect}")
71
+ handler.call(client, *notification.arguments[0])
59
72
  end
60
73
  end
61
74
  end
@@ -1,7 +1,10 @@
1
+ require "neovim/logging"
1
2
  require "msgpack"
2
3
 
3
4
  module Neovim
4
5
  class MsgpackStream
6
+ include Logging
7
+
5
8
  def initialize(event_loop)
6
9
  @event_loop = event_loop
7
10
  @unpacker = MessagePack::Unpacker.new
@@ -19,6 +22,7 @@ module Neovim
19
22
  end
20
23
 
21
24
  def send(msg)
25
+ debug("sending #{msg.inspect}")
22
26
  @event_loop.send(MessagePack.pack(msg))
23
27
  self
24
28
  end
@@ -26,11 +30,15 @@ module Neovim
26
30
  def run(message_cb, setup_cb=nil)
27
31
  data_cb = Proc.new do |data|
28
32
  @unpacker.feed_each(data) do |msg|
33
+ debug("received #{msg.inspect}")
29
34
  message_cb.call(msg)
30
35
  end
31
36
  end
32
37
 
33
38
  @event_loop.run(data_cb, setup_cb)
39
+ rescue => e
40
+ fatal("got unexpected error #{e}")
41
+ debug(e.backtrace.join("\n"))
34
42
  end
35
43
  end
36
44
  end
@@ -1,3 +1,3 @@
1
1
  module Neovim
2
- VERSION = Gem::Version.new("0.0.4")
2
+ VERSION = Gem::Version.new("0.0.5")
3
3
  end
@@ -3,47 +3,43 @@ require "tmpdir"
3
3
 
4
4
  RSpec.describe "neovim-ruby-host" do
5
5
  it "loads and runs plugins from Ruby source files" do
6
- Dir.mktmpdir do |pwd|
7
- Dir.chdir(pwd) do
8
- plugin1_path = File.expand_path("./plugin1.rb")
9
- File.write(plugin1_path, <<-RUBY)
10
- Neovim.plugin do |plug|
11
- plug.command(:SyncAdd, :args => 2, :sync => true) do |nvim, x, y|
12
- x + y
13
- end
14
- end
15
- RUBY
16
-
17
- plugin2_path = File.expand_path("./plugin2.rb")
18
- File.write(plugin2_path, <<-RUBY)
19
- Neovim.plugin do |plug|
20
- plug.command(:AsyncSetLine, :args => 1) do |nvim, str|
21
- nvim.current.line = str
22
- end
23
- end
24
- RUBY
25
-
26
- nvim = Neovim.attach_child(["--headless", "-u", "NONE", "-N", "-n"])
27
-
28
- host_exe = File.expand_path("../../../bin/neovim-ruby-host", __FILE__)
29
- nvim.command("let host = rpcstart('#{host_exe}', ['#{plugin1_path}', '#{plugin2_path}'])")
30
-
31
- expect(nvim.eval("rpcrequest(host, 'poll')")).to eq("ok")
32
- expect(nvim.eval("rpcrequest(host, '#{plugin1_path}:command:SyncAdd', 1, 2)")).to eq(3)
33
-
34
- expect {
35
- nvim.eval("rpcnotify(host, '#{plugin2_path}:command:AsyncSetLine', 'foo')")
36
- nvim.eval("rpcrequest(host, 'poll')")
37
- }.to change { nvim.current.buffer.lines.to_a }.from([""]).to(["foo"])
38
-
39
- expect {
40
- nvim.eval("rpcnotify(host, 'Unknown')")
41
- }.not_to raise_error
42
-
43
- expect {
44
- nvim.eval("call rpcrequest(host, 'Unknown')")
45
- }.to raise_error(ArgumentError)
6
+ plugin1_path = Support.file_path("plugin1.rb")
7
+ File.write(plugin1_path, <<-RUBY)
8
+ Neovim.plugin do |plug|
9
+ plug.command(:SyncAdd, :args => 2, :sync => true) do |nvim, x, y|
10
+ x + y
11
+ end
46
12
  end
47
- end
13
+ RUBY
14
+
15
+ plugin2_path = Support.file_path("plugin2.rb")
16
+ File.write(plugin2_path, <<-RUBY)
17
+ Neovim.plugin do |plug|
18
+ plug.command(:AsyncSetLine, :args => 1) do |nvim, str|
19
+ nvim.current.line = str
20
+ end
21
+ end
22
+ RUBY
23
+
24
+ nvim = Neovim.attach_child(["--headless", "-u", "NONE", "-N", "-n"])
25
+
26
+ host_exe = File.expand_path("../../../bin/neovim-ruby-host", __FILE__)
27
+ nvim.command("let host = rpcstart('#{host_exe}', ['#{plugin1_path}', '#{plugin2_path}'])")
28
+
29
+ expect(nvim.eval("rpcrequest(host, 'poll')")).to eq("ok")
30
+ expect(nvim.eval("rpcrequest(host, '#{plugin1_path}:command:SyncAdd', [1, 2])")).to eq(3)
31
+
32
+ expect {
33
+ nvim.eval("rpcnotify(host, '#{plugin2_path}:command:AsyncSetLine', ['foo'])")
34
+ nvim.eval("rpcrequest(host, 'poll')")
35
+ }.to change { nvim.current.buffer.lines.to_a }.from([""]).to(["foo"])
36
+
37
+ expect {
38
+ nvim.eval("rpcnotify(host, 'Unknown')")
39
+ }.not_to raise_error
40
+
41
+ expect {
42
+ nvim.eval("call rpcrequest(host, 'Unknown')")
43
+ }.to raise_error(ArgumentError)
48
44
  end
49
45
  end
@@ -1,8 +1,11 @@
1
1
  require "bundler/setup"
2
+ require "logger"
2
3
  require "neovim"
3
4
  require "pry"
4
5
  require "timeout"
5
6
 
7
+ require File.expand_path("../support.rb", __FILE__)
8
+
6
9
  if ENV["REPORT_COVERAGE"]
7
10
  require "coveralls"
8
11
  Coveralls.wear!
@@ -12,6 +15,10 @@ Thread.abort_on_exception = true
12
15
 
13
16
  ENV["NVIM_EXECUTABLE"] = File.expand_path("../../vendor/neovim/build/bin/nvim", __FILE__)
14
17
 
18
+ Neovim.logger = Logger.new(STDERR).tap do |logger|
19
+ logger.level = ENV.fetch("NVIM_RUBY_LOG_LEVEL", Logger::WARN).to_i
20
+ end
21
+
15
22
  RSpec.configure do |config|
16
23
  config.expect_with :rspec do |exp|
17
24
  exp.syntax = :expect
@@ -22,7 +29,12 @@ RSpec.configure do |config|
22
29
 
23
30
  Kernel.srand config.seed
24
31
 
25
- config.around do |spec|
26
- Timeout.timeout(5) { spec.run }
32
+ config.around(:example) do |spec|
33
+ Support.clean_workspace
34
+ Timeout.timeout(2) { spec.run }
35
+ end
36
+
37
+ config.after(:suite) do
38
+ Support.remove_workspace
27
39
  end
28
40
  end
@@ -7,7 +7,7 @@ module Neovim
7
7
  stream = MsgpackStream.new(event_loop)
8
8
  async = AsyncSession.new(stream)
9
9
 
10
- srv_thr = Thread.new do
10
+ server_thread = Thread.new do
11
11
  client = server.accept
12
12
  IO.select(nil, [client])
13
13
  client.write(MessagePack.pack(
@@ -25,7 +25,7 @@ module Neovim
25
25
 
26
26
  request = fiber.resume
27
27
 
28
- srv_thr.join
28
+ server_thread.join
29
29
 
30
30
  expect(request).to be_a(Request)
31
31
  expect(request.method_name).to eq("func")
@@ -36,7 +36,7 @@ module Neovim
36
36
  stream = MsgpackStream.new(event_loop)
37
37
  async = AsyncSession.new(stream)
38
38
 
39
- srv_thr = Thread.new do
39
+ server_thread = Thread.new do
40
40
  client = server.accept
41
41
  IO.select(nil, [client])
42
42
  client.write(MessagePack.pack(
@@ -54,7 +54,7 @@ module Neovim
54
54
 
55
55
  notification = fiber.resume
56
56
 
57
- srv_thr.join
57
+ server_thread.join
58
58
 
59
59
  expect(notification).to be_a(Notification)
60
60
  expect(notification.method_name).to eq("func")
@@ -66,7 +66,7 @@ module Neovim
66
66
  async = AsyncSession.new(stream)
67
67
  messages = []
68
68
 
69
- srv_thr = Thread.new do
69
+ server_thread = Thread.new do
70
70
  client = server.accept
71
71
  messages << client.readpartial(1024)
72
72
 
@@ -83,7 +83,7 @@ module Neovim
83
83
 
84
84
  expect(fiber.resume).to eq(["error", "result"])
85
85
 
86
- srv_thr.join
86
+ server_thread.join
87
87
 
88
88
  expect(messages).to eq(
89
89
  [MessagePack.pack([0, 0, "func", [1, 2, 3]])]
@@ -99,10 +99,8 @@ module Neovim
99
99
  end
100
100
 
101
101
  context "unix" do
102
- before { FileUtils.rm_f("/tmp/#$$.sock") }
103
- after { FileUtils.rm_f("/tmp/#$$.sock") }
104
- let!(:server) { UNIXServer.new("/tmp/#$$.sock") }
105
- let!(:event_loop) { EventLoop.unix("/tmp/#$$.sock") }
102
+ let!(:server) { UNIXServer.new(Support.socket_path) }
103
+ let!(:event_loop) { EventLoop.unix(Support.socket_path) }
106
104
 
107
105
  include_context "async session behavior"
108
106
  end
@@ -12,10 +12,24 @@ module Neovim
12
12
  end
13
13
 
14
14
  describe "#lines=" do
15
- it "updates the buffers lines" do
15
+ it "updates the buffer's lines" do
16
16
  buffer.lines = ["one", "two"]
17
17
  expect(buffer.lines.to_a).to eq(["one", "two"])
18
18
  end
19
19
  end
20
+
21
+ describe "#range" do
22
+ it "returns a LineRange" do
23
+ expect(buffer.range).to be_a(LineRange)
24
+ end
25
+ end
26
+
27
+ describe "#range=" do
28
+ it "updates the buffer's range" do
29
+ buffer.lines = ["one", "two", "three"]
30
+ buffer.range = (0..1)
31
+ expect(buffer.range.to_a).to eq(["one", "two"])
32
+ end
33
+ end
20
34
  end
21
35
  end
@@ -74,19 +74,5 @@ module Neovim
74
74
  }.to change { current.tabpage.index }.to(initial_index)
75
75
  end
76
76
  end
77
-
78
- describe "#range" do
79
- it "returns the current range" do
80
- expect(current.range).to be_a(LineRange)
81
- end
82
- end
83
-
84
- describe "#range=" do
85
- it "sets the current range" do
86
- current.buffer.lines = ["1", "2", "3"]
87
- current.range = (1..2)
88
- expect(current.range.to_a).to eq(["2", "3"])
89
- end
90
- end
91
77
  end
92
78
  end
@@ -22,7 +22,7 @@ module Neovim
22
22
  it "sends and receives data" do
23
23
  messages = []
24
24
 
25
- srv_thr = Thread.new do
25
+ server_thread = Thread.new do
26
26
  client = server.accept
27
27
  messages << client.readpartial(1024)
28
28
 
@@ -37,7 +37,7 @@ module Neovim
37
37
  end
38
38
 
39
39
  expect(fiber.resume).to eq("OK")
40
- srv_thr.join
40
+ server_thread.join
41
41
  expect(messages).to eq(["data"])
42
42
  end
43
43
  end
@@ -50,10 +50,8 @@ module Neovim
50
50
  end
51
51
 
52
52
  context "unix" do
53
- before { FileUtils.rm_f("/tmp/#$$.sock") }
54
- after { FileUtils.rm_f("/tmp/#$$.sock") }
55
- let!(:server) { UNIXServer.new("/tmp/#$$.sock") }
56
- let!(:event_loop) { EventLoop.unix("/tmp/#$$.sock") }
53
+ let!(:server) { UNIXServer.new(Support.socket_path) }
54
+ let!(:event_loop) { EventLoop.unix(Support.socket_path) }
57
55
 
58
56
  include_context "socket behavior"
59
57
  end
@@ -73,7 +71,7 @@ module Neovim
73
71
  event_loop = EventLoop.stdio
74
72
  messages = []
75
73
 
76
- srv_thr = Thread.new do
74
+ server_thread = Thread.new do
77
75
  messages << srv_stdout.readpartial(1024)
78
76
  srv_stdin.write("OK")
79
77
  end
@@ -84,7 +82,7 @@ module Neovim
84
82
  end
85
83
 
86
84
  expect(fiber.resume).to eq("OK")
87
- srv_thr.join
85
+ server_thread.join
88
86
  expect(messages).to eq(["data"])
89
87
  ensure
90
88
  STDOUT.reopen(old_stdout)
@@ -1,19 +1,14 @@
1
1
  require "helper"
2
- require "tempfile"
3
2
 
4
3
  module Neovim
5
4
  RSpec.describe Host do
6
5
  describe ".load_from_files" do
7
6
  it "loads the defined plugins into a manifest" do
8
- plug1 = Tempfile.open("plug1") do |f|
9
- f.write("Neovim.plugin")
10
- f.path
11
- end
7
+ plug1 = Support.file_path("plug1.rb")
8
+ plug2 = Support.file_path("plug2.rb")
12
9
 
13
- plug2 = Tempfile.open("plug2") do |f|
14
- f.write("Neovim.plugin; Neovim.plugin")
15
- f.path
16
- end
10
+ File.write(plug1, "Neovim.plugin")
11
+ File.write(plug2, "Neovim.plugin; Neovim.plugin")
17
12
 
18
13
  manifest = Manifest.new
19
14
 
@@ -23,10 +18,8 @@ module Neovim
23
18
  end
24
19
 
25
20
  it "doesn't load plugin code into the global namespace" do
26
- plug = Tempfile.open("plug") do |f|
27
- f.write("class FooClass; end")
28
- f.path
29
- end
21
+ plug = Support.file_path("plug.rb")
22
+ File.write(plug, "class FooClass; end")
30
23
 
31
24
  host = Host.load_from_files([plug])
32
25
  expect(Kernel.const_defined?("FooClass")).to be(false)
@@ -6,11 +6,11 @@ module Neovim
6
6
  shared_context "msgpack stream behavior" do
7
7
  it "sends and receives data" do
8
8
  stream = MsgpackStream.new(event_loop)
9
- messages = []
9
+ client_messages = []
10
10
 
11
- srv_thr = Thread.new do
11
+ server_thread = Thread.new do
12
12
  client = server.accept
13
- messages << client.readpartial(1024)
13
+ client_messages << client.readpartial(1024)
14
14
 
15
15
  client.write(MessagePack.pack([2]))
16
16
  client.close
@@ -22,8 +22,11 @@ module Neovim
22
22
  stream.send([1]).run(msg_cb)
23
23
  end
24
24
 
25
- expect(fiber.resume).to eq([2])
26
- expect(messages).to eq([MessagePack.pack([1])])
25
+ server_message = fiber.resume
26
+ server_thread.join
27
+
28
+ expect(server_message).to eq([2])
29
+ expect(client_messages).to eq([MessagePack.pack([1])])
27
30
  end
28
31
  end
29
32
 
@@ -35,10 +38,8 @@ module Neovim
35
38
  end
36
39
 
37
40
  context "unix" do
38
- before { FileUtils.rm_f("/tmp/#$$.sock") }
39
- after { FileUtils.rm_f("/tmp/#$$.sock") }
40
- let!(:server) { UNIXServer.new("/tmp/#$$.sock") }
41
- let!(:event_loop) { EventLoop.unix("/tmp/#$$.sock") }
41
+ let!(:server) { UNIXServer.new(Support.socket_path) }
42
+ let!(:event_loop) { EventLoop.unix(Support.socket_path) }
42
43
 
43
44
  include_context "msgpack stream behavior"
44
45
  end
@@ -34,23 +34,21 @@ module Neovim
34
34
  end
35
35
 
36
36
  context "tcp" do
37
- let!(:nvim_port) do
38
- server = TCPServer.new("0.0.0.0", 0)
39
- server.addr[1].tap { server.close }
40
- end
41
-
37
+ let!(:nvim_port) { Support.port }
42
38
  let!(:nvim_pid) do
43
- Process.spawn(
39
+ pid = Process.spawn(
44
40
  {"NVIM_LISTEN_ADDRESS" => "0.0.0.0:#{nvim_port}"},
45
41
  "#{ENV.fetch("NVIM_EXECUTABLE")} --headless -n -u NONE",
46
42
  [:out, :err] => "/dev/null"
47
- ).tap do
48
- begin
49
- TCPSocket.open("0.0.0.0", nvim_port).close
50
- rescue Errno::ECONNREFUSED
51
- retry
52
- end
43
+ )
44
+
45
+ begin
46
+ TCPSocket.open("0.0.0.0", nvim_port).close
47
+ rescue Errno::ECONNREFUSED
48
+ retry
53
49
  end
50
+
51
+ pid
54
52
  end
55
53
 
56
54
  after do
@@ -69,27 +67,30 @@ module Neovim
69
67
  end
70
68
 
71
69
  context "unix" do
70
+ let!(:socket_path) { Support.socket_path }
72
71
  let!(:nvim_pid) do
73
- FileUtils.rm_f("/tmp/nvim-#$$.sock")
74
- Process.spawn(
75
- {"NVIM_LISTEN_ADDRESS" => "/tmp/nvim-#$$.sock"},
72
+ pid = Process.spawn(
73
+ {"NVIM_LISTEN_ADDRESS" => socket_path},
76
74
  "#{ENV.fetch("NVIM_EXECUTABLE")} --headless -n -u NONE",
77
75
  [:out, :err] => "/dev/null"
78
- ).tap do
79
- loop do
80
- break if File.exists?("/tmp/nvim-#$$.sock")
81
- end
76
+ )
77
+
78
+ begin
79
+ UNIXSocket.new(socket_path).close
80
+ rescue Errno::ENOENT, Errno::ECONNREFUSED
81
+ retry
82
82
  end
83
+
84
+ pid
83
85
  end
84
86
 
85
87
  after do
86
88
  Process.kill(:TERM, nvim_pid)
87
89
  Process.waitpid(nvim_pid)
88
- FileUtils.rm_f("/tmp/nvim-#$$.sock")
89
90
  end
90
91
 
91
92
  let(:session) do
92
- event_loop = EventLoop.unix("/tmp/nvim-#$$.sock")
93
+ event_loop = EventLoop.unix(socket_path)
93
94
  stream = MsgpackStream.new(event_loop)
94
95
  async = AsyncSession.new(stream)
95
96
  Session.new(async)
@@ -8,19 +8,15 @@ RSpec.describe Neovim do
8
8
 
9
9
  describe ".attach_tcp" do
10
10
  it "attaches to a TCP socket" do
11
- srv = TCPServer.new("0.0.0.0", 0)
12
- port = srv.addr[1]
13
- srv.close
14
-
11
+ port = Support.port
15
12
  env = {"NVIM_LISTEN_ADDRESS" => "0.0.0.0:#{port}"}
16
13
  pid = Process.spawn(env, nvim_exe, *nvim_argv, [:out, :err] => "/dev/null")
17
14
 
18
15
  begin
19
- wait_socket = TCPSocket.open("0.0.0.0", port)
16
+ TCPSocket.open("0.0.0.0", port).close
20
17
  rescue Errno::ECONNREFUSED
21
18
  retry
22
19
  end
23
- wait_socket.close
24
20
 
25
21
  begin
26
22
  expect(Neovim.attach_tcp("0.0.0.0", port).strwidth("hi")).to eq(2)
@@ -32,16 +28,21 @@ RSpec.describe Neovim do
32
28
 
33
29
  describe ".attach_unix" do
34
30
  it "attaches to a UNIX socket" do
35
- FileUtils.rm_f("/tmp/#$$.sock")
36
- env = {"NVIM_LISTEN_ADDRESS" => "/tmp/#$$.sock"}
31
+ socket_path = Support.socket_path
32
+ env = {"NVIM_LISTEN_ADDRESS" => socket_path}
37
33
  pid = Process.spawn(env, nvim_exe, *nvim_argv, [:out, :err] => "/dev/null")
38
34
 
39
- loop { break if File.exists?("/tmp/#$$.sock") }
35
+ begin
36
+ UNIXSocket.new(socket_path).close
37
+ rescue Errno::ENOENT, Errno::ECONNREFUSED
38
+ retry
39
+ end
40
40
 
41
41
  begin
42
- expect(Neovim.attach_unix("/tmp/#$$.sock").strwidth("hi")).to eq(2)
42
+ expect(Neovim.attach_unix(socket_path).strwidth("hi")).to eq(2)
43
43
  ensure
44
44
  Process.kill(:TERM, pid)
45
+ Process.waitpid(pid)
45
46
  end
46
47
  end
47
48
  end
@@ -0,0 +1,29 @@
1
+ require "fileutils"
2
+
3
+ module Support
4
+ def self.workspace
5
+ File.expand_path("../workspace/#$$", __FILE__)
6
+ end
7
+
8
+ def self.socket_path
9
+ file_path("nvim.sock")
10
+ end
11
+
12
+ def self.port
13
+ server = TCPServer.new("0.0.0.0", 0)
14
+ server.addr[1].tap { server.close }
15
+ end
16
+
17
+ def self.file_path(name)
18
+ File.join(workspace, name)
19
+ end
20
+
21
+ def self.remove_workspace
22
+ FileUtils.rm_rf(workspace)
23
+ end
24
+
25
+ def self.clean_workspace
26
+ remove_workspace
27
+ FileUtils.mkdir_p(workspace)
28
+ end
29
+ 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.0.4
4
+ version: 0.0.5
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-01-09 00:00:00.000000000 Z
11
+ date: 2016-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -121,6 +121,7 @@ files:
121
121
  - lib/neovim/event_loop.rb
122
122
  - lib/neovim/host.rb
123
123
  - lib/neovim/line_range.rb
124
+ - lib/neovim/logging.rb
124
125
  - lib/neovim/manifest.rb
125
126
  - lib/neovim/msgpack_stream.rb
126
127
  - lib/neovim/notification.rb
@@ -148,6 +149,7 @@ files:
148
149
  - spec/neovim/session_spec.rb
149
150
  - spec/neovim/window_spec.rb
150
151
  - spec/neovim_spec.rb
152
+ - spec/support.rb
151
153
  homepage: https://github.com/alexgenco/neovim-ruby
152
154
  licenses:
153
155
  - MIT
@@ -168,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
170
  version: '0'
169
171
  requirements: []
170
172
  rubyforge_project:
171
- rubygems_version: 2.4.6
173
+ rubygems_version: 2.4.5
172
174
  signing_key:
173
175
  specification_version: 4
174
176
  summary: A Ruby client for Neovim
@@ -189,3 +191,4 @@ test_files:
189
191
  - spec/neovim/session_spec.rb
190
192
  - spec/neovim/window_spec.rb
191
193
  - spec/neovim_spec.rb
194
+ - spec/support.rb