droonga-client 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/bin/droonga-send CHANGED
@@ -37,6 +37,7 @@ def parse_server(server)
37
37
  :host => host,
38
38
  :port => Integer(port),
39
39
  :protocol => protocol.to_sym,
40
+ :tag => tag,
40
41
  }
41
42
  end
42
43
 
data/doc/text/news.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # News
2
2
 
3
+ ## 0.1.6: 2014-04-29 (planned)
4
+
5
+ * Supports droonga's protocol.
6
+
3
7
  ## 0.1.5: 2014-03-29
4
8
 
5
9
  ### Improvements
@@ -39,6 +39,7 @@ Gem::Specification.new do |spec|
39
39
  spec.add_runtime_dependency "fluent-logger"
40
40
  spec.add_runtime_dependency "rack"
41
41
  spec.add_runtime_dependency "yajl-ruby"
42
+ spec.add_runtime_dependency "droonga-message-pack-packer"
42
43
 
43
44
  spec.add_development_dependency "bundler", "~> 1.3"
44
45
  spec.add_development_dependency "rake"
@@ -15,36 +15,18 @@
15
15
  # License along with this library; if not, write to the Free Software
16
16
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
 
18
- require "socket"
19
- require "thread"
20
- require "msgpack"
21
- require "fluent-logger"
18
+ require "droonga/client/connection/error"
22
19
 
23
20
  module Droonga
24
21
  class Client
25
22
  module Connection
26
23
  class DroongaProtocol
27
- class Request
28
- def initialize(thread)
29
- @thread = thread
30
- end
31
-
32
- def wait
33
- @thread.join
34
- end
35
- end
36
-
37
24
  def initialize(options={})
38
- default_options = {
39
- :tag => "droonga",
40
- :host => "127.0.0.1",
41
- :port => 24224,
42
- :timeout => 1,
43
- }
44
- @options = default_options.merge(options)
45
- @logger = Fluent::Logger::FluentLogger.new(@options.delete(:tag),
46
- @options)
47
- @timeout = @options[:timeout]
25
+ @host = options[:host] || "127.0.0.1"
26
+ @port = options[:port] || 24224
27
+ @tag = options[:tag] || "droonga"
28
+ @options = options
29
+ @backend = create_backend
48
30
  end
49
31
 
50
32
  # Sends a request message and receives one or more response
@@ -72,28 +54,7 @@ module Droonga
72
54
  #
73
55
  # @return [Request] The request object.
74
56
  def request(message, options={}, &block)
75
- receiver = create_receiver
76
- message = message.dup
77
- message["replyTo"] = "#{receiver.host}:#{receiver.port}/droonga"
78
- send(message, options)
79
-
80
- sync = block.nil?
81
- if sync
82
- responses = []
83
- receive(receiver, options) do |response|
84
- responses << response
85
- end
86
- if responses.size > 1
87
- responses
88
- else
89
- responses.first
90
- end
91
- else
92
- thread = Thread.new do
93
- receive(receiver, options, &block)
94
- end
95
- Request.new(thread)
96
- end
57
+ @backend.request(message, options, &block)
97
58
  end
98
59
 
99
60
  # Subscribes something and receives zero or more published
@@ -123,35 +84,7 @@ module Droonga
123
84
  #
124
85
  # @return [Request] The request object.
125
86
  def subscribe(message, options={}, &block)
126
- receiver = create_receiver
127
- message = message.dup
128
- message["from"] = "#{receiver.host}:#{receiver.port}/droonga"
129
- send(message, options)
130
-
131
- receive_options = {
132
- :timeout => nil,
133
- }
134
- sync = block.nil?
135
- if sync
136
- Enumerator.new do |yielder|
137
- loop do
138
- receiver.receive(receive_options) do |object|
139
- yielder << object
140
- end
141
- end
142
- end
143
- else
144
- thread = Thread.new do
145
- begin
146
- loop do
147
- receiver.receive(receive_options, &block)
148
- end
149
- ensure
150
- receiver.close
151
- end
152
- end
153
- Request.new(thread)
154
- end
87
+ @backend.subscribe(message, options, &block)
155
88
  end
