neovim 0.0.5 → 0.0.6

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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +5 -2
  3. data/CHANGELOG.md +11 -0
  4. data/README.md +15 -4
  5. data/Rakefile +64 -4
  6. data/bin/j2mp +8 -0
  7. data/bin/mp2j +8 -0
  8. data/lib/neovim.rb +100 -17
  9. data/lib/neovim/api.rb +84 -0
  10. data/lib/neovim/async_session.rb +74 -21
  11. data/lib/neovim/buffer.rb +111 -4
  12. data/lib/neovim/client.rb +175 -4
  13. data/lib/neovim/current.rb +19 -8
  14. data/lib/neovim/event_loop.rb +55 -10
  15. data/lib/neovim/host.rb +21 -8
  16. data/lib/neovim/line_range.rb +55 -15
  17. data/lib/neovim/logging.rb +4 -0
  18. data/lib/neovim/manifest.rb +11 -3
  19. data/lib/neovim/msgpack_stream.rb +53 -19
  20. data/lib/neovim/notification.rb +2 -0
  21. data/lib/neovim/plugin.rb +12 -87
  22. data/lib/neovim/plugin/dsl.rb +81 -0
  23. data/lib/neovim/plugin/handler.rb +43 -0
  24. data/lib/neovim/remote_object.rb +64 -0
  25. data/lib/neovim/request.rb +4 -2
  26. data/lib/neovim/session.rb +167 -16
  27. data/lib/neovim/tabpage.rb +24 -2
  28. data/lib/neovim/version.rb +1 -1
  29. data/lib/neovim/window.rb +92 -2
  30. data/neovim.gemspec +1 -1
  31. data/spec/acceptance/neovim-ruby-host_spec.rb +16 -8
  32. data/spec/helper.rb +11 -3
  33. data/spec/neovim/api_spec.rb +40 -0
  34. data/spec/neovim/async_session_spec.rb +19 -25
  35. data/spec/neovim/current_spec.rb +64 -4
  36. data/spec/neovim/event_loop_spec.rb +18 -27
  37. data/spec/neovim/host_spec.rb +20 -1
  38. data/spec/neovim/manifest_spec.rb +0 -2
  39. data/spec/neovim/msgpack_stream_spec.rb +5 -6
  40. data/spec/neovim/{object_spec.rb → remote_object_spec.rb} +1 -4
  41. data/spec/neovim/session_spec.rb +18 -26
  42. data/spec/neovim_spec.rb +2 -3
  43. data/spec/support.rb +5 -5
  44. metadata +13 -6
  45. data/lib/neovim/api_info.rb +0 -27
  46. data/lib/neovim/object.rb +0 -40
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 92074f47bd93b7fbca51aa3b74e813adb8b1004c
4
- data.tar.gz: 2c19393d6a5c38342bc30350e5c5da352fff101c
3
+ metadata.gz: 7e20e3f4df52ff80bb9e0aa9826d5c6c723d2cc6
4
+ data.tar.gz: 04019ea3e3e7bb33d231d8a2160a2320f62ca365
5
5
  SHA512:
6
- metadata.gz: 0c22b67f54f42edcdbc7a062ff972725508c69810627dd51e3c5ece458dd9c1187cc6e87149044dd4786302181297d5ebc3acb8ed4b29a33c069e2c61c0cb52b
7
- data.tar.gz: 3c9dc7fc608a08a0db6ed8a9174b93b5487163745661174c883fe2726be02259e448b1e3e8c79bfda25b082d012e27bdc5fc22fed78e2e826f7395faf669a0f8
6
+ metadata.gz: d3a46053cf6e54b97ef541cf314062ee3ed597a61b642e1d3be7355c60d1b568fe35e0dd76b8b22dd9f5e82cbcdd981ca83d09a596dbbaacbb7221530169d510
7
+ data.tar.gz: ae0fc91672a39bda8c0a2c756c0a27db7360a8428cb5ab7cdfe9423a25a97d3f3d968d51c0fd42ac986582f32a44eb511a75d6d58213c9384b76483a47b655da
@@ -25,6 +25,9 @@ addons:
25
25
  - g++
26
26
  - pkg-config
27
27
 
28
+ cache:
29
+ - apt
30
+ - bundler
31
+
28
32
  env: REPORT_COVERAGE=1
