droonga-client 0.1.0 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8624d5def9e15c15e068add4c8f60f007fcb6d21
4
- data.tar.gz: 5ae5c17b038077337bf1653de18243c39afe7250
3
+ metadata.gz: 1425d0688ad70bf175cc34babb4a93fe23d7d0d7
4
+ data.tar.gz: cab9ce24171ee59feb0c95097bf21b9c3917dc2e
5
5
  SHA512:
6
- metadata.gz: 3cf44081bdd4f97c0cab49adbd8d64be5270465608f291dcc492441eae82d6eb522aa694e790dfedad7d6db46b77a04ed1c75e5df75771e7ab918a47b9b482c4
7
- data.tar.gz: a7e2fd87920b468f14beb8169fef80490351d0cbf8e151cedce15f74fdb50dddff724739215a56027afc035d028175c2b5f639a9d778a4be748369b659c33c31
6
+ metadata.gz: afdf8921e65d0d48c5ce50634ec2da10fc6adffa909308955b621bfa1f36af981470264133bca566f8b5906de9034fa5216f1761fe6c9e74ffaa9c7280b1fccc
7
+ data.tar.gz: 2990e9883d037f64c12de491bbd05bc26ce5be990112598c09e6e588f06452acce43774610f585f72aad319a538b94fdbd01b86cfc6c6013fab9f3401531fc2a
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  /Gemfile.lock
2
2
  /.yardoc/
3
3
  /doc/reference/
4
+ /pkg/
@@ -1,5 +1,19 @@
1
1
  # News
2
2
 