156
89
 
157
90
  # Sends low level request. Normally, you should use other
@@ -162,114 +95,31 @@ module Droonga
162
95
  # TODO: WRITE ME
163
96
  # @return [void]
164
97
  def send(message, options={}, &block)
165
- if message["id"].nil? or message["date"].nil?
166
- message = message.merge("id" => Time.now.to_f.to_s,
167
- "date" => Time.now)
168
- end
169
- @logger.post("message", message)
98
+ @backend.send(message, options, &block)
170
99
  end
171
100
 
172
101
  # Close the connection. This connection can't be used anymore.
173
102
  #
174
103
  # @return [void]
175
104
  def close
176
- @logger.close
105
+ @backend.close
177
106
  end
178
107
 
179
108
  private
180
- def create_receiver
181
- Receiver.new(:host => @options[:receiver_host],
182
- :port => @options[:receiver_port])
183
- end
184
-
185
- def receive(receiver, options)
186
- timeout = options[:timeout] || @timeout
109
+ def create_backend
110
+ backend = @options[:backend] || :thread
187
111
 
188
- receive_options = {
189
- :timeout => timeout,
190
- }
191
112
  begin
192
- receiver.receive(receive_options) do |response|
193
- yield(response)
194
- end
195
- ensure
196
- receiver.close
197
- end
198
- end
199
-
200
- class Receiver
201
- def initialize(options={})
202
- host = options[:host] || Socket.gethostname
203
- port = options[:port] || 0
204
- @socket = TCPServer.new(host, port)
205
- @read_ios = [@socket]
206
- @client_handlers = {}
207
- end
208
-
209
- def close
210
- @socket.close
211
- @client_handlers.each_key do |client|
212
- client.close
213
- end
214
- end
215
-
216
- def host
217
- @socket.addr[3]
218
- end
219
-
220
- def port
221
- @socket.addr[1]
113
+ require "droonga/client/connection/droonga-protocol/#{backend}"
114
+ rescue LoadError
115
+ raise UnknownBackendError.new("Droonga protocol",
116
+ backend,
117
+ $!.message)
222
118
  end
223
119
 
224
- BUFFER_SIZE = 8192
225
- def receive(options={}, &block)
226
- timeout = options[:timeout]
227
- catch do |tag|
228
- loop do
229
- start = Time.new
230
- readable_ios, = IO.select(@read_ios, nil, nil, timeout)
231
- break if readable_ios.nil?
232
- if timeout
233
- timeout -= (Time.now - start)
234
- timeout = 0 if timeout < 0
235
- end
236
- readable_ios.each do |readable_io|
237
- on_readable(readable_io) do |object|
238
- begin
239
- yield(object)
240
- rescue LocalJumpError
241
- throw(tag)
242
- end
243
- end
244
- end
245
- end
246
- end
247
- end
248
-
249
- private
250
- def on_readable(io)
251
- case io
252
- when @socket
253
- client = @socket.accept
254
- @read_ios << client
255
- @client_handlers[client] = lambda do
256
- unpacker = MessagePack::Unpacker.new
257
- loop do
258
- readable, = IO.select([client], nil, nil, 0)
259
- break unless readable
260
- data = client.read_nonblock(BUFFER_SIZE)
261
- unpacker.feed_each(data) do |object|
262
- yield(object)
263
- end
264
- end
265
- client.close
266
- @read_ios.delete(client)
267
- @client_handlers.delete(client)
268
- end
269
- else
270
- @client_handlers[io].call
271
- end
272
- end
120
+ backend_name = backend.to_s.capitalize
121
+ backend_class = self.class.const_get(backend_name)
122
+ backend_class.new(@host, @port, @tag, @options)
273
123
  end
274
124
  end
275
125
  end