29
- before_script: travis_retry bundle exec rake neovim:install
30
- script: bundle exec rake
33
+ script: bundle exec rake spec:ci
@@ -1,3 +1,14 @@
1
+ # 0.0.6
2
+ - Update Session with improved Fiber coordination
3
+ - Documentation
4
+ - Rename APIInfo -> API
5
+ - Rename Object -> RemoteObject
6
+
7
+ # 0.0.5
8
+ - Various fixes for Ruby remote plugins
9
+ - Move Current#range and #range= methods to Buffer
10
+ - Add better logging
11
+
1
12
  # 0.0.4
2
13
  - Add support for loading Ruby remote plugins from nvim
3
14
  - Add Current#range to return a LineRange enumerable object
data/README.md CHANGED
@@ -3,6 +3,7 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/neovim.svg)](https://badge.fury.io/rb/neovim)
4
4
  [![Travis](https://travis-ci.org/alexgenco/neovim-ruby.svg?branch=master)](https://travis-ci.org/alexgenco/neovim-ruby)
5
5
  [![Coverage Status](https://coveralls.io/repos/alexgenco/neovim-ruby/badge.png)](https://coveralls.io/r/alexgenco/neovim-ruby)
6
+ [![Code Climate](https://codeclimate.com/github/alexgenco/neovim-ruby/badges/gpa.svg)](https://codeclimate.com/github/alexgenco/neovim-ruby)
6
7
 
7
8
  Ruby bindings for [Neovim](https://github.com/neovim/neovim).
8
9
 
@@ -37,7 +38,9 @@ require "neovim"
37
38
  client = Neovim.attach_unix("/tmp/nvim.sock")
38
39
  ```
39
40
 
40
- The client's interface is generated at runtime from the `vim_get_api_info` RPC call. For now, you can refer to the Node client's auto-generated [API description](https://github.com/neovim/node-client/blob/master/index.d.ts). Note that methods will be in `snake_case` rather than `camelCase`.
41
+ The client's interface is generated at runtime from the `vim_get_api_info` RPC call. Refer to the [docs](http://www.rubydoc.info/github/alexgenco/neovim-ruby/master/Neovim/Client) for details.
42
+
43
+ ### Plugins
41
44
 
42
45
  The `neovim-ruby-host` executable can be used to spawn Ruby plugins via the `rpcstart` command. A plugin can be defined like this:
43
46
 
@@ -52,9 +55,8 @@ Neovim.plugin do |plug|
52
55
  nvim.current.line = str
53
56
  end
54
57
 
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
+ # Define a function called "Sum" which adds two numbers. This function is
59
+ # executed synchronously, so the result of the block will be returned to nvim.
58
60
  plug.function(:Sum, :nargs => 2, :sync => true) do |nvim, x, y|
59
61
  x + y
60
62
  end
@@ -68,6 +70,15 @@ end
68
70
 
69
71
  After a call to `:UpdateRemotePlugins`, plugins will be auto-loaded from the `$VIMRUNTIME/rplugin/ruby` directory.
70
72
 
73
+ ## Links
74
+
75
+ * Source: <http://github.com/alexgenco/neovim-ruby>
76
+ * Bugs: <http://github.com/alexgenco/neovim-ruby/issues>
77
+ * CI: <http://travis-ci.org/alexgenco/neovim-ruby>
78
+ * Documentation:
79
+ * Latest Gem: <http://rubydoc.info/gems/neovim>
80
+ * Master: <http://rubydoc.info/github/alexgenco/neovim-ruby/master/frames>
81
+
71
82
  ## Contributing
72
83
 
73
84
  1. Fork it (http://github.com/alexgenco/neovim-ruby/fork)
data/Rakefile CHANGED
@@ -2,20 +2,24 @@ require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
- task :default => :spec
5
+
6
+ namespace :spec do
7
+ desc "Build Neovim and run specs on CI"
8
+ task :ci => ["neovim:build", :spec]
9
+ end
6
10
 
7
11
  namespace :neovim do
8
12
  vendor = File.expand_path("../vendor/neovim", __FILE__)
9
13
 
10
- desc "Install Neovim"
11
- task :install do
14
+ desc "Build Neovim"
15
+ task :build do
12
16
  sh "git submodule update --init && " +
13
17
  "cd #{vendor} && " +
14
18
  "make distclean && " +
15
19
  "make"
16
20
  end
17
21
 
18
- desc "Update Neovim installation"
22
+ desc "Update vendored Neovim revision"
19
23
  task :update do
20
24
  sh "git submodule update --init && " +
21
25
  "cd #{vendor} && " +
@@ -23,4 +27,60 @@ namespace :neovim do
23
27
  "git pull origin master && " +
24
28
  "make"
25
29
  end
30
+
31
+ desc "Generate Neovim remote API docs"
32
+ task :generate_docs do
33
+ require "neovim"
34
+ require "pathname"
35
+
36
+ vim_docs = []
37
+ buffer_docs = []
38
+ window_docs = []
39
+ tabpage_docs = []
40
+ session = Neovim::Session.child(%w(-u NONE -n -N))
41
+
42
+ session.request(:vim_get_api_info)[1]["functions"].each do |func|
43
+ prefix, method_name = func["name"].split("_", 2)
44
+ return_type = func["return_type"]
45
+ params = func["parameters"]
46
+ params.shift unless prefix == "vim"
47
+ param_names = params.map(&:last)
48
+ param_str = params.empty? ? "" : "(#{param_names.join(", ")})"
49
+ method_decl = "@method #{method_name}#{param_str}"
50
+ param_docs = params.map do |type, name|
51
+ " @param [#{type}] #{name}"
52
+ end
53
+ return_doc = " @return [#{return_type}]\n"
54
+ method_doc = [method_decl, *param_docs, return_doc].join("\n")
55
+ method_doc.gsub!(/ArrayOf\((\w+)[^)]*\)/, 'Array<\1>')
56
+ method_doc.gsub!(/Integer/, "Fixnum")
57
+
58
+ case prefix
59
+ when "vim"
60
+ vim_docs << method_doc
61
+ when "buffer"
62
+ buffer_docs << method_doc
63
+ when "tabpage"
64
+ tabpage_docs << method_doc
65
+ when "window"
66
+ window_docs << method_doc
67
+ end
68
+ end
69
+
70
+ lib_dir = Pathname.new(File.expand_path("../lib/neovim", __FILE__))
71
+ {
72
+ "client.rb" => vim_docs,
73
+ "buffer.rb" => buffer_docs,
74
+ "tabpage.rb" => tabpage_docs,
75
+ "window.rb" => window_docs,
76
+ }.each do |filename, docs|
77
+ path = lib_dir.join(filename)
78
+ contents = File.read(path)
79
+ doc_str = ["=begin", *docs, "=end"].join("\n")
80
+
81
+ File.write(path, contents.sub(/=begin.+=end/m, doc_str))
82
+ end
83
+ end
26
84
  end
85
+
86
+ task :default => :spec
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Convert STDIN from JSON to MessagePack.
4
+ require "json"
5
+ require "msgpack"
6
+
7
+ ARGF.binmode
8
+ puts MessagePack.pack(JSON.parse(ARGF.read.strip))
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Convert STDIN from MessagePack to JSON
4
+ require "json"
5
+ require "msgpack"
6
+
7
+ ARGF.binmode
8
+ puts JSON.dump(MessagePack.unpack(ARGF.read.strip))
@@ -6,27 +6,99 @@ require "neovim/msgpack_stream"
6
6
  require "neovim/session"
7
7
  require "neovim/plugin"
8
8
 
9
+ # The main entrypoint to the +Neovim+ gem. It allows you to connect to a
10
+ # running +nvim+ instance programmatically or define a remote plugin to be
11
+ # autoloaded by +nvim+.
12
+ #
13
+ # You can connect to a running +nvim+ instance by setting or inspecting the
14
+ # +NVIM_LISTEN_ADDRESS+ environment variable and connecting via the appropriate
15
+ # +attach_+ method. This is currently supported for both UNIX domain sockets
16
+ # and TCP. You can also spawn and connect to an +nvim+ subprocess via
17
+ # +Neovim.attach_child(argv)+.
18
+ #
19
+ # You can define a remote plugin using the +Neovim.plugin+ DSL, which allows
20
+ # you to register commands, functions, and autocmds. Plugins are autoloaded by
21
+ # +nvim+ from the +rplugin/ruby+ directory in your +nvim+ runtime path.
22
+ #
23
+ # @example Connect over a TCP socket
24
+ # Neovim.attach_tcp("0.0.0.0", 3333) # => Neovim::Client
25
+ #
26
+ # @example Connect over a UNIX domain socket
27
+ # Neovim.attach_unix("/tmp/nvim.sock") # => Neovim::Client
28
+ #
29
+ # @example Spawn and connect to a child +nvim+ process
30
+ # Neovim.attach_child(["-u", "NONE"]) # => Neovim::Client
31
+ #
32
+ # @example Define a Ruby plugin
33
+ # # ~/.config/nvim/rplugin/ruby/plugin.rb
34
+ #
35
+ # Neovim.plugin do |plug|
36
+ # # Define a command called "SetLine" which sets the contents of the
37
+ # # current line. This command is executed asynchronously, so the return
38
+ # # value is ignored.
39
+ # plug.command(:SetLine, :nargs => 1) do |nvim, str|
40
+ # nvim.current.line = str
41
+ # end
42
+ #
43
+ # # Define a function called "Sum" which adds two numbers. This function is
44
+ # # executed synchronously, so the result of the block will be returned to
45
+ # # nvim.
46
+ # plug.function(:Sum, :nargs => 2, :sync => true) do |nvim, x, y|
47
+ # x + y
48
+ # end
49
+ #
50
+ # # Define an autocmd for the BufEnter event on Ruby files.
51
+ # plug.autocmd(:BufEnter, :pattern => "*.rb") do |nvim|
52
+ # nvim.command("echom 'Ruby file, eh?'")
53
+ # end
54
+ # end
55
+ #
56
+ # @see Client
57
+ # @see Plugin::DSL
9
58
  module Neovim
10
59
  class << self
11
- attr_accessor :__configured_plugin_manifest, :__configured_plugin_path
60
+ # @api private
61
+ # @return [Manifest, nil]
62
+ attr_accessor :__configured_plugin_manifest
63
+
64
+ # @api private
65
+ # @return [String, nil]
66
+ attr_accessor :__configured_plugin_path
12
67
  end
13
68
 
69
+ # Connect to a running +nvim+ instance over TCP.
70
+ #
71
+ # @param host [String] The hostname or IP address
72
+ # @param port [Fixnum] The port
73
+ # @return [Client]
74
+ # @see Session.tcp
14
75
  def self.attach_tcp(host, port)
15
- attach_event_loop(EventLoop.tcp(host, port))
76
+ Client.new(Session.tcp(host, port).discover_api)
16
77
  end
17
78
 
79
+ # Connect to a running +nvim+ instance over a UNIX domain socket.
80
+ #
81
+ # @param socket_path [String] The socket path
82
+ # @return [Client]
83
+ # @see Session.unix
18
84
  def self.attach_unix(socket_path)
19
- attach_event_loop(EventLoop.unix(socket_path))
85
+ Client.new(Session.unix(socket_path).discover_api)
20
86
  end
21
87
 
88
+ # Spawn and connect to a child +nvim+ process.
89
+ #
90
+ # @param argv [Array] The arguments to pass to the spawned process
91
+ # @return [Client]
92
+ # @see Session.child
22
93
  def self.attach_child(argv=[])
23
- attach_event_loop(EventLoop.child(argv))
24
- end
25
-
26
- def self.start_host(rplugin_paths)
27
- Host.load_from_files(rplugin_paths).run
94
+ Client.new(Session.child(argv).discover_api)
28
95
  end
29
96
 
97
+ # Define an +nvim+ remote plugin using the plugin DSL.
98
+ #
99
+ # @yield [Plugin::DSL]
100
+ # @return [Plugin]
101
+ # @see Plugin::DSL
30
102
  def self.plugin(&block)
31
103
  Plugin.from_config_block(__configured_plugin_path, &block).tap do |plugin|
32
104
  if __configured_plugin_manifest.respond_to?(:register)
@@ -35,20 +107,31 @@ module Neovim
35
107
  end
36
108
  end
37
109
 
110
+ # Start a plugin host. This is called by the +nvim-ruby-host+ executable,
111
+ # which is spawned by +nvim+ to discover and run Ruby plugins, and acts as
112
+ # the bridge between +nvim+ and the plugin.
113
+ #
114
+ # @param rplugin_paths [Array<String>] The paths to remote plugin files
115
+ # @return [void]
116
+ # @see Host
117
+ def self.start_host(rplugin_paths)
118
+ Host.load_from_files(rplugin_paths).run
119
+ end
120
+
121
+ # Set the Neovim global logger.
122
+ #
123
+ # @param logger [Logger] The target logger
124
+ # @return [Logger]
125
+ # @see Logging
38
126
  def self.logger=(logger)
39
127
  Logging.logger = logger
40
128
  end
41
129
 
130
+ # The Neovim global logger.
131
+ #
132
+ # @return [Logger]
133
+ # @see Logging
42
134
  def self.logger
43
135
  Logging.logger
44
136
  end
45
-
46
- def self.attach_event_loop(event_loop)
47
- msgpack_stream = MsgpackStream.new(event_loop)
48
- async_session = AsyncSession.new(msgpack_stream)
49
- session = Session.new(async_session)
50
-
51
- Client.new(session)
52
- end
53
- private_class_method :attach_event_loop
54
137
  end
@@ -0,0 +1,84 @@
1
+ module Neovim
2
+ class API
3
+ # Represents an unknown API. Used as a stand-in when the API hasn't been
4
+ # discovered yet via the +vim_get_api_info+ RPC call.
5
+ #
6
+ # @return [API]
7
+ def self.null
8
+ new([nil, {"functions" => [], "types" => []}])
9
+ end
10
+
11
+ def initialize(data)
12
+ @data = data
13
+ end
14
+
15
+ # Return all functions defined by the API, as +Function+ objects.
16
+ #
17
+ # @return [Array<Function>]
18
+ # @see Function
19
+ def functions
20
+ @functions ||= @data.fetch(1).fetch("functions").map do |func|
21
+ Function.new(func["name"], func["async"])
22
+ end
23
+ end
24
+
25
+ # Return information about +nvim+ types. Used for registering MessagePack
26
+ # +ext+ types.
27
+ #
28
+ # @return [Hash]
29
+ def types
30
+ @types ||= @data.fetch(1).fetch("types")
31
+ end
32
+
33
+ # Return the channel ID of the current RPC session.
34
+ #
35
+ # @return [Fixnum, nil]
36
+ def channel_id
37
+ @channel_id ||= @data.fetch(0)
38
+ end
39
+
40
+ # Return a list of functions with the given name prefix.
41
+ #
42
+ # @param prefix [String] The function prefix
43
+ # @return [Array<Function>]
44
+ def functions_with_prefix(prefix)
45
+ functions.select do |function|
46
+ function.name =~ /\A#{prefix}/
47
+ end
48
+ end
49
+
50
+ # Find a function with the given name.
51
+ #
52
+ # @param name [String] The name of the function
53
+ # @return [Function, nil]
54
+ def function(name)
55
+ functions.find do |func|
56
+ func.name == name.to_s
57
+ end
58
+ end
59
+
60
+ # Truncate the output of inspect so console sessions are more pleasant.
61
+ #
62
+ # @return [String]
63
+ def inspect
64
+ "#<#{self.class}:0x%x @types={...} @functions={...}>" % (object_id << 1)
65
+ end
66
+
67
+ # Encapsulate an RPC function.
68
+ class Function < Struct.new(:name, :async)
69
+ # Apply this function to a running RPC session. Sends either a request if
70
+ # +async+ is +false+ or a notification if +async+ is +true+.
71
+ #
72
+ # @param session [Session] The session to apply the function to.
73
+ # @param *args [Array] Arguments to the function.
74
+ # @return [Object, nil]
75
+ def call(session, *args)
76
+ if async
77
+ session.notify(name, *args)
78
+ else
79
+ session.request(name, *args)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -3,6 +3,9 @@ require "neovim/request"
3
3
  require "neovim/notification"
4
4
 
5
5
  module Neovim
6
+ # Handles formatting RPC requests and writing them to the
7
+ # +MsgpackStream+. This exposes an asynchronous API, in which responses
8
+ # are handled in callbacks.
6
9
  class AsyncSession
7
10
  include Logging
8
11
 
@@ -12,49 +15,99 @@ module Neovim
12
15
  @pending_requests = {}
13
16
  end
14
17
 
15
- def register_session(session)
16
- @msgpack_stream.register_session(session)
17
- end
18
-
18
+ # Send an RPC request and enqueue it's callback to be called when a
19
+ # response is received.
20
+ #
21
+ # @param method [Symbol, String] The RPC method name
22
+ # @param *args [Array] The arguments to the RPC method
23
+ # @return [self]
24
+ # @example
25
+ # async_session.request(:vim_strwidth, "foobar") do |response|
26
+ # $stderr.puts("Got a response #{response}")
27
+ # end
19
28
  def request(method, *args, &response_cb)
20
29
  reqid = @request_id
21
30
  @request_id += 1
22
31
 
23
- @msgpack_stream.send([0, reqid, method, args])
32
+ @msgpack_stream.write([0, reqid, method, args])
24
33
  @pending_requests[reqid] = response_cb || Proc.new {}
25
34
  self
26
35
  end
27
36
 
37
+ # Send an RPC notification. Notifications don't receive a response
38
+ # from +nvim+.
39
+ #
40
+ # @param method [Symbol, String] The RPC method name
41
+ # @param *args [Array] The arguments to the RPC method
42
+ # @return [self]
43
+ # @example
44
+ # async_session.notify(:vim_input, "jk")
28
45
  def notify(method, *args)
29
- @msgpack_stream.send([2, method, args])
46
+ @msgpack_stream.write([2, method, args])
30
47
  self
31
48
  end
32
49
 
33
- def run(request_cb=nil, notification_cb=nil, setup_cb=nil)
34
- request_cb ||= Proc.new {}
35
- notification_cb ||= Proc.new {}
36
- setup_cb ||= Proc.new {}
37
-
38
- msg_cb = Proc.new do |msg|
39
- kind, *rest = msg
50
+ # Run the event loop, yielding received RPC messages to the block. RPC
51
+ # requests and notifications from +nvim+ will be wrapped in +Request+
52
+ # and +Notification+ objects, respectively, and responses will be
53
+ # passed to their callbacks with optional errors.
54
+ #
55
+ # @param session [Session] The current session
56
+ # @yield [Object]
57
+ # @return [void]
58
+ # @see MsgpackStream#run
59
+ # @see EventLoop#run
60
+ def run(session=nil, &callback)
61
+ @msgpack_stream.run(session) do |msg|
62
+ kind, *payload = msg
40
63
 
41
64
  case kind
42
65
  when 0
43
- reqid, method, args = rest
44
- request_cb.call(Request.new(method, args, @msgpack_stream, reqid))
66
+ handle_request(payload, callback)
45
67
  when 1
46
- reqid, (_, error), result = rest
47
- @pending_requests.fetch(reqid).call(error, result)
68
+ handle_response(payload)
48
69
  when 2
49
- method, args = rest
50
- notification_cb.call(Notification.new(method, args))
70
+ handle_notification(payload, callback)
51
71
  end
52
72
  end
53
-
54
- @msgpack_stream.run(msg_cb, setup_cb)
55
73
  rescue => e
56
74
  fatal("got unexpected error #{e}")
57
75
  debug(e.backtrace.join("\n"))
58
76
  end
77
+
78
+ # Stop the event loop.
79
+ #
80
+ # @return [void]
81
+ # @see EventLoop#stop
82
+ def stop
83
+ @msgpack_stream.stop
84
+ end
85
+
86
+ # Shut down the event loop.
87
+ #
88
+ # @return [void]
89
+ # @see EventLoop#shutdown
90
+ def shutdown
91
+ @msgpack_stream.shutdown
92
+ end
93
+
94
+ private
95
+
96
+ def handle_request(payload, callback)
97
+ callback ||= Proc.new {}
98
+ reqid, method, args = payload
99
+ callback.call(Request.new(method, args, @msgpack_stream, reqid))
100
+ end
101
+
102
+ def handle_response(payload)
103
+ reqid, (_, error), result = payload
104
+ @pending_requests.delete(reqid).call(error, result)
105
+ end
106
+
107
+ def handle_notification(payload, callback)
108
+ callback ||= Proc.new {}
109
+ method, args = payload
110
+ callback.call(Notification.new(method, args))
111
+ end
59
112
  end
60
113
  end