3
+ ## 0.1.1: 2014-01-29
4
+
5
+ ### Improvements
6
+
7
+ * droonga-protocol: Removed needless `statusCode` parameter from request.
8
+ * droonga-protocol: Renamed {Droonga::Client#execute} to
9
+ {Droonga::Client#request}. This is incompatible change.
10
+ * droonga-protocol: Removed {Droonga::Client#search} because it is
11
+ not useful.
12
+ * droonga-protocol: Changed to use `Socket.gethostname` as the
13
+ default receiver host instead of `0.0.0.0`.
14
+ * Added {Droonga::Client#subscribe} for PubSub style messaging.
15
+ * http: Started to support HTTP.
16
+
3
17
  ## 0.1.0: 2013-12-29
4
18
 
5
19
  ### Improvements
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2013 Droonga Project
3
+ # Copyright (C) 2013-2014 Droonga Project
4
4
  #
5
5
  # This library is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the GNU Lesser General Public
@@ -36,6 +36,8 @@ Gem::Specification.new do |spec|
36
36
 
37
37
  spec.add_runtime_dependency "msgpack"
38
38
  spec.add_runtime_dependency "fluent-logger"
39
+ spec.add_runtime_dependency "rack"
40
+ spec.add_runtime_dependency "yajl-ruby"
39
41
 
40
42
  spec.add_development_dependency "bundler", "~> 1.3"
41
43
  spec.add_development_dependency "rake"
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2013 Droonga Project
3
+ # Copyright (C) 2013-2014 Droonga Project
4
4
  #
5
5
  # This library is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the GNU Lesser General Public
@@ -17,6 +17,7 @@
17
17
 
18
18
  require "droonga/client/version"
19
19
  require "droonga/client/error"
20
+ require "droonga/client/connection/http"
20
21
  require "droonga/client/connection/droonga_protocol"
21
22
 
22
23
  module Droonga
@@ -52,15 +53,27 @@ module Droonga
52
53
  # The host name or IP address of the Droonga Engine to be connected.
53
54
  # @option options [Integer] :port (24224)
54
55
  # The port number of the Droonga Engine to be connected.
56
+ # @option options [String] :receiver_host (Socket.gethostname)
57
+ # The host name or IP address to receive response from the Droonga Engine.
58
+ # @option options [Integer] :receiver_port (0)
59
+ # The port number to receive response from the Droonga Engine.
55
60
  # @option options [Integer] :timeout (5)
56
61
  # The timeout value for connecting to, writing to and reading
57
62
  # from Droonga Engine.
58
63
  def initialize(options={})
59
- @connection = Connection::DroongaProtocol.new(options)
64
+ @connection = create_connection(options)
60
65
  end
61
66
 
62
- def search(body)
63
- @connection.search(body)
67
+ def send(message, options={}, &block)
68
+ @connection.send(message, options, &block)
69
+ end
70
+
71
+ def request(message, options={}, &block)
72
+ @connection.request(message, options, &block)
73
+ end
74
+
75
+ def subscribe(message, options={}, &block)
76
+ @connection.subscribe(message, options, &block)
64
77
  end
65
78
 
66
79
  # Close the connection used by the client. You can't send any
@@ -70,5 +83,15 @@ module Droonga
70
83
  def close
71
84
  @connection.close
72
85
  end
86
+
87
+ private
88
+ def create_connection(options)
89
+ case options[:protocol] || :droonga
90
+ when :http
91
+ Connection::HTTP.new(options)
92
+ when :droonga
93
+ Connection::DroongaProtocol.new(options)
94
+ end
95
+ end
73
96
  end
74
97
  end
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2013 Droonga Project
3
+ # Copyright (C) 2013-2014 Droonga Project
4
4
  #
5
5
  # This library is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the GNU Lesser General Public
@@ -36,47 +36,34 @@ module Droonga
36
36
 
37
37
  def initialize(options={})
38
38
  default_options = {
39
- :tag => "droonga",
40
- :host => "127.0.0.1",
41
- :port => 24224,
42
- :connect_timeout => 1,
43
- :read_timeout => 0.1,
39
+ :tag => "droonga",
40
+ :host => "127.0.0.1",
41
+ :port => 24224,
42
+ :timeout => 1,
44
43
  }
45
- options = default_options.merge(options)
46
- @logger = Fluent::Logger::FluentLogger.new(options.delete(:tag),
47
- options)
48
- @connect_timeout = options[:connect_timeout]
49
- @read_timeout = options[:read_timeout]
44
+ @options = default_options.merge(options)
45
+ @logger = Fluent::Logger::FluentLogger.new(@options.delete(:tag),
46
+ @options)
47
+ @timeout = @options[:timeout]
50
48
  end
51
49
 
52
- def search(body, &block)
53
- envelope = {
54
- "id" => Time.now.to_f.to_s,
55
- "date" => Time.now,
56
- "statusCode" => 200,
57
- "type" => "search",
58
- "body" => body,
59
- }
60
- execute(envelope, &block)
61
- end
62
-
63
- # Sends a request message and receives one ore more response
50
+ # Sends a request message and receives one or more response
64
51
  # messages.
65
52
  #
66
- # @overload execute(message, options={})
67
- # Executes the request message synchronously.
53
+ # @overload request(message, options={})
54
+ # This is synchronously version.
68
55
  #
69
56
  # @param message [Hash] Request message.
70
- # @param options [Hash] The options to executes a request.
57
+ # @param options [Hash] The options.
71
58
  # TODO: WRITE ME
72
59
  #
73
60
  # @return [Object] The response. TODO: WRITE ME
74
61
  #
75
- # @overload execute(message, options={}, &block)
76
- # Executes the passed request message asynchronously.
62
+ # @overload request(message, options={}, &block)
63
+ # This is asynchronously version.
77
64
  #
78
65
  # @param message [Hash] Request message.
79
- # @param options [Hash] The options to executes a request.
66
+ # @param options [Hash] The options.
80
67
  # TODO: WRITE ME
81
68
  # @yield [response]
82
69
  # The block is called when response is received.
@@ -84,30 +71,81 @@ module Droonga
84
71
  # The response.
85
72
  #
86
73
  # @return [Request] The request object.
87
- def execute(message, options={}, &block)
88
- receiver = Receiver.new
74
+ def request(message, options={}, &block)
75
+ receiver = create_receiver
89
76
  message = message.dup
90
77
  message["replyTo"] = "#{receiver.host}:#{receiver.port}/droonga"
91
78
  send(message, options)
92
79
 
93
- connect_timeout = options[:connect_timeout] || @connect_timeout
94
- read_timeout = options[:read_timeout] || @read_timeout
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
97
+ end
98
+
99
+ # Subscribes something and receives zero or more published
100
+ # messages.
101
+ #
102
+ # @overload subscribe(message, options={})
103
+ # This is enumerator version.
104
+ #
105
+ # @param message [Hash] Subscribe message.
106
+ # @param options [Hash] The options.
107
+ # TODO: WRITE ME
108
+ #
109
+ # @return [Enumerator] You can get a published message by
110
+ # #next. You can also use #each to get published messages.
111
+ #
112
+ # @overload subscribe(message, options={}, &block)
113
+ # This is asynchronously version.
114
+ #
115
+ # @param message [Hash] Subscribe message.
116
+ # @param options [Hash] The options.
117
+ # TODO: WRITE ME
118
+ # @yield [message]
119
+ # The block is called when a published message is received.
120
+ # The block may be called zero or more times.
121
+ # @yieldparam [Object] message
122
+ # The published message.
123
+ #
124
+ # @return [Request] The request object.
125
+ 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
+
95
131
  receive_options = {
96
- :connect_timeout => connect_timeout,
97
- :read_timeout => read_timeout
132
+ :timeout => nil,
98
133
  }
99
134
  sync = block.nil?
100
135
  if sync
101
- begin
102
- receiver.receive(receive_options)
103
- ensure
104
- receiver.close
136
+ Enumerator.new do |yielder|
137
+ loop do
138
+ receiver.receive(receive_options) do |object|
139
+ yielder << object
140
+ end
141
+ end
105
142
  end
106
143
  else
107
144
  thread = Thread.new do
108
145
  begin
109
- response = receiver.receive(receive_options)
110
- yield(response) if response
146
+ loop do
147
+ receiver.receive(receive_options, &block)
148
+ end
111
149
  ensure
112
150
  receiver.close
113
151
  end
@@ -119,12 +157,16 @@ module Droonga
119
157
  # Sends low level request. Normally, you should use other
120
158
  # convenience methods.
121
159
  #
122
- # @param envelope [Hash] Request envelope.
160
+ # @param message [Hash] Request message.
123
161
  # @param options [Hash] The options to send request.
124
162
  # TODO: WRITE ME
125
163
  # @return [void]
126
- def send(envelope, options={}, &block)
127
- @logger.post("message", envelope)
164
+ 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)
128
170
  end
129
171
 
130
172
  # Close the connection. This connection can't be used anymore.
@@ -134,18 +176,41 @@ module Droonga
134
176
  @logger.close
135
177
  end
136
178
 
179
+ 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
187
+
188
+ receive_options = {
189
+ :timeout => timeout,
190
+ }
191
+ begin
192
+ receiver.receive(receive_options) do |response|
193
+ yield(response)
194
+ end
195
+ ensure
196
+ receiver.close
197
+ end
198
+ end
199
+
137
200
  class Receiver
138
201
  def initialize(options={})
139
- default_options = {
140
- :host => "0.0.0.0",
141
- :port => 0,
142
- }
143
- options = default_options.merge(options)
144
- @socket = TCPServer.new(options[:host], options[:port])
202
+ host = options[:host] || Socket.gethostname
203
+ port = options[:port] || 0
204
+ @socket = TCPServer.new(host, port)
205
+ @read_ios = [@socket]
206
+ @client_handlers = {}
145
207
  end
146
208
 
147
209
  def close
148
210
  @socket.close
211
+ @client_handlers.each_key do |client|
212
+ client.close
213
+ end
149
214
  end
150
215
 
151
216
  def host
@@ -157,37 +222,48 @@ module Droonga
157
222
  end
158
223
 
159
224
  BUFFER_SIZE = 8192
160
- def receive(options={})
161
- responses = []
162
- select(@socket, options[:connect_timeout]) do
163
- client = @socket.accept
164
- unpacker = MessagePack::Unpacker.new
165
- select(client, options[:read_timeout]) do
166
- data = client.read_nonblock(BUFFER_SIZE)
167
- unpacker.feed_each(data) do |object|
168
- responses << object
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
169
244
  end
170
245
  end
171
- client.close
172
246
  end
173
- # TODO: ENABLE ME
174
- # if responses.size >= 2
175
- # responses
176
- # else
177
- responses.first
178
- # end
179
247
  end
180
248
 
181
249
  private
182
- def select(input, timeout)
183
- loop do
184
- start = Time.now
185
- readables, = IO.select([input], nil, nil, timeout)
186
- timeout -= (Time.now - start)
187
- timeout /= 2.0
188
- timeout = 0 if timeout < 0
189
- break if readables.nil?
190
- yield(timeout)
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
+ data = client.read_nonblock(BUFFER_SIZE)
258
+ unpacker.feed_each(data) do |object|
259
+ yield(object)
260
+ end
261
+ client.close
262
+ @read_ios.delete(client)
263
+ @client_handlers.delete(client)
264
+ end
265
+ else
266
+ @client_handlers[io].call
191
267
  end
192
268
  end
193
269
  end
@@ -23,16 +23,6 @@ module Droonga
23
23
  # The top error class of connection module.
24
24
  class Error < Client::Error
25
25
  end
26
-
27
- # The error class for invalid response type is specified.
28
- class InvalidResponseType < Error
29
- attr_reader :type
30
- def initialize(type)
31
- @type = type
32
- super("Unknown response type: <#{@type}>. " +
33
- "Available types: [:none, :one]")
34
- end
35
- end
36
26
  end
37
27
  end
38
28
  end
@@ -0,0 +1,186 @@
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 "net/http"
17
+ require "thread"
18
+
19
+ require "rack"
20
+
21
+ require "yajl"
22
+
23
+ require "droonga/client/connection/error"
24
+
25
+ module Droonga
26
+ class Client
27
+ module Connection
28
+ class HTTP
29
+ # The error class for invalid HTTP method case
30
+ class InvalidHTTPMethodError < Error
31
+ attr_reader :http_method
32
+ attr_reader :request_message
33
+ def initialize(http_method, request_message)
34
+ @http_method = http_method
35
+ @request_message = request_message
36
+ super("Unsupport HTTP Method: <#{@http_method}>: " +
37
+ "<#{@request_message.inspect}>")
38
+ end
39
+ end
40
+
41
+ class Request
42
+ def initialize(thread)
43
+ @thread = thread
44
+ end
45
+
46
+ def wait
47
+ @thread.join
48
+ end
49
+ end
50
+
51
+ def initialize(options={})
52
+ @host = options[:host] || "127.0.0.1"
53
+ @port = options[:port] || 80
54
+ @timeout = options[:timeout] || 1
55
+ end
56
+
57
+ # Sends a request message and receives one or more response
58
+ # messages.
59
+ #
60
+ # @overload request(message, options={})
61
+ # This is synchronously version.
62
+ #
63
+ # @param message [Hash] Request message.
64
+ # @param options [Hash] The options.
65
+ # TODO: WRITE ME
66
+ #
67
+ # @return [Object] The response. TODO: WRITE ME
68
+ #
69
+ # @overload request(message, options={}, &block)
70
+ # This is asynchronously version.
71
+ #
72
+ # @param message [Hash] Request message.
73
+ # @param options [Hash] The options.
74
+ # TODO: WRITE ME
75
+ # @yield [response]
76
+ # The block is called when response is received.
77
+ # @yieldparam [Object] response
78
+ # The response.
79
+ #
80
+ # @return [Request] The request object.
81
+ def request(message, options={}, &block)
82
+ sync = block.nil?
83
+ if sync
84
+ send(message, options) do |response|
85
+ response.body
86
+ end
87
+ else
88
+ thread = Thread.new do
89
+ send(message, options) do |response|
90
+ yield(response.body)
91
+ end
92
+ end
93
+ Request.new(thread)
94
+ end
95
+ end
96
+
97
+ # Subscribes something and receives zero or more published
98
+ # messages.
99
+ #
100
+ # @overload subscribe(message, options={}, &block)
101
+ # This is asynchronously version.
102
+ #
103
+ # @param message [Hash] Subscribe message.
104
+ # @param options [Hash] The options.
105
+ # TODO: WRITE ME
106
+ # @yield [message]
107
+ # The block is called when a published message is received.
108
+ # The block may be called zero or more times.
109
+ # @yieldparam [Object] message
110
+ # The published message.
111
+ #
112
+ # @return [Request] The request object.
113
+ def subscribe(message, options={}, &block)
114
+ thread = Thread.new do
115
+ json_parser = Yajl::Parser.new
116
+ json_parser.on_parse_complete = block
117
+ send(message, options.merge(:read_timeout => nil)) do |response|
118
+ response.read_body do |chunk|
119
+ json_parser << chunk
120
+ end
121
+ end
122
+ end
123
+ Request.new(thread)
124
+ end
125
+
126
+ # Sends low level request. Normally, you should use other
127
+ # convenience methods.
128
+ #
129
+ # @param envelope [Hash] Request envelope.
130
+ # @param options [Hash] The options to send request.
131
+ # TODO: WRITE ME
132
+ # @return [void]
133
+ def send(message, options={}, &block)
134
+ http = Net::HTTP.new(@host, @port)
135
+ open_timeout = @timeout
136
+ read_timeout = @timeout
137
+ open_timeout = options[:open_timeout] if options.key?(:open_timeout)
138
+ read_timeout = options[:read_timeout] if options.key?(:read_timeout)
139
+ http.open_timeout = open_timeout
140
+ http.read_timeout = read_timeout
141
+ request = build_request(message)
142
+ http.start do
143
+ http.request(request) do |response|
144
+ yield(response)
145
+ end
146
+ end
147
+ end
148
+
149
+ # Close the connection. This connection can't be used anymore.
150
+ #
151
+ # @return [void]
152
+ def close
153
+ end
154
+
155
+ private
156
+ def build_request(message)
157
+ http_method = message["method"] || "GET"
158
+ http_headers = message["headers"] || {}
159
+ case http_method
160
+ when "POST"
161
+ request = Net::HTTP::Post.new(build_path(message, {}),
162
+ http_headers)
163
+ request.body = JSON.generate(message["body"])
164
+ request
165
+ when "GET"
166
+ parameters = message["body"] || {}
167
+ Net::HTTP::Get.new(build_path(message, parameters),
168
+ http_headers)
169
+ else
170
+ raise InvalidHTTPMethodError.new(http_method, message)
171
+ end
172
+ end
173
+
174
+ def build_path(message, parameters)
175
+ type = message["type"]
176
+ base_path = message["path"] || "/#{type}"
177
+ if parameters.empty?
178
+ base_path
179
+ else
180
+ "#{base_path}?#{Rack::Utils.build_nested_query(parameters)}"
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
@@ -17,6 +17,6 @@
17
17
 
18
18
  module Droonga
19
19
  class Client
20
- VERSION = "0.1.0"
20
+ VERSION = "0.1.1"
21
21
  end
22
22
  end
@@ -0,0 +1,111 @@
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 "optparse"
17
+ require "json"
18
+
19
+ require "droonga/client"
20
+
21
+ options = {
22
+ :host => "localhost",
23
+ :port => 24224,
24
+ :tag => "droonga",
25
+ :protocol => :droonga,
26
+ :timeout => 1,
27
+ :exit_on_response => true,
28
+ :receiver_host => "localhost",
29
+ :receiver_port => 0,
30
+ :report_elapsed_time => true,
31
+ }
32
+
33
+ parser = OptionParser.new
34
+ parser.banner += " REQUEST_JSON_FILE"
35
+ parser.separator("")
36
+ parser.separator("Connect:")
37
+ parser.on("--host=HOST",
38
+ "Host name to be connected.",
39
+ "(#{options[:host]})") do |host|
40
+ options[:host] = host
41
+ end
42
+ parser.on("--port=PORT", Integer,
43
+ "Port number to be connected.",
44
+ "(#{options[:port]})") do |port|
45
+ options[:port] = port
46
+ end
47
+ parser.on("--tag=TAG",
48
+ "Tag name to be used to communicate with Droonga system.",
49
+ "(#{options[:tag]})") do |tag|
50
+ options[:tag] = tag
51
+ end
52
+ available_protocols = [:droonga, :http]
53
+ parser.on("--protocol=PROTOCOL", available_protocols,
54
+ "Protocol to be used to communicate with Droonga system.",
55
+ "[#{available_protocols.join('|')}",
56
+ "(#{options[:protocol]})") do |protocol|
57
+ options[:protocol] = protocol
58
+ end
59
+ parser.separator("")
60
+ parser.separator("Timeout:")
61
+ parser.on("--timeout=TIMEOUT", Integer,
62
+ "Timeout for operations.",
63
+ "(#{options[:timeout]})") do |timeout|
64
+ options[:timeout] = timeout
65
+ end
66
+ parser.on("--[no-]exit-on-response",
67
+ "Exit when a response is received.",
68
+ "(#{options[:exit_on_response]})") do |exit_on_response|
69
+ options[:exit_on_response] = exit_on_response
70
+ end
71
+ parser.separator("")
72
+ parser.separator("Droonga protocol:")
73
+ parser.on("--receiver-host=HOST",
74
+ "Host name to be received a response from Droonga engine.",
75
+ "(#{options[:receiver_host]})") do |host|
76
+ options[:receiver_host] = host
77
+ end
78
+ parser.on("--receiver-port=PORT", Integer,
79
+ "Port number to be received a response from Droonga engine.",
80
+ "(#{options[:receiver_port]})") do |port|
81
+ options[:receiver_port] = port
82
+ end
83
+ parser.separator("")
84
+ parser.separator("Report:")
85
+ parser.on("--[no-]report-elapsed-time",
86
+ "Reports elapsed time.",
87
+ "(#{options[:report_elapsed_time]})") do |report_elapsed_time|
88
+ options[:report_elapsed_time] = report_elapsed_time
89
+ end
90
+ *rest = parser.parse!(ARGV)
91
+
92
+ if rest.size < 1
93
+ puts("request JSON file is missing.")
94
+ exit(false)
95
+ end
96
+
97
+ request_json_file = rest.first
98
+
99
+ client = Droonga::Client.new(options)
100
+ request_message = JSON.parse(File.read(request_json_file))
101
+ start = Time.now
102
+ request = client.request(request_message) do |response|
103
+ puts("Elapsed time: #{Time.now - start}") if options[:report_elapsed_time]
104
+ begin
105
+ puts(JSON.pretty_generate(response))
106
+ rescue
107
+ p(response)
108
+ end
109
+ break if options[:exit_on_response]
110
+ end
111
+ request.wait
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: droonga-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Droonga Project
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-29 00:00:00.000000000 Z
11
+ date: 2014-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rack
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yajl-ruby
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: bundler
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -98,8 +126,10 @@ files:
98
126
  - lib/droonga/client.rb
99
127
  - lib/droonga/client/connection/droonga_protocol.rb
100
128
  - lib/droonga/client/connection/error.rb
129
+ - lib/droonga/client/connection/http.rb
101
130
  - lib/droonga/client/error.rb
102
131
  - lib/droonga/client/version.rb
132
+ - sample/droonga-request.rb
103
133
  homepage: https://github.com/droonga/droonga-client-ruby
104
134
  licenses:
105
135
  - LGPL-2.1