@@ -0,0 +1,232 @@
1
+ # Copyright (C) 2014 Droonga Project
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License version 2.1 as published by the Free Software Foundation.
6
+ #
7
+ # This library is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10
+ # Lesser General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU Lesser General Public
13
+ # License along with this library; if not, write to the Free Software
14
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
+
16
+ require "coolio"
17
+ require "droonga/message-pack-packer"
18
+
19
+ module Droonga
20
+ class Client
21
+ module Connection
22
+ class DroongaProtocol
23
+ class Coolio
24
+ class Request
25
+ def initialize(receiver, id, loop)
26
+ @receiver = receiver
27
+ @id = id
28
+ @loop = loop
29
+ end
30
+
31
+ def wait
32
+ return if @receiver.received?(@id)
33
+ until @receiver.received?(@id)
34
+ @loop.run_once
35
+ end
36
+ end
37
+ end
38
+
39
+ class InfiniteRequest
40
+ def initialize(loop)
41
+ @loop = loop
42
+ end
43
+
44
+ def wait
45
+ @loop.run
46
+ end
47
+ end
48
+
49
+ class Sender < ::Coolio::TCPSocket
50
+ def initialize(socket)
51
+ super(socket)
52
+ end
53
+
54
+ def send(tag, data)
55
+ fluent_message = [tag, Time.now.to_i, data]
56
+ packed_fluent_message = MessagePackPacker.pack(fluent_message)
57
+ write(packed_fluent_message)
58
+ end
59
+ end
60
+
61
+ class Receiver < ::Coolio::TCPServer
62
+ def initialize(*args)
63
+ super(*args) do |engine|
64
+ @engines << engine
65
+ handle_engine(engine)
66
+ end
67
+ @requests = {}
68
+ @engines = []
69
+ end
70
+
71
+ def close
72
+ super
73
+ @engines.each do |engine|
74
+ engine.close
75
+ end
76
+ @engines.clear
77
+ end
78
+
79
+ def host
80
+ @listen_socket.addr[3]
81
+ end
82
+
83
+ def port
84
+ @listen_socket.addr[1]
85
+ end
86
+
87
+ def droonga_name
88
+ "#{host}:#{port}/droonga"
89
+ end
90
+
91
+ def register(id, &callback)
92
+ @requests[id] = {
93
+ :received => false,
94
+ :callback => callback,
95
+ }
96
+ end
97
+
98
+ def unregister(id)
99
+ @requests.delete(id)
100
+ end
101
+
102
+ def received?(id)
103
+ if @requests.key?(id)
104
+ @requests[id][:received]
105
+ else
106
+ true
107
+ end
108
+ end
109
+
110
+ private
111
+ def handle_engine(engine)
112
+ unpacker = MessagePack::Unpacker.new
113
+ on_read = lambda do |data|
114
+ unpacker.feed_each(data) do |fluent_message|
115
+ tag, time, droonga_message = fluent_message
116
+ id = droonga_message["inReplyTo"]
117
+ request = @requests[id]
118
+ next if request.nil?
119
+ request[:received] = true
120
+ request[:callback].call(droonga_message)
121
+ end
122
+ end
123
+ engine.on_read do |data|
124
+ on_read.call(data)
125
+ end
126
+
127
+ on_close = lambda do
128
+ @engines.delete(engine)
129
+ end
130
+ engine.on_close do
131
+ on_close.call
132
+ end
133
+ end
134
+ end
135
+
136
+ def initialize(host, port, tag, options={})
137
+ @host = host
138
+ @port = port
139
+ @tag = tag
140
+ default_options = {
141
+ }
142
+ @options = default_options.merge(options)
143
+ @loop = options[:loop] || ::Coolio::Loop.default
144
+
145
+ @sender = Sender.connect(@host, @port)
146
+ @sender.attach(@loop)
147
+ @receiver_host = @options[:receiver_host] || Socket.gethostname
148
+ @receiver_port = @options[:receiver_port] || 0
149
+ @receiver = Receiver.new(@receiver_host, @receiver_port)
150
+ @receiver.attach(@loop)
151
+ end
152
+
153
+ def request(message, options={}, &block)
154
+ id = message["id"] || generate_id
155
+ message = message.merge("id" => id,
156
+ "replyTo" => @receiver.droonga_name)
157
+ send(message, options)
158
+
159
+ sync = block.nil?
160
+ if sync
161
+ response = nil
162
+ block = lambda do |_response|
163
+ response = _response
164
+ end
165
+ end
166
+ @receiver.register(id) do |response|
167
+ @receiver.unregister(id)
168
+ block.call(response)
169
+ end
170
+ request = Request.new(@receiver, id, @loop)
171
+ if sync
172
+ request.wait
173
+ response
174
+ else
175
+ request
176
+ end
177
+ end
178
+
179
+ def subscribe(message, options={}, &block)
180
+ id = message["id"] || generate_id
181
+ message = message.merge("id" => id,
182
+ "from" => @receiver.droonga_name)
183
+ send(message, options)
184
+
185
+ request = InfiniteRequest.new(@loop)
186
+ sync = block.nil?
187
+ if sync
188
+ yielder = nil
189
+ buffer = []
190
+ @receiver.register(id) do |response|
191
+ if yielder
192
+ while (old_response = buffer.shift)
193
+ yielder << old_response
194
+ end
195
+ yielder << response
196
+ else
197
+ buffer << response
198
+ end
199
+ end
200
+ Enumerator.new do |_yielder|
201
+ yielder = _yielder
202
+ request.wait
203
+ end
204
+ else
205
+ @receiver.register(id, &block)
206
+ request
207
+ end
208
+ end
209
+
210
+ def send(message, options={}, &block)
211
+ if message["id"].nil? or message["date"].nil?
212
+ id = message["id"] || generate_id
213
+ date = message["date"] || Time.now
214
+ message = message.merge("id" => id, "date" => date)
215
+ end
216
+ @sender.send("#{@tag}.message", message)
217
+ end
218
+
219
+ def close
220
+ @sender.close
221
+ @receiver.close
222
+ end
223
+
224
+ private
225
+ def generate_id
226
+ Time.now.to_f.to_s
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end
232
+ end
@@ -0,0 +1,217 @@
1
+ # Copyright (C) 2013-2014 Droonga Project
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License version 2.1 as published by the Free Software Foundation.
6
+ #
7
+ # This library is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10
+ # Lesser General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU Lesser General Public
13
+ # License along with this library; if not, write to the Free Software
14
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
+
16
+ require "socket"
17
+ require "thread"
18
+ require "msgpack"
19
+ require "fluent-logger"
20
+
21
+ module Droonga
22
+ class Client
23
+ module Connection
24
+ class DroongaProtocol
25
+ class Thread
26
+ class Request
27
+ def initialize(thread)
28
+ @thread = thread
29
+ end
30
+
31
+ def wait
32
+ @thread.join
33
+ end
34
+ end
35
+
36
+ def initialize(host, port, tag, options={})
37
+ @host = host
38
+ @port = port
39
+ @tag = tag
40
+ default_options = {
41
+ :timeout => 1,
42
+ }
43
+ @options = default_options.merge(options)
44
+ @logger = Fluent::Logger::FluentLogger.new(@tag, @options)
45
+ @timeout = @options[:timeout]
46
+ end
47
+
48
+ def request(message, options={}, &block)
49
+ receiver = create_receiver
50
+ message = message.dup
51
+ message["replyTo"] = "#{receiver.host}:#{receiver.port}/droonga"
52
+ send(message, options)
53
+
54
+ sync = block.nil?
55
+ if sync
56
+ responses = []
57
+ receive(receiver, options) do |response|
58
+ responses << response
59
+ end
60
+ if responses.size > 1
61
+ responses
62
+ else
63
+ responses.first
64
+ end
65
+ else
66
+ thread = ::Thread.new do
67
+ receive(receiver, options, &block)
68
+ end
69
+ Request.new(thread)
70
+ end
71
+ end
72
+
73
+ def subscribe(message, options={}, &block)
74
+ receiver = create_receiver
75
+ message = message.dup
76
+ message["from"] = "#{receiver.host}:#{receiver.port}/droonga"
77
+ send(message, options)
78
+
79
+ receive_options = {
80
+ :timeout => nil,
81
+ }
82
+ sync = block.nil?
83
+ if sync
84
+ Enumerator.new do |yielder|
85
+ loop do
86
+ receiver.receive(receive_options) do |object|
87
+ yielder << object
88
+ end
89
+ end
90
+ end
91
+ else
92
+ thread = ::Thread.new do
93
+ begin
94
+ loop do
95
+ receiver.receive(receive_options, &block)
96
+ end
97
+ ensure
98
+ receiver.close
99
+ end
100
+ end
101
+ Request.new(thread)
102
+ end
103
+ end
104
+
105
+ def send(message, options={}, &block)
106
+ if message["id"].nil? or message["date"].nil?
107
+ message = message.merge("id" => Time.now.to_f.to_s,
108
+ "date" => Time.now)
109
+ end
110
+ @logger.post("message", message)
111
+ end
112
+
113
+ def close
114
+ @logger.close
115
+ end
116
+
117
+ private
118
+ def create_receiver
119
+ Receiver.new(:host => @options[:receiver_host],
120
+ :port => @options[:receiver_port])
121
+ end
122
+
123
+ def receive(receiver, options)
124
+ timeout = options[:timeout] || @timeout
125
+
126
+ receive_options = {
127
+ :timeout => timeout,
128
+ }
129
+ begin
130
+ receiver.receive(receive_options) do |response|
131
+ yield(response)
132
+ end
133
+ ensure
134
+ receiver.close
135
+ end
136
+ end
137
+
138
+ class Receiver
139
+ def initialize(options={})
140
+ host = options[:host] || Socket.gethostname
141
+ port = options[:port] || 0
142
+ @socket = TCPServer.new(host, port)
143
+ @read_ios = [@socket]
144
+ @client_handlers = {}
145
+ end
146
+
147
+ def close
148
+ @socket.close
149
+ @client_handlers.each_key do |client|
150
+ client.close
151
+ end
152
+ end
153
+
154
+ def host
155
+ @socket.addr[3]
156
+ end
157
+
158
+ def port
159
+ @socket.addr[1]
160
+ end
161
+
162
+ BUFFER_SIZE = 8192
163
+ def receive(options={}, &block)
164
+ timeout = options[:timeout]
165
+ catch do |tag|
166
+ loop do
167
+ start = Time.new
168
+ readable_ios, = IO.select(@read_ios, nil, nil, timeout)
169
+ break if readable_ios.nil?
170
+ if timeout
171
+ timeout -= (Time.now - start)
172
+ timeout = 0 if timeout < 0
173
+ end
174
+ readable_ios.each do |readable_io|
175
+ on_readable(readable_io) do |object|
176
+ begin
177
+ yield(object)
178
+ rescue LocalJumpError
179
+ throw(tag)
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
186
+
187
+ private
188
+ def on_readable(io)
189
+ case io
190
+ when @socket
191
+ client = @socket.accept
192
+ @read_ios << client
193
+ @client_handlers[client] = lambda do
194
+ unpacker = MessagePack::Unpacker.new
195
+ loop do
196
+ readable, = IO.select([client], nil, nil, 0)
197
+ break unless readable
198
+ data = client.read_nonblock(BUFFER_SIZE)
199
+ unpacker.feed_each(data) do |fluent_message|
200
+ tag, time, droonga_message = fluent_message
201
+ yield(droonga_message)
202
+ end
203
+ end
204
+ client.close
205
+ @read_ios.delete(client)
206
+ @client_handlers.delete(client)
207
+ end
208
+ else
209
+ @client_handlers[io].call
210
+ end
211
+ end
212
+ end
213
+ end
214
+ end
215
+ end
216
+ end
217
+ end
@@ -0,0 +1,28 @@
1
+ # Copyright (C) 2014 Droonga Project
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License version 2.1 as published by the Free Software Foundation.
6
+ #
7
+ # This library is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10
+ # Lesser General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU Lesser General Public
13
+ # License along with this library; if not, write to the Free Software
14
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
+
16
+ module Droonga
17
+ class Client
18
+ module Connection
19
+ class EmptyRequest
20
+ def initialize
21
+ end
22
+
23
+ def wait
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -23,6 +23,16 @@ module Droonga
23
23
  # The top error class of connection module.
