droonga-client 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c506f2bd7e3f43ef73c8ed5463a678fb6a281cda
4
- data.tar.gz: b6f6a5fec2421d4b625060d9b4d2f61b1d229cdc
3
+ metadata.gz: 0bddfcb4cdb8dd14e9290a5e63ef0bbbff7a2302
4
+ data.tar.gz: 973fd9fcc5799bada35619aca7551a1c668f33b4
5
5
  SHA512:
6
- metadata.gz: 8c644cdee887e5733d8349eda8ea6aa5f316d73357ea311e0af419a439d13d998260d7443ae7f8062b1aba1e021c6a64f2d7360f4acc0225c5b630cd9c67ea53
7
- data.tar.gz: 3cc489e4cb5de93c5705df1a3c961fd6d320f4e97b20fd0529fd4ce63509374e02af892c48dad4bf7c9d52f0cc98310744f31ee2b538a066ecb7194dae6cc91d
6
+ metadata.gz: 3998d23334009b7c7b6e35bc67d271493edbc691cf3467f714c8e139b78827b592456eb574c4e16286d3c2d7c1b910eac78b42d7c9f8989b1abf4b341f1e2f45
7
+ data.tar.gz: 5bc8cf2f9df903588bf3816036e2f200a38e02c102ce26abd894b1408976639bfa2c99fc0e5e6c7fd02a8363ab612c15e0f2d8297f8b81a463a732e31aefc12f
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  # -*- mode: ruby; coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2013 Droonga Project
3
+ # Copyright (C) 2013-2015 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
@@ -19,3 +19,11 @@ source 'https://rubygems.org'
19
19
 
20
20
  # Specify your gem's dependencies in droonga-client.gemspec
21
21
  gemspec
22
+
23
+ parent_dir = File.join(File.dirname(__FILE__), "..")
24
+ grn2drn_dir = File.join(parent_dir, "grn2drn")
25
+ if File.exist?(grn2drn_dir)
26
+ gem "grn2drn", :path => grn2drn_dir
27
+ else
28
+ gem "grn2drn", :github => "droonga/grn2drn"
29
+ end
@@ -27,7 +27,8 @@ module Droonga
27
27
  option.banner("Usage: droonga-add [options]\n" +
28
28
  " ex: droonga-add --table User --name Adam --age 10\n" +
29
29
  " droonga-add --table Server --value:host example.com\n" +
30
- " (You can specify column value expressly with the prefix \"value:\".)")
30
+ " (You can specify column value expressly with the prefix \"value:\".)\n" +
31
+ "")
31
32
 