24
24
  class Error < Client::Error
25
25
  end
26
+
27
+ class UnknownBackendError < Error
28
+ attr_reader :protocol
29
+ attr_reader :backend
30
+ def initialize(protocol, backend, detail)
31
+ @protocol = protocol
32
+ @backend = backend
33
+ super("Unknown #{@protocol} backend: <#{backend}>: #{detail}")
34
+ end
35
+ end
26
36
  end
27
37
  end
28
38
  end
@@ -17,6 +17,6 @@
17
17
 
18
18
  module Droonga
19
19
  class Client
20
- VERSION = "0.1.5"
20
+ VERSION = "0.1.6"
21
21
  end
22
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: droonga-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-28 00:00:00.000000000 Z
12
+ date: 2014-04-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: msgpack
16
- requirement: &76032510 !ruby/object:Gem::Requirement
16
+ requirement: &76464960 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *76032510
24
+ version_requirements: *76464960
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fluent-logger
27
- requirement: &76032280 !ruby/object:Gem::Requirement
27
+ requirement: &76464730 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *76032280
35
+ version_requirements: *76464730
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rack
38
- requirement: &76032070 !ruby/object:Gem::Requirement
38
+ requirement: &76464520 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *76032070
46
+ version_requirements: *76464520
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: yajl-ruby
49
- requirement: &76031860 !ruby/object:Gem::Requirement
49
+ requirement: &76464310 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,21 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *76031860
57
+ version_requirements: *76464310
58
+ - !ruby/object:Gem::Dependency
59
+ name: droonga-message-pack-packer
60
+ requirement: &76464100 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *76464100
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: bundler
60
- requirement: &76031610 !ruby/object:Gem::Requirement
71
+ requirement: &76463850 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ~>
@@ -65,10 +76,10 @@ dependencies:
65
76
  version: '1.3'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *76031610
79
+ version_requirements: *76463850
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: rake
71
- requirement: &76031400 !ruby/object:Gem::Requirement
82
+ requirement: &76463640 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ! '>='
@@ -76,10 +87,10 @@ dependencies:
76
87
  version: '0'
77
88
  type: :development
78
89
  prerelease: false
79
- version_requirements: *76031400
90
+ version_requirements: *76463640
80
91
  - !ruby/object:Gem::Dependency
81
92
  name: packnga
82
- requirement: &76031170 !ruby/object:Gem::Requirement
93
+ requirement: &76463410 !ruby/object:Gem::Requirement
83
94
  none: false
84
95
  requirements:
85
96
  - - ! '>='
@@ -87,7 +98,7 @@ dependencies:
87
98
  version: '0'
88
99
  type: :development
89
100
  prerelease: false
90
- version_requirements: *76031170
101
+ version_requirements: *76463410
91
102
  description: Droonga client for Ruby
92
103
  email:
93
104
  - droonga@groonga.org
@@ -109,6 +120,9 @@ files:
109
120
  - droonga-client.gemspec
110
121
  - lib/droonga/client.rb
111
122
  - lib/droonga/client/connection/droonga-protocol.rb
123
+ - lib/droonga/client/connection/droonga-protocol/coolio.rb
124
+ - lib/droonga/client/connection/droonga-protocol/thread.rb
125
+ - lib/droonga/client/connection/empty-request.rb
112
126
  - lib/droonga/client/connection/error.rb
113
127
  - lib/droonga/client/connection/http.rb
114
128
  - lib/droonga/client/error.rb