32
33
  option.on("table=",
33
34
  "Name of the target table.",
@@ -51,10 +52,12 @@ module Droonga
51
52
  puts "Adding new record..."
52
53
  puts(JSON.pretty_generate(add_params))
53
54
 
54
- response = request(add_message)
55
- raise NoResponse.new unless response
55
+ result = request(add_message) do |response|
56
+ raise NoResponse.new unless response
57
+ response["body"]
58
+ end
56
59
 
57
- if response["body"]
60
+ if result
58
61
  puts "Done."
59
62
  true
60
63
  else
@@ -18,6 +18,7 @@
18
18
  require "json"
19
19
 
20
20
  require "droonga/command/base"
21
+ require "grn2drn/command-converter"
21
22
 
22
23
  module Droonga
23
24
  module Command
@@ -32,34 +33,31 @@ module Droonga
32
33
  parse_options do |option|
33
34
  option.banner("Usage: droonga-groonga [groonga-command-name] [options]\n" +
34
35
  " ex: droonga-groonga select --table=Users")
35
-
36
36
  option.separator("Formatting:")
37
37
  option.on(:pretty,
38
38
  "Output result as a pretty print JSON.",
39
39
  :default => false)
40
40
  end
41
41
 
42
- @command = ARGV.shift
43
- assert_valid_command
44
-
45
- groonga_message = {
46
- "dataset" => @options[:dataset],
47
- "type" => @command,
48
- "body" => build_params(ARGV),
49
- }
50
-
51
- response = request(groonga_message)
52
- raise NoResponse.new unless response
53
- body = response["body"]
54
-
55
- if @options[:pretty]
56
- puts(JSON.pretty_generate(body))
42
+ unless ARGV.empty?
43
+ groonga_command_args = ARGV.collect do |arg|
44
+ if /\s/ =~ arg
45
+ JSON.generate(arg)
46
+ else
47
+ arg
48
+ end
49
+ end
50
+ command_converter.convert(groonga_command_args.join(" ")) do |command|
51
+ process_groonga_message(command)
52
+ end
57
53
  else
58
- puts(JSON.generate(body))
54
+ command_converter.convert(ARGF) do |command|
55
+ process_groonga_message(command)
56
+ end
59
57
  end
60
58
 
61
59
  true
62
- rescue MissingRequiredParameter, InvalidCommandName, MissingCommandName
60
+ rescue MissingRequiredParameter
63
61
  puts(@options)
64
62
  false
65
63
  rescue NoResponse
@@ -68,28 +66,29 @@ module Droonga
68
66
  end
69
67
 
70
68
  private
71
- def assert_valid_command
72
- raise InvalidCommandName.new(@command) if /\A--.+\z/ =~ @command
73
- raise MissingCommandName.new if @command.nil?
74
- end
69
+ def process_groonga_message(groonga_message)
70
+ request(groonga_message) do |response|
71
+ raise NoResponse.new unless response
72
+ body = response["body"]
75
73
 
76
- def build_params(argv)
77
- params = {}
78
- option_name = nil
79
- argv.each do |arg|
80
- case arg
81
- when /\A--([^\s=]+)=(.+)\z/
82
- params[$1] = $2
83
- when /\A--([^\s=]+)\z/
84
- option_name = $1
74
+ if @options[:pretty]
75
+ puts(JSON.pretty_generate(body))
85
76
  else
86
- if option_name
87
- params[option_name] = arg
88
- option_name = nil
89
- end
77
+ puts(JSON.generate(body))
90
78
  end
91
79
  end
92
- params
80
+ end
81
+
82
+ def command_converter
83
+ @command_converter ||= create_command_converter
84
+ end
85
+
86
+ def create_command_converter
87
+ convert_options = {
88
+ :id_prefix => "droonga-groonga:#{Time.now.to_i.to_s}",
89
+ :dataset => @options[:dataset],
90
+ }
91
+ ::Grn2Drn::CommandConverter.new(convert_options)
93
92
  end
94
93
  end
95
94
  end
@@ -26,10 +26,9 @@ options = {
26
26
  :port => Droonga::Client::DEFAULT_PORT,
27
27
  :tag => Droonga::Client::DEFAULT_TAG,
28
28
  :default_dataset => Droonga::Client::DEFAULT_DATASET,
29
- :protocol => :droonga,
29
+ :protocol => Droonga::Client::DEFAULT_PROTOCOL,
30
30
  :default_target_role => Droonga::Client::DEFAULT_TARGET_ROLE,
31
31
  :timeout => 1,
32
- :exit_on_response => true,
33
32
  :receiver_host => Droonga::Client::DEFAULT_HOST,
34
33
  :receiver_port => 0,
35
34
  :report_request => false,
@@ -44,60 +43,50 @@ parser.banner += " REQUEST_JSON_FILE"
44
43
  parser.separator("")
45
44
  parser.separator("Connect:")
46
45
  parser.on("--host=HOST",
47
- "Host name to be connected.",
46
+ "Host name of the endpoint to communicate with the Droonga cluster.",
48
47
  "(#{options[:host]})") do |host|
49
48
  options[:host] = host
50
49
  end
51
50
  parser.on("--port=PORT", Integer,
52
- "Port number to be connected.",
51
+ "Port number to communicate with the endpoint of the Droonga cluster.",
53
52
  "(#{options[:port]})") do |port|
54
53
  options[:port] = port
55
54
  end
56
55
  parser.on("--tag=TAG",
57
- "Tag name to be used to communicate with Droonga system.",
56
+ "Tag name to communicate with the endpoint of the Droonga cluster.",
58
57
  "(#{options[:tag]})") do |tag|
59
58
  options[:tag] = tag
60
59
  end
61
60
  available_protocols = [:droonga, :http]
62
61
  parser.on("--protocol=PROTOCOL", available_protocols,
63
- "Protocol to be used to communicate with Droonga system.",
62
+ "Protocol to communicate with the endpoint of the Droonga cluster.",
64
63
  "[#{available_protocols.join('|')}]",
65
64
  "(#{options[:protocol]})") do |protocol|
66
- options[:protocol] = protocol
65
+ options[:protocol] = protocol.downcase.to_sym
67
66
  end
68
67
  parser.separator("")
69
68
  parser.separator("Timeout:")
70
69
  parser.on("--timeout=TIMEOUT", Integer,
71
- "Timeout for operations.",
70
+ "Time to terminate unresponsive connections, in seconds.",
72
71
  "(#{options[:timeout]})") do |timeout|
73
72
  options[:timeout] = timeout
74
73
  end
75
- parser.on("--[no-]exit-on-response",
76
- "Exit when a response is received.",
77
- "(#{options[:exit_on_response]})") do |exit_on_response|
78
- options[:exit_on_response] = exit_on_response
79
- end
80
74
  parser.separator("")
81
75
  parser.separator("Droonga protocol:")
82
76
  parser.on("--receiver-host=HOST",
83
- "Host name to be received a response from Droonga engine.",
77
+ "Host name of the computer you are running this command.",
84
78
  "(#{options[:receiver_host]})") do |host|
85
79
  options[:receiver_host] = host
86
80
  end
87
- parser.on("--receiver-port=PORT", Integer,
88
- "Port number to be received a response from Droonga engine.",
89
- "(#{options[:receiver_port]})") do |port|
90
- options[:receiver_port] = port
91
- end
92
81
  parser.separator("")
93
82
  parser.separator("Report:")
94
83
  parser.on("--[no-]report-request",
95
- "Reports request message.",
84
+ "Reports request messages actually sent.",
96
85
  "(#{options[:report_request]})") do |report_request|
97
86
  options[:report_request] = report_request
98
87
  end
99
88
  parser.on("--[no-]report-elapsed-time",
100
- "Reports elapsed time.",
89
+ "Reports elapsed time between a request and a response.",
101
90
  "(#{options[:report_elapsed_time]})") do |report_elapsed_time|
102
91
  options[:report_elapsed_time] = report_elapsed_time
103
92
  end
@@ -109,17 +98,17 @@ parser.on("--detault-dataset=NAME",
109
98
  options[:default_dataset] = name
110
99
  end
111
100
  parser.on("--detault-target-role=ROLE",
112
- "Default target role of engine nodes for sending messages.",
101
+ "Default role of engine nodes which should process messages.",
113
102
  "(#{options[:default_target_role]})") do |role|
114
103
  options[:default_target_role] = role
115
104
  end
116
105
  parser.on("--[no-]completion",
117
- "Do completion of required fields for input message or not.",
106
+ "Do completion of required fields for input messages or not.",
118
107
  "(#{options[:completion]})") do |completion|
119
108
  options[:completion] = completion
120
109
  end
121
110
  parser.on("--[no-]validation",
122
- "Do validation for input message or not.",
111
+ "Do validation for input messages or not.",
123
112
  "(#{options[:validation]})") do |validation|
124
113
  options[:validation] = validation
125
114
  end
@@ -128,9 +117,9 @@ request_json_files = parser.parse!(ARGV)
128
117
  client = Droonga::Client.new(options)
129
118
  json_parser = Yajl::Parser.new
130
119
  json_parser.on_parse_complete = lambda do |request_message|
131
- request_message["dataset"] ||= options[:default_dataset]
132
120
  if options[:report_request]
133
121
  message = "Request: "
122
+ request_message = client.complete(request_message)
134
123
  begin
135
124
  message << JSON.pretty_generate(request_message)
136
125
  rescue
@@ -140,21 +129,21 @@ json_parser.on_parse_complete = lambda do |request_message|
140
129
  print(message)
141
130
  end
142
131
  start = Time.now
143
- request = client.request(request_message) do |response|
144
- message = ""
145
- if options[:report_elapsed_time]
146
- message << "Elapsed time: #{Time.now - start}\n"
147
- end
148
- begin
149
- message << JSON.pretty_generate(response)
150
- rescue
151
- message << response.inspect
132
+ response = client.request(request_message)
133
+ message = ""
134
+ if options[:report_elapsed_time]
135
+ message << "Elapsed time: #{Time.now - start}\n"
136
+ end
137
+ begin
138
+ if options[:protocol] == :http
139
+ response = JSON.parse(response)
152
140
  end
153
- message << "\n"
154
- print(message)
155
- break if options[:exit_on_response]
141
+ message << JSON.pretty_generate(response)
142
+ rescue
143
+ message << response.inspect
156
144
  end
157
- request.wait
145
+ message << "\n"
146
+ print(message)
158
147
  end
159
148
 
160
149
  if request_json_files.empty?
@@ -25,7 +25,7 @@ require "droonga/client"
25
25
  options = OpenStruct.new
26
26
  options.report_request = false
27
27
  options.report_throughput = false
28
- options.default_protocol = "droonga"
28
+ options.default_protocol = Droonga::Client::DEFAULT_PROTOCOL
29
29
  options.default_host = Droonga::Client::DEFAULT_HOST
30
30
  options.default_port = Droonga::Client::DEFAULT_PORT
31
31
  options.default_tag = Droonga::Client::DEFAULT_TAG
@@ -53,15 +53,16 @@ def parse_server(server, options)
53
53
  protocol = nil
54
54
  end
55
55
 
56
- protocol ||= options.default_protocol
56
+ protocol ||= options.default_protocol.to_s
57
57
  port ||= options.default_port
58
58
  tag ||= options.default_tag
59
59
 
60
60
  {
61
61
  :host => host,
62
62
  :port => Integer(port),
63
- :protocol => protocol.to_sym,
63
+ :protocol => protocol.downcase.to_sym,
64
64
  :tag => tag,
65
+ :default_dataset => options.default_dataset,
65
66
  :default_target_role => options.default_target_role,
66
67
  :completion => options.completion,
67
68
  :validation => options.validation,
@@ -114,36 +115,36 @@ parser.on("--server=PROTOCOL:HOST:PORT/TAG",
114
115
  servers << server
115
116
  end
116
117
  parser.on("--messages-per-second=N", Integer,
117
- "Apply rate limitation by N messages/second.",
118
- "'#{Droonga::Client::RateLimiter::NO_LIMIT}' means no limit.",
118
+ "Maximum number of messages to be sent in a second.",
119
+ "'#{Droonga::Client::RateLimiter::NO_LIMIT}' means \"no limit\".",
119
120
  "(#{messages_per_second})") do |n|
120
121
  messages_per_second = n
121
122
  end
122
123
  parser.on("--default-protocol=PROTOCOL",
123
- "Default protocol for servers.",
124
+ "Default protocol to communicate with endpoints of the Droonga cluster.",
124
125
  "(#{options.default_protocol})") do |protocol|
125
- options.default_protocol = protocol
126
+ options.default_protocol = protocol.downcase.to_sym
126
127
  end
127
128
  parser.on("--default-port=PORT", Integer,
128
- "Default port for servers.",
129
+ "Default port number to communicate with endpoints of the Droonga cluster.",
129
130
  "(#{options.default_port})") do |port|
130
131
  options.default_port = port
131
132
  end
132
133
  parser.on("--default-tag=TAG",
133
- "Default tag for servers.",
134
+ "Default tag name to communicate with the endpoints of the Droonga cluster.",
134
135
  "(#{options.default_tag})") do |tag|
135
136
  options.default_tag = tag
136
137
  end
137
138
  parser.separator("")
138
139
  parser.separator("Report:")
139
140
  parser.on("--[no-]report-request",
140
- "Reports request message.",
141
+ "Reports request messages.",
141
142
  "(#{options.report_request})") do |report_request|
142
143
  options.report_request = report_request
143
144
  end
144
- parser.on("--report-throughput",
145
+ parser.on("--[no-]report-throughput",
145
146
  "Reports throughput by messages per second.",
146
- "(no)") do
147
+ "(#{options.report_throughput})") do
147
148
  options.report_throughput = true
148
149
  end
149
150
  parser.separator("")
@@ -154,23 +155,26 @@ parser.on("--default-dataset=NAME",
154
155
  options.default_dataset = name
155
156
  end
156
157
  parser.on("--default-target-role=ROLE",
157
- "Default target role of engine nodes for sending messages.",
158
+ "Default role of engine nodes which should process messages.",
158
159
  "(#{options.default_target_role})") do |role|
159
160
  options.default_target_role = role
160
161
  end
161
162
  parser.on("--[no-]completion",
162
- "Do completion of required fields for input message or not.",
163
+ "Do completion of required fields for input messages or not.",
163
164
  "(#{options.completion})") do |completion|
164
165
  options.completion = completion
165
166
  end
166
167
  parser.on("--[no-]validation",
167
- "Do validation for input message or not.",
168
+ "Do validation for input messages or not.",
168
169
  "(#{options.validation})") do |validation|
169
170
  options.validation = validation
170
171
  end
171
172
  request_json_files = parser.parse!(ARGV)
172
173
 
173
- servers << default_server if servers.empty?
174
+ if servers.empty?
175
+ default_server = "#{options.default_protocol}:#{options.default_host}:#{options.default_port}/#{options.default_tag}"
176
+ servers << default_server
177
+ end
174
178
  if messages_per_second > 0 and servers.size > 1
175
179
  messages_per_second = messages_per_second / servers.size
176
180
  end
@@ -187,9 +191,10 @@ end
187
191
  client_index = 0
188
192
  json_parser = Yajl::Parser.new
189
193
  json_parser.on_parse_complete = lambda do |request_message|
190
- request_message["dataset"] ||= options.default_dataset
194
+ client = clients[client_index]
191
195
  if options.report_request
192
196
  message = "Request: "
197
+ request_message = client.complete(request_message)
193
198
  begin
194
199
  message << JSON.pretty_generate(request_message)
195
200
  rescue
@@ -198,7 +203,6 @@ json_parser.on_parse_complete = lambda do |request_message|
198
203
  message << "\n"
199
204
  print(message)
200
205
  end
201
- client = clients[client_index]
202
206
  client.send(request_message)
203
207
  client_index = (client_index + 1) % clients.size
204
208
  throughput_reporter.on_message_sent if throughput_reporter
@@ -25,19 +25,23 @@ module Droonga
25
25
  def run
26
26
  parse_options do |option|
27
27
  option.on(:pretty,
28
- "Output result as a pretty print JSON.",
28
+ "Output result as a pretty printed JSON.",
29
29
  :default => false)
30
30
  end
31
31
 
32
- response = request("dataset" => @options[:dataset],
33
- "type" => "system.status")
34
- raise NoResponse.new unless response
35
- body = response["body"]
32
+ system_status_message = {
33
+ "dataset" => @options[:dataset],
34
+ "type" => "system.status",
35
+ }
36
+ request(system_status_message) do |response|
37
+ raise NoResponse.new unless response
38
+ body = response["body"]
36
39
 
37
- if @options[:pretty]
38
- puts(JSON.pretty_generate(body))
39
- else
40
- puts(JSON.generate(body))
40
+ if @options[:pretty]
41
+ puts(JSON.pretty_generate(body))
42
+ else
43
+ puts(JSON.generate(body))
44
+ end
41
45
  end
42
46
 
43
47
  true
@@ -1,6 +1,15 @@
1
1
  # News
2
2
 
3
- ## 0.2.1: 2005-04-29
3
+ ## 0.2.2: 2015-05-29
4
+
5
+ * `droonga-request`
6
+ * Works correctly with HTTP protocol. (regression)
7
+ * The `--[no-]exit-on-response` option is removed because it is nonsense.
8
+ * Add `--dry-run` option for `droonga-add`, `droonga-system-status` and `droonga-groonga` commands.
9
+ You can try them without sending messages.
10
+ * `droonga-groonga` now supports conversion of multiple Groonga commands given via the standard input.
11
+
12
+ ## 0.2.1: 2015-04-29
4
13
 
5
14
  * Required fields of input messages are automatically completed by default.
6
15
  * Input messages are automatically validated by default.
@@ -37,6 +37,7 @@ Gem::Specification.new do |spec|
37
37
 
38
38
  spec.add_runtime_dependency "droonga-message-pack-packer"
39
39
  spec.add_runtime_dependency "fluent-logger"
40
+ spec.add_runtime_dependency "grn2drn", ">= 1.0.5"
40
41
  spec.add_runtime_dependency "msgpack"
41
42
  spec.add_runtime_dependency "rack"
42
43
  spec.add_runtime_dependency "slop", "<= 3.6.0"
@@ -25,6 +25,7 @@ require "droonga/client/message_validator"
25
25
 
26
26
  module Droonga
27
27
  class Client
28
+ DEFAULT_PROTOCOL = :droonga
28
29
  DEFAULT_HOST = Socket.gethostname
29
30
  DEFAULT_HOST.force_encoding("US-ASCII") if DEFAULT_HOST.ascii_only?
30
31
  DEFAULT_PORT = 10031
@@ -34,6 +35,7 @@ module Droonga
34
35
  DEFAULT_TIMEOUT_SECONDS = 3
35
36
 
36
37
  attr_writer :on_error
38
+ attr_reader :protocol
37
39
 
38
40
  class ConnectionError < StandardError
39
41
  def initialize(error)
@@ -83,6 +85,7 @@ module Droonga
83
85
  # @option options [Boolean] :validation (true)
84
86
  # Do or do not validate input messages.
85
87
  def initialize(options={})
88
+ @protocol = options[:protocol] || DEFAULT_PROTOCOL
86
89
  @connection = create_connection(options)
87
90
  @connection.on_error = lambda do |error|
88
91
  on_error(ConnectionError.new(error))
@@ -91,7 +94,8 @@ module Droonga
91
94
  @completion = options[:completion] != false
92
95
  @validation = options[:validation] != false
93
96
 
94
- @completer = MessageCompleter.new(:default_timeout => options[:default_timeout],
97
+ @completer = MessageCompleter.new(:default_dataset => options[:default_dataset],
98
+ :default_timeout => options[:default_timeout],
95
99
  :default_target_role => options[:default_target_role])
96
100
  @validator = MessageValidator.new
97
101
  end
@@ -122,9 +126,30 @@ module Droonga
122
126
  @connection.close
123
127
  end
124
128
 
129
+ def complete(message)
130
+ case @protocol
131
+ when :http
132
+ http_request = @connection.build_request(message)
133
+ http_headers = {}
134
+ http_request.canonical_each do |name, value|
135
+ http_headers[name] = value
136
+ end
137
+ {
138
+ "method" => http_request.method,
139
+ "path" => http_request.path,
140
+ "headers" => http_headers,
141
+ "body" => http_request.body,
142
+ }
143
+ when :droonga
144
+ do_completion(message, :completion => true)
145
+ else
146
+ nil
147
+ end
148
+ end
149
+
125
150
  private
126
151
  def create_connection(options)
127
- case options[:protocol] || :droonga
152
+ case @protocol
128
153
  when :http
129
154
  Connection::HTTP.new(options)
130
155
  when :droonga
@@ -302,7 +302,7 @@ module Droonga
302
302
  port = @sender.peeraddr[1]
303
303
  detail = message
304
304
  error = ConnectionError.new(host, port, detail)
305
- yield(error)
305
+ yield(error) if block_given?
306
306
  end
307
307
  end
308
308
 
@@ -87,8 +87,14 @@ module Droonga
87
87
  end
88
88
  else
89
89
  thread = Thread.new do
90
- send(message, options) do |response|
91
- yield(response.body)
90
+ catch do |tag|
91
+ send(message, options) do |response|
92
+ begin
93
+ yield(response.body)
94
+ rescue LocalJumpError
95
+ throw(tag)
96
+ end
97
+ end
92
98
  end
93
99
  end
94
100
  Request.new(thread)
@@ -142,7 +148,7 @@ module Droonga
142
148
  request = build_request(message)
143
149
  http.start do
144
150
  http.request(request) do |response|
145
- yield(response)
151
+ yield(response) if block_given?
146
152
  end
147
153
  end
148
154
  end
@@ -153,15 +159,18 @@ module Droonga
153
159
  def close
154
160
  end
155
161
 
156
- private
157
162
  def build_request(message)
158
163
  http_method = message["method"] || "GET"
159
164
  http_headers = message["headers"] || {}
160
- case http_method
165
+ case http_method.to_s.upcase
161
166
  when "POST"
162
167
  request = Net::HTTP::Post.new(build_path(message, {}),
163
168
  http_headers)
164
- request.body = JSON.generate(message["body"])
169
+ body = message["body"]
170
+ if body.is_a?(Hash) or body.is_a?(Array)
171
+ body = JSON.generate(body)
172
+ end
173
+ request.body = body
165
174
  request
166
175
  when "GET"
167
176
  parameters = message["body"] || {}
@@ -172,9 +181,10 @@ module Droonga
172
181
  end
173
182
  end
174
183
 
184
+ private
175
185
  def build_path(message, parameters)
176
186
  type = message["type"]
177
- base_path = message["path"] || "/#{type}"
187
+ base_path = message["path"] || build_droonga_path(type)
178
188
  if parameters.empty?
179
189
  base_path
180
190
  else
@@ -182,6 +192,11 @@ module Droonga
182
192
  end
183
193
  end
184
194
 
195
+ def build_droonga_path(type)
196
+ type = type.gsub(".", "/")
197
+ "/droonga/#{type}"
198
+ end
199
+
185
200
  def on_error(error)
186
201
  @on_error.call(error) if @on_error
187
202
  end
@@ -23,6 +23,7 @@ module Droonga
23
23
  def initialize(options={})
24
24
  @options = options
25
25
  @fixed_date = @options[:fixed_date]
26
+ @default_dataset = @options[:default_dataset]
26
27
  @default_timeout = @options[:default_timeout]
27
28
  @default_target_role = @options[:default_target_role]
28
29
  end
@@ -30,13 +31,16 @@ module Droonga
30
31
  def complete(message)
31
32
  id = message["id"] || generate_id
32
33
  date = message["date"] || @fixed_date || new_date
34
+ dataset = message["dataset"] || @default_dataset
33
35
  if not have_timeout?(message) and @default_timeout
34
36
  message["timeout"] = @default_timeout
35
37
  end
36
38
  if not message["targetRole"].nil? and @default_target_role
37
39
  message["targetRole"] = @default_target_role
38
40
  end
39
- message.merge("id" => id, "date" => date)
41
+ message.merge("id" => id,
42
+ "date" => date,
43
+ "dataset" => dataset)
40
44
  end
41
45
 
42
46
  private
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2013-2014 Droonga Project
3
+ # Copyright (C) 2013-2015 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,6 @@
17
17
 
18
18
  module Droonga
19
19
  class Client
20
- VERSION = "0.2.1"
20
+ VERSION = "0.2.2"
21
21
  end
22
22
  end
@@ -33,6 +33,10 @@ module Droonga
33
33
  options = Slop.parse(:help => true) do |option|
34
34
  yield(option) if block_given?
35
35
 
36
+ option.on(:"dry-run",
37
+ "Only reports messages to be sent to the engine.",
38
+ :default => false)
39
+
36
40
  option.separator("Connections:")
37
41
  option.on(:host=,
38
42
  "Host name of the engine node.",
@@ -48,13 +52,13 @@ module Droonga
48
52
  "Dataset name for the sending message.",
49
53
  :default => Client::DEFAULT_DATASET)
50
54
  option.on("receiver-host=",
51
- "Host name of this host.",
55
+ "Host name of the computer you are running this command.",
52
56
  :default => Client::DEFAULT_HOST)
53
57
  option.on("target-role=",
54
- "Role of engine nodes which should receive the message.",
58
+ "Role of engine nodes which should process the message.",
55
59
  :default => Client::DEFAULT_TARGET_ROLE)
56
60
  option.on("timeout=",
57
- "Time to terminate unresponsive connections (in seconds).",
61
+ "Time to terminate unresponsive connections, in seconds.",
58
62
  :default => Client::DEFAULT_TIMEOUT_SECONDS)
59
63
  end
60
64
  @options = options
@@ -63,12 +67,21 @@ module Droonga
63
67
  raise MissingRequiredParameter.new
64
68
  end
65
69
 
66
- def request(message)
70
+ def request(message, &block)
71
+ if @options[:"dry-run"]
72
+ if @options[:pretty]
73
+ puts(JSON.pretty_generate(message))
74
+ else
75
+ puts(JSON.generate(message))
76
+ end
77
+ return nil
78
+ end
79
+
67
80
  response = nil
68
81
  open do |client|
69
82
  response = client.request(message)
70
83
  end
71
- response
84
+ yield response
72
85
  end
73
86
 
74
87
  def send(message)
metadata CHANGED
@@ -1,139 +1,153 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: droonga-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Droonga Project
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-29 00:00:00.000000000 Z
11
+ date: 2015-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: droonga-message-pack-packer
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: fluent-logger
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: grn2drn
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.5
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.5
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: msgpack
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - '>='
59
+ - - ">="
46
60
  - !ruby/object:Gem::Version
47
61
  version: '0'
48
62
  type: :runtime
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - '>='
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rack
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - '>='
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
75
  version: '0'
62
76
  type: :runtime
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - '>='
80
+ - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: slop
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - <=
87
+ - - "<="
74
88
  - !ruby/object:Gem::Version
75
89
  version: 3.6.0
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - <=
94
+ - - "<="
81
95
  - !ruby/object:Gem::Version
82
96
  version: 3.6.0
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: yajl-ruby
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - '>='
101
+ - - ">="
88
102
  - !ruby/object:Gem::Version
89
103
  version: '0'
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - '>='
108
+ - - ">="
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: bundler
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - ~>
115
+ - - "~>"
102
116
  - !ruby/object:Gem::Version
103
117
  version: '1.3'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - ~>
122
+ - - "~>"
109
123
  - !ruby/object:Gem::Version
110
124
  version: '1.3'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: packnga
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - '>='
129
+ - - ">="
116
130
  - !ruby/object:Gem::Version
117
131
  version: '0'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - '>='
136
+ - - ">="
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: rake
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - '>='
143
+ - - ">="
130
144
  - !ruby/object:Gem::Version
131
145
  version: '0'
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
- - - '>='
150
+ - - ">="
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
139
153
  description: Droonga client for Ruby
@@ -148,8 +162,8 @@ executables:
148
162
  extensions: []
149
163
  extra_rdoc_files: []
150
164
  files:
151
- - .gitignore
152
- - .yardopts
165
+ - ".gitignore"
166
+ - ".yardopts"
153
167
  - Gemfile
154
168
  - LICENSE.txt
155
169
  - README.md
@@ -184,12 +198,12 @@ require_paths:
184
198
  - lib
185
199
  required_ruby_version: !ruby/object:Gem::Requirement
186
200
  requirements:
187
- - - '>='
201
+ - - ">="
188
202
  - !ruby/object:Gem::Version
189
203
  version: 1.9.3
190
204
  required_rubygems_version: !ruby/object:Gem::Requirement
191
205
  requirements:
192
- - - '>='
206
+ - - ">="
193
207
  - !ruby/object:Gem::Version
194
208
  version: '0'
195
209
  requirements: []