groonga-client 0.1.9 → 0.2.0

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: c016fdb951f5e4022be440d654f89761dcab44ce
4
- data.tar.gz: 41f64ca63d69c8540229ff4a40f1a5298b676ba5
3
+ metadata.gz: 7e8cad3043939d233594ca90f8b84ea33725d5b5
4
+ data.tar.gz: d8ae56764fe0a86509ef2b6cbe5762242cdb0dcf
5
5
  SHA512:
6
- metadata.gz: d1bfa34ff628a40c8645689ab9a2536b0979d8faef135898f154d1ec454f870fd17f6e5688d6395b26645a8005b9a9c177f4dd2e554ac554608fd0a68a23c558
7
- data.tar.gz: 996cccebedcefbce77dbf9546b470424afaa8215558961be0cc898cc732d723e60874dad6bcf95b15759b9f87afa6b42f90c94e943649aa43da238f719e42dac
6
+ metadata.gz: 3d1f57297335e1d324fea8e867b6703ad44222effb6c6b23aa49163747bc98fbc70013227180b4a0c00e1b632d3f8df70d639157fbfaba169876128fa6796dc8
7
+ data.tar.gz: 66bd55f2b48c53208fb0596101b80277e04ab1151321c74e5ff27169998a6b09197039c9793a96f9d3bf68f54534058fddb9c802b5ca820700566d01f2bebbe3
data/README.md CHANGED
@@ -50,10 +50,6 @@ TODO: use commands with parameters for examples
50
50
  * English: [groonga-talk@lists.sourceforge.net](https://lists.sourceforge.net/lists/listinfo/groonga-talk)
51
51
  * Japanese: [groonga-dev@lists.sourceforge.jp](http://lists.sourceforge.jp/mailman/listinfo/groonga-dev)
52
52
 
53
- ## Thanks
54
-
55
- * ...
56
-
57
53
  ## Authors
58
54
 
59
55
  * Haruka Yoshihara \<yoshihara@clear-code.com\>
data/doc/text/news.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # NEWS
2
2
 
3
+ ## 0.2.0 - 2016-03-21
4
+
5
+ ### Improvements
6
+
7
+ * HTTP: Supported basic authentication.
8
+ [GitHub#4][Patch by KITAITI Makoto]
9
+
10
+ * response: Supported `table_remove`.
11
+ [GitHub#7][Patch by Masafumi Yokoyama]
12
+
13
+ * HTTP: Supported HTTPS by passing `:use_tls => true` option to
14
+ {Groonga::Client.new}.
15
+ [GitHub#8][Patch by KITAITI Makoto]
16
+
17
+ * Supported URI as server information in {Groonga::Client.new}.
18
+
19
+ * Required groonga-command 1.2.0 or later.
20
+
21
+ * Accepted `Symbol` as registered command name.
22
+
23
+ * Supported dynamic command execution. Now, you can use commands
24
+ that aren't supported in groonga-client yet.
25
+
26
+ * Added {Groonga::Client.default_options}.
27
+
28
+ * Added {Groonga::Client.default_options=}.
29
+
30
+ ### Thanks
31
+
32
+ * KITAITI Makoto
33
+
34
+ * Masafumi Yokoyama
35
+
3
36
  ## 0.1.9 - 2015-09-04
4
37
 
5
38
  ### Improvements
@@ -1,7 +1,7 @@
1
- # -*- mode: ruby; coding: utf-8 -*-
1
+ # -*- mode: ruby -*-
2
2
  #
3
3
  # Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
4
- # Copyright (C) 2014-2015 Kouhei Sutou <kou@clear-code.com>
4
+ # Copyright (C) 2014-2016 Kouhei Sutou <kou@clear-code.com>
5
5
  #
6
6
  # This library is free software; you can redistribute it and/or
7
7
  # modify it under the terms of the GNU Lesser General Public
@@ -37,7 +37,7 @@ Gem::Specification.new do |spec|
37
37
  clean_white_space.call(entries[entries.index("Description") + 1])
38
38
  description = clean_white_space.call(entries[entries.index("Description") + 1])
39
39
  spec.summary, spec.description, = description.split(/\n\n+/, 3)
40
- spec.license = "LGPLv2.1 or later"
40
+ spec.license = "LGPLv2.1+"
41
41
  spec.files = ["README.md", "Rakefile", "Gemfile", "#{spec.name}.gemspec"]
42
42
  spec.files += [".yardopts"]
43
43
  spec.files += Dir.glob("lib/**/*.rb")
@@ -45,7 +45,7 @@ Gem::Specification.new do |spec|
45
45
  spec.test_files += Dir.glob("test/**/*")
46
46
 
47
47
  spec.add_runtime_dependency("gqtp", ">= 1.0.4")
48
- spec.add_runtime_dependency("groonga-command", ">= 1.0.8")
48
+ spec.add_runtime_dependency("groonga-command", ">= 1.2.0")
49
49
 
50
50
  spec.add_development_dependency("bundler")
51
51
  spec.add_development_dependency("rake")
@@ -1,7 +1,5 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
1
  # Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
4
- # Copyright (C) 2013-2015 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2013-2016 Kouhei Sutou <kou@clear-code.com>
5
3
  #
6
4
  # This library is free software; you can redistribute it and/or
7
5
  # modify it under the terms of the GNU Lesser General Public
@@ -17,6 +15,7 @@
17
15
  # License along with this library; if not, write to the Free Software
18
16
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
17
 
18
+ require "uri"
20
19
  require "json"
21
20
 
22
21
  require "groonga/client/default"
@@ -29,10 +28,33 @@ require "groonga/client/script-syntax"
29
28
  module Groonga
30
29
  class Client
31
30
  class << self
31
+ @@deafult_options = {}
32
+
33
+ # @return [Hash] The default options for {Groonga::Client.new}.
34
+ #
35
+ # @since 0.2.0
36
+ def default_options
37
+ @@deafult_options
38
+ end
39
+
40
+ # @param [Hash] options The new default options for
41
+ # {Groonga::Client.new}.
42
+ #
43
+ # @since 0.2.0
44
+ def default_options=(options)
45
+ @@deafult_options = options
46
+ end
47
+
32
48
  # @!macro [new] initialize_options
33
49
  # @param [Hash] options The options.
34
- # @option options [:gqtp or :http] :protocol The protocol that is
35
- # used by the client.
50
+ # @option options [String, URI::Generic, URI::HTTP, URI::HTTPS]
51
+ # :url The URL of Groonga server.
52
+ # @option options [:gqtp, :http, :https] :protocol The
53
+ # protocol that is used by the client.
54
+ # @option options [String] :user User ID. Currently used for HTTP
55
+ # Basic Authentication.
56
+ # @option options [String] :password Password. Currently used for
57
+ # HTTP Basic Authentication.
36
58
  #
37
59
  # @overload open(options={})
38
60
  # Opens a new client connection.
@@ -66,15 +88,22 @@ module Groonga
66
88
 
67
89
  # @macro initialize_options
68
90
  def initialize(options={})
69
- options = options.dup
70
- protocol = options.delete(:protocol) || :gqtp
91
+ options = self.class.default_options.merge(options)
92
+ url = options[:url] || build_url(options)
93
+ url = URL.parse(url) unless url.is_a?(URI::Generic)
94
+ options[:url] = url
71
95
  options[:read_timeout] ||= Default::READ_TIMEOUT
72
96
 
73
97
  @connection = nil
74
- if protocol == :gqtp
75
- @connection = Groonga::Client::Protocol::GQTP.new(options)
98
+ case url.scheme
99
+ when "gqtp"
100
+ @connection = Groonga::Client::Protocol::GQTP.new(url, options)
101
+ when "http", "https"
102
+ @connection = Groonga::Client::Protocol::HTTP.new(url, options)
76
103
  else
77
- @connection = Groonga::Client::Protocol::HTTP.new(options)
104
+ message = "unsupported scheme: <#{url.scheme}>: "
105
+ message << "supported: [gqtp, http, https]"
106
+ raise ArgumentError, message
78
107
  end
79
108
  end
80
109
 
@@ -117,46 +146,6 @@ module Groonga
117
146
  end
118
147
  end
119
148
 
120
- def cache_limit(parameters, &block)
121
- execute_command("cache_limit", parameters, &block)
122
- end
123
-
124
- def check(parameters, &block)
125
- execute_command("check", parameters, &block)
126
- end
127
-
128
- def clearlock(parameters={}, &block)
129
- execute_command("clearlock", parameters, &block)
130
- end
131
-
132
- def column_create(parameters, &block)
133
- execute_command("column_create", parameters, &block)
134
- end
135
-
136
- def column_list(parameters, &block)
137
- execute_command("column_list", parameters, &block)
138
- end
139
-
140
- def column_remove(parameters, &block)
141
- execute_command("column_remove", parameters, &block)
142
- end
143
-
144
- def column_rename(parameters, &block)
145
- execute_command("column_rename", parameters, &block)
146
- end
147
-
148
- def defrag(parameters={}, &block)
149
- execute_command("defrag", parameters, &block)
150
- end
151
-
152
- def delete(parameters, &block)
153
- execute_command("delete", parameters, &block)
154
- end
155
-
156
- def dump(parameters={}, &block)
157
- execute_command("dump", parameters, &block)
158
- end
159
-
160
149
  def load(parameters, &block)
161
150
  values = parameters[:values]
162
151
  if values.is_a?(Array)
@@ -172,67 +161,84 @@ module Groonga
172
161
  json << "\n]"
173
162
  parameters[:values] = json
174
163
  end
175
- execute_command("load", parameters, &block)
176
- end
177
-
178
- def log_level(parameters, &block)
179
- execute_command("log_level", parameters, &block)
180
- end
181
-
182
- def log_put(parameters, &block)
183
- execute_command("log_put", parameters, &block)
164
+ execute(:load, parameters, &block)
184
165
  end
185
166
 
186
- def log_reopen(parameters={}, &block)
187
- execute_command("log_reopen", parameters, &block)
188
- end
189
-
190
- def quit(parameters={}, &block)
191
- execute_command("quit", parameters, &block)
192
- end
193
-
194
- def register(parameters, &block)
195
- execute_command("register", parameters, &block)
196
- end
197
-
198
- def select(parameters, &block)
199
- execute_command("select", parameters, &block)
200
- end
201
-
202
- def shutdown(parameters={}, &block)
203
- end
204
-
205
- def status(parameters={}, &block)
206
- execute_command("status", parameters, &block)
207
- end
208
-
209
- def table_create(parameters, &block)
210
- execute_command("table_create", parameters, &block)
167
+ def execute(command_or_name, parameters={}, &block)
168
+ if command_or_name.is_a?(Command)
169
+ command = command_or_name
170
+ else
171
+ command_name = command_or_name
172
+ parameters = normalize_parameters(parameters)
173
+ command_class = Groonga::Command.find(command_name)
174
+ command = command_class.new(command_name, parameters)
175
+ end
176
+ execute_command(command, &block)
211
177
  end
212
178
 
213
- def table_list(parameters={}, &block)
214
- execute_command("table_list", parameters, &block)
179
+ def method_missing(name, *args, **kwargs, &block)
180
+ if groonga_command_name?(name)
181
+ execute(name, *args, **kwargs, &block)
182
+ else
183
+ super
184
+ end
215
185
  end
216
186
 
217
- def table_remove(parameters, &block)
187
+ def respond_to_missing?(name, include_private)
188
+ if groonga_command_name?(name)
189
+ true
190
+ else
191
+ super
192
+ end
218
193
  end
219
194
 
220
- def table_rename(parameters, &block)
221
- end
195
+ private
196
+ def build_url(options)
197
+ scheme = (options.delete(:protocol) || "gqtp").to_s
198
+ host = options.delete(:host) || options.delete(:address) || "127.0.0.1"
199
+ port = options.delete(:port) || default_port(scheme)
200
+ user = options.delete(:user)
201
+ password = options.delete(:password)
202
+ if user and password
203
+ userinfo = "#{user}:#{password}"
204
+ else
205
+ userinfo = nil
206
+ end
222
207
 
223
- def truncate(parameters, &block)
208
+ arguments = [
209
+ scheme,
210
+ userinfo,
211
+ host,
212
+ port,
213
+ nil,
214
+ nil,
215
+ nil,
216
+ nil,
217
+ nil,
218
+ ]
219
+ case scheme
220
+ when "http"
221
+ URI::HTTP.new(*arguments)
222
+ when "https"
223
+ URI::HTTPS.new(*arguments)
224
+ else
225
+ URI::Generic.new(*arguments)
226
+ end
224
227
  end
225
228
 
226
- def execute(command, &block)
227
- Client::Command.new(command).execute(@connection, &block)
229
+ def default_port(scheme)
230
+ case scheme
231
+ when "gqtp"
232
+ 10043
233
+ when "http", "https"
234
+ 10041
235
+ else
236
+ nil
237
+ end
228
238
  end
229
239
 
230
- private
231
- def execute_command(command_name, parameters={}, &block)
232
- parameters = normalize_parameters(parameters)
233
- command_class = Groonga::Command.find(command_name)
234
- command = command_class.new(command_name, parameters)
235
- execute(command, &block)
240
+ def groonga_command_name?(name)
241
+ /\A[a-zA-Z][a-zA-Z\d_]+\z/ === name.to_s
236
242
  end
237
243
 
238
244
  def normalize_parameters(parameters)
@@ -242,5 +248,9 @@ module Groonga
242
248
  end
243
249
  normalized_parameters
244
250
  end
251
+
252
+ def execute_command(command, &block)
253
+ Client::Command.new(command).execute(@connection, &block)
254
+ end
245
255
  end
246
256
  end
@@ -1,7 +1,5 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
1
  # Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
4
- # Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2013-2016 Kouhei Sutou <kou@clear-code.com>
5
3
  #
6
4
  # This library is free software; you can redistribute it and/or
7
5
  # modify it under the terms of the GNU Lesser General Public
@@ -29,9 +27,10 @@ module Groonga
29
27
  class Client
30
28
  module Protocol
31
29
  class GQTP
32
- def initialize(options)
30
+ def initialize(url, options={})
33
31
  begin
34
- @client = ::GQTP::Client.new(options)
32
+ @client = ::GQTP::Client.new(:host => url.host,
33
+ :port => url.port)
35
34
  rescue ::GQTP::ConnectionError
36
35
  raise WrappedError.new($!)
37
36
  end
@@ -32,9 +32,8 @@ module Groonga
32
32
  end
33
33
  end
34
34
 
35
- def initialize(options)
36
- @host = options[:host] || "127.0.0.1"
37
- @port = options[:port] || 10041
35
+ def initialize(url, options)
36
+ @url = url
38
37
  @options = default_options.merge(options)
39
38
  @backend = create_backend
40
39
  end
@@ -69,7 +68,7 @@ module Groonga
69
68
 
70
69
  backend_name = backend.to_s.capitalize
71
70
  backend_class = self.class.const_get(backend_name)
72
- backend_class.new(@host, @port, @options)
71
+ backend_class.new(@url, @options)
73
72
  end
74
73
  end
75
74
  end
@@ -73,7 +73,7 @@ module Groonga
73
73
  def send(command, &block)
74
74
  client = GroongaHTTPClient.connect(@host, @port, block)
75
75
  client.attach(@loop)
76
- if command.name == "load"
76
+ if command.is_a?(Groonga::Command::Load)
77
77
  raw_values = command[:values]
78
78
  command[:values] = nil
79
79
  path = command.to_uri_format
@@ -1,5 +1,5 @@
1
1
  # Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
2
- # Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2013-2016 Kouhei Sutou <kou@clear-code.com>
3
3
  #
4
4
  # This library is free software; you can redistribute it and/or
5
5
  # modify it under the terms of the GNU Lesser General Public
@@ -26,15 +26,14 @@ module Groonga
26
26
  module Protocol
27
27
  class HTTP
28
28
  class Synchronous
29
- def initialize(host, port, options)
30
- @host = host
31
- @port = port
29
+ def initialize(url, options={})
30
+ @url = url
32
31
  @options = options
33
32
  end
34
33
 
35
34
  def send(command)
36
35
  begin
37
- Net::HTTP.start(@host, @port) do |http|
36
+ Net::HTTP.start(@url.host, @url.port, start_options) do |http|
38
37
  http.read_timeout = read_timeout
39
38
  response = send_request(http, command)
40
39
  case response
@@ -90,6 +89,23 @@ module Groonga
90
89
  end
91
90
 
92
91
  private
92
+ def start_options
93
+ tls_options = @options[:tls] || {}
94
+ case tls_options[:verify_mode]
95
+ when :none
96
+ tls_options[:verify_mode] = OpenSSL::SSL::VERIFY_NONE
97
+ when :peer
98
+ tls_options[:verify_mode] = OpenSSL::SSL::VERIFY_PEER
99
+ end
100
+
101
+ {
102
+ :use_ssl => @url.scheme == "https",
103
+ :ca_file => tls_options[:ca_file],
104
+ :ca_path => tls_options[:ca_path],
105
+ :verify_mode => tls_options[:verify_mode],
106
+ }
107
+ end
108
+
93
109
  def read_timeout
94
110
  timeout = @options[:read_timeout]
95
111
  if timeout < 0
@@ -100,7 +116,7 @@ module Groonga
100
116
  end
101
117
 
102
118
  def send_request(http, command)
103
- if command.name == "load"
119
+ if command.is_a?(Groonga::Command::Load)
104
120
  raw_values = command[:values]
105
121
  command[:values] = nil
106
122
  path = command.to_uri_format
@@ -109,10 +125,11 @@ module Groonga
109
125
  request.content_type = "application/json"
110
126
  request.content_length = raw_values.bytesize
111
127
  request.body_stream = StringIO.new(raw_values)
112
- http.request(request)
113
128
  else
114
- http.get(command.to_uri_format, headers)
129
+ request = Net::HTTP::Get.new(command.to_uri_format, headers)
115
130
  end
131
+ setup_authentication(request)
132
+ http.request(request)
116
133
  end
117
134
 
118
135
  def headers
@@ -120,6 +137,16 @@ module Groonga
120
137
  "user-agent" => @options[:user_agent],
121
138
  }
122
139
  end
140
+
141
+ def setup_authentication(request)
142
+ userinfo = @url.userinfo
143
+ return if userinfo.nil?
144
+
145
+ user, password = userinfo.split(/:/, 2).collect do |component|
146
+ URI.decode_www_form_component(component)
147
+ end
148
+ request.basic_auth(user, password)
149
+ end
123
150
  end
124
151
  end
125
152
  end
@@ -36,4 +36,6 @@ require "groonga/client/response/quit"
36
36
  require "groonga/client/response/register"
37
37
  require "groonga/client/response/select"
38
38
  require "groonga/client/response/status"
39
+ require "groonga/client/response/table_create"
39
40
  require "groonga/client/response/table_list"
41
+ require "groonga/client/response/table_remove"
@@ -27,11 +27,11 @@ module Groonga
27
27
  class << self
28
28
  @@registered_commands = {}
29
29
  def register(name, klass)
30
- @@registered_commands[name] = klass
30
+ @@registered_commands[normalize_name(name)] = klass
31
31
  end
32
32
 
33
33
  def find(name)
34
- @@registered_commands[name] || Base
34
+ @@registered_commands[normalize_name(name)] || Base
35
35
  end
36
36
 
37
37
  # Parses the response for the request of the command and returns
@@ -42,9 +42,19 @@ module Groonga
42
42
  # server.
43
43
  # @return [Base]
44
44
  def parse(command, raw_response)
45
- klass = find(command.name)
45
+ klass = find(command.command_name)
46
46
  klass.parse(command, raw_response)
47
47
  end
48
+
49
+ private
50
+ def normalize_name(name)
51
+ case name
52
+ when String
53
+ name.to_sym
54
+ else
55
+ name
56
+ end
57
+ end
48
58
  end
49
59
 
50
60
  class Base
@@ -0,0 +1,28 @@
1
+ # Copyright (C) 2016 Masafumi Yokoyama <yokoyama@clear-code.com>
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 as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ require "groonga/client/response/base"
18
+
19
+ module Groonga
20
+ class Client
21
+ module Response
22
+ class TableRemove < Base
23
+ Response.register("table_remove", self)
24
+ end
25
+ end
26
+ end
27
+ end
28
+
@@ -18,6 +18,6 @@
18
18
 
19
19
  module Groonga
20
20
  class Client
21
- VERSION = "0.1.9"
21
+ VERSION = "0.2.0"
22
22
  end
23
23
  end
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2013-2016 Kouhei Sutou <kou@clear-code.com>
4
2
  #
5
3
  # This library is free software; you can redistribute it and/or
6
4
  # modify it under the terms of the GNU Lesser General Public
@@ -60,11 +58,10 @@ class TestProtocolGQTP < Test::Unit::TestCase
60
58
 
61
59
  private
62
60
  def connect(options={})
63
- default_options = {
64
- :host => @address,
65
- :port => @port,
66
- }
67
- Groonga::Client::Protocol::GQTP.new(default_options.merge(options))
61
+ url = URI::Generic.build(:scheme => "gqtp",
62
+ :host => @address,
63
+ :port => @port)
64
+ Groonga::Client::Protocol::GQTP.new(url, options)
68
65
  end
69
66
 
70
67
  def process_client_close(client)
@@ -84,9 +81,11 @@ class TestProtocolGQTP < Test::Unit::TestCase
84
81
  server = TCPServer.new("127.0.0.1", 0)
85
82
  free_port = server.addr[1]
86
83
  server.close
84
+ url = URI::Generic.build(:scheme => "gqtp",
85
+ :host => "127.0.0.1",
86
+ :port => free_port)
87
87
  assert_raise(Groonga::Client::Protocol::WrappedError) do
88
- Groonga::Client::Protocol::GQTP.new(:host => "127.0.0.1",
89
- :port => free_port)
88
+ Groonga::Client::Protocol::GQTP.new(url, {})
90
89
  end
91
90
  end
92
91
  end
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2013-2016 Kouhei Sutou <kou@clear-code.com>
4
2
  #
5
3
  # This library is free software; you can redistribute it and/or
6
4
  # modify it under the terms of the GNU Lesser General Public
@@ -74,11 +72,9 @@ EOH
74
72
  end
75
73
 
76
74
  def connect(options={})
77
- default_options = {
78
- :host => @address,
79
- :port => @port,
80
- }
81
- Groonga::Client::Protocol::HTTP.new(default_options.merge(options))
75
+ url = URI::HTTP.build(:host => @address,
76
+ :port => @port)
77
+ Groonga::Client::Protocol::HTTP.new(url, options)
82
78
  end
83
79
 
84
80
  def test_connected?
@@ -0,0 +1,32 @@
1
+ # Copyright (C) 2016 Masafumi Yokoyama <yokoyama@clear-code.com>
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 as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ require "response/helper"
18
+
19
+ class TestResponseTableCreate < Test::Unit::TestCase
20
+ class TestParseRawResponse < self
21
+ include TestResponseHelper
22
+
23
+ def test_table_create
24
+ header = [0,1372430096.70991,0.000522851943969727]
25
+ body = true
26
+ raw_response = [header, body].to_json
27
+
28
+ response = parse_raw_response("table_create", raw_response)
29
+ assert_equal(Groonga::Client::Response::TableCreate, response.class)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ # Copyright (C) 2016 Masafumi Yokoyama <yokoyama@clear-code.com>
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 as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ require "response/helper"
18
+
19
+ class TestResponseTableRemove < Test::Unit::TestCase
20
+ class TestParseRawResponse < self
21
+ include TestResponseHelper
22
+
23
+ def test_table_remove
24
+ header = [0,1372430096.70991,0.000522851943969727]
25
+ body = true
26
+ raw_response = [header, body].to_json
27
+
28
+ response = parse_raw_response("table_remove", raw_response)
29
+ assert_equal(Groonga::Client::Response::TableRemove, response.class)
30
+ end
31
+ end
32
+ end
data/test/test-client.rb CHANGED
@@ -1,7 +1,5 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
1
  # Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
4
- # Copyright (C) 2013-2015 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2013-2016 Kouhei Sutou <kou@clear-code.com>
5
3
  #
6
4
  # This library is free software; you can redistribute it and/or
7
5
  # modify it under the terms of the GNU Lesser General Public
@@ -49,9 +47,20 @@ class TestClient < Test::Unit::TestCase
49
47
  @client ||= open_client
50
48
  end
51
49
 
50
+ def open_options
51
+ url = "#{@protocol}://"
52
+ if @user and @password
53
+ url << URI.encode_www_form_component(@user)
54
+ url << ":"
55
+ url << URI.encode_www_form_component(@password)
56
+ url << "@"
57
+ end
58
+ url << "#{@address}:#{@port}"
59
+ {:url => URI.parse(url)}
60
+ end
61
+
52
62
  def open_client(&block)
53
- options = {:host => @address, :port => @port, :protocol => @protocol}
54
- Groonga::Client.open(options, &block)
63
+ Groonga::Client.open(open_options, &block)
55
64
  end
56
65
 
57
66
  def stub_response(body, output_type=:json)
@@ -223,6 +232,19 @@ JSON
223
232
  end
224
233
  assert_equal("response", response)
225
234
  end
235
+
236
+ def test_open_components
237
+ stub_response("[29]")
238
+ options = {
239
+ :host => @address,
240
+ :port => @port,
241
+ :protocol => @protocol,
242
+ }
243
+ response = Groonga::Client.open(options) do |client|
244
+ client.status
245
+ end
246
+ assert_equal([29], response.body)
247
+ end
226
248
  end
227
249
 
228
250
  module LoadTests
@@ -255,6 +277,29 @@ JSON
255
277
  end
256
278
  end
257
279
 
280
+ module DefaultOptionsTests
281
+ def test_default_options
282
+ change_default_options(open_options) do
283
+ expected_response = {"key" => "value"}
284
+ stub_response(expected_response.to_json)
285
+ response = Groonga::Client.open do |client|
286
+ client.status
287
+ end
288
+ assert_equal(expected_response, response.body)
289
+ end
290
+ end
291
+
292
+ def change_default_options(options)
293
+ default_options = Groonga::Client.default_options
294
+ begin
295
+ Groonga::Client.default_options = options
296
+ yield
297
+ ensure
298
+ Groonga::Client.default_options = default_options
299
+ end
300
+ end
301
+ end
302
+
258
303
  module Tests
259
304
  include Utils
260
305
  include Assertions
@@ -264,6 +309,7 @@ JSON
264
309
  include ParametersTests
265
310
  include OpenTests
266
311
  include LoadTests
312
+ include DefaultOptionsTests
267
313
  end
268
314
 
269
315
  class TestGQTP < self
@@ -276,6 +322,8 @@ JSON
276
322
  @port = @server.addr[1]
277
323
  @protocol = :gqtp
278
324
 
325
+ @user = nil
326
+ @password = nil
279
327
  @actual_commands = []
280
328
  @response_body = nil
281
329
  @thread = Thread.new do
@@ -316,6 +364,9 @@ JSON
316
364
  @port = @server.addr[1]
317
365
  @protocol = :http
318
366
 
367
+ setup_authentication
368
+ @request_headers = {}
369
+ @request_path = nil
319
370
  @actual_commands = []
320
371
  @response_body = nil
321
372
  @thread = Thread.new do
@@ -323,7 +374,7 @@ JSON
323
374
  first_line = client.gets
324
375
  if /\A([\w]+) ([^ ]+) HTTP/ =~ first_line
325
376
  # http_method = $1
326
- path = $2
377
+ @request_path = $2
327
378
  headers = {}
328
379
  client.each_line do |line|
329
380
  case line
@@ -334,13 +385,14 @@ JSON
334
385
  headers[name.downcase] = value
335
386
  end
336
387
  end
388
+ @request_headers = headers
337
389
  content_length = headers["content-length"]
338
390
  if content_length
339
391
  body = client.read(Integer(content_length))
340
392
  else
341
393
  body = nil
342
394
  end
343
- command = Groonga::Command::Parser.parse(path)
395
+ command = Groonga::Command::Parser.parse(@request_path)
344
396
  command[:values] = body if body
345
397
  @actual_commands << command
346
398
  end
@@ -374,5 +426,48 @@ EOH
374
426
  client.close
375
427
  end
376
428
  end
429
+
430
+ def setup_authentication
431
+ @user = nil
432
+ @password = nil
433
+ end
434
+
435
+ class TestLoad < self
436
+ def test_path
437
+ stub_response("[]")
438
+ client.load(:table => "Memos", :values => [])
439
+ assert_equal("/d/load?table=Memos", @request_path)
440
+ end
441
+ end
442
+
443
+ class TestBasicAuthentication < self
444
+ def setup_authentication
445
+ @user = "Aladdin"
446
+ @password = "open sesame"
447
+ end
448
+
449
+ def test_request_header
450
+ stub_response("[]")
451
+ client.status
452
+ assert_equal("Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
453
+ @request_headers["authorization"])
454
+ end
455
+
456
+ def test_open_components
457
+ stub_response("[]")
458
+ options = {
459
+ :host => @address,
460
+ :port => @port,
461
+ :protocol => @protocol,
462
+ :user => @user,
463
+ :password => @password,
464
+ }
465
+ Groonga::Client.open(options) do |client|
466
+ client.status
467
+ end
468
+ assert_equal("Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
469
+ @request_headers["authorization"])
470
+ end
471
+ end
377
472
  end
378
473
  end
data/test/test-command.rb CHANGED
@@ -5,7 +5,7 @@ class TestCommand < Test::Unit::TestCase
5
5
 
6
6
  def test_column_create
7
7
  response = Object.new
8
- mock(@client).execute_command("column_create", :table => :Test, :name => :Body, :type => :ShortText) do
8
+ mock(@client).execute(:column_create, :table => :Test, :name => :Body, :type => :ShortText) do
9
9
  response
10
10
  end
11
11
  @client.column_create(:table => :Test, :name => :Body, :type => :ShortText)
@@ -13,7 +13,7 @@ class TestCommand < Test::Unit::TestCase
13
13
 
14
14
  def test_column_list
15
15
  response = Object.new
16
- mock(@client).execute_command("column_list", :table => :Test) do
16
+ mock(@client).execute(:column_list, :table => :Test) do
17
17
  response
18
18
  end
19
19
  @client.column_list(:table => :Test)
@@ -27,7 +27,7 @@ class TestCommand < Test::Unit::TestCase
27
27
  }
28
28
  ]
29
29
  response = Object.new
30
- mock(@client).execute_command("load", :table => :Test, :values => values.to_json) do
30
+ mock(@client).execute(:load, :table => :Test, :values => values.to_json) do
31
31
  response
32
32
  end
33
33
  @client.load(:table => :Test, :values => values.to_json)
@@ -35,7 +35,7 @@ class TestCommand < Test::Unit::TestCase
35
35
 
36
36
  def test_select
37
37
  response = Object.new
38
- mock(@client).execute_command("select", :table => :Test) do
38
+ mock(@client).execute(:select, :table => :Test) do
39
39
  response
40
40
  end
41
41
  @client.select(:table => :Test)
@@ -43,7 +43,7 @@ class TestCommand < Test::Unit::TestCase
43
43
 
44
44
  def test_table_create
45
45
  response = Object.new
46
- mock(@client).execute_command("table_create", :name => :Test) do
46
+ mock(@client).execute(:table_create, :name => :Test) do
47
47
  response
48
48
  end
49
49
  @client.table_create(:name => :Test)
@@ -51,9 +51,14 @@ class TestCommand < Test::Unit::TestCase
51
51
 
52
52
  def test_table_list
53
53
  response = Object.new
54
- mock(@client).execute_command("table_list", {}) do
54
+ mock(@client).execute(:table_list, {}) do
55
55
  response
56
56
  end
57
57
  @client.table_list
58
58
  end
59
+
60
+ def test_table_remove
61
+ mock(@client).execute(:table_remove, :name => "Test")
62
+ @client.table_remove(:name => "Test")
63
+ end
59
64
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: groonga-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Haruka Yoshihara
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-09-04 00:00:00.000000000 Z
13
+ date: 2016-03-21 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: gqtp
@@ -32,14 +32,14 @@ dependencies:
32
32
  requirements:
33
33
  - - ">="
34
34
  - !ruby/object:Gem::Version
35
- version: 1.0.8
35
+ version: 1.2.0
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 1.0.8
42
+ version: 1.2.0
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: bundler
45
45
  requirement: !ruby/object:Gem::Requirement
@@ -206,6 +206,7 @@ files:
206
206
  - lib/groonga/client/response/status.rb
207
207
  - lib/groonga/client/response/table_create.rb
208
208
  - lib/groonga/client/response/table_list.rb
209
+ - lib/groonga/client/response/table_remove.rb
209
210
  - lib/groonga/client/script-syntax.rb
210
211
  - lib/groonga/client/version.rb
211
212
  - test/protocol/test-gqtp.rb
@@ -216,7 +217,9 @@ files:
216
217
  - test/response/test-error.rb
217
218
  - test/response/test-select.rb
218
219
  - test/response/test-status.rb
220
+ - test/response/test-table-create.rb
219
221
  - test/response/test-table-list.rb
222
+ - test/response/test-table-remove.rb
220
223
  - test/results/test-column-list.rb
221
224
  - test/results/test-table-list.rb
222
225
  - test/run-test.rb
@@ -225,7 +228,7 @@ files:
225
228
  - test/test-script-syntax.rb
226
229
  homepage: https://github.com/ranguba/groonga-client
227
230
  licenses:
228
- - LGPLv2.1 or later
231
+ - LGPLv2.1+
229
232
  metadata: {}
230
233
  post_install_message:
231
234
  rdoc_options: []
@@ -243,25 +246,27 @@ required_rubygems_version: !ruby/object:Gem::Requirement
243
246
  version: '0'
244
247
  requirements: []
245
248
  rubyforge_project:
246
- rubygems_version: 2.2.2
249
+ rubygems_version: 2.5.1
247
250
  signing_key:
248
251
  specification_version: 4
249
252
  summary: Groonga-client is a client for groonga (http://groonga.org/) implemented
250
253
  with pure ruby.
251
254
  test_files:
255
+ - test/test-client.rb
252
256
  - test/test-script-syntax.rb
253
- - test/protocol/test-http.rb
257
+ - test/test-command.rb
254
258
  - test/protocol/test-gqtp.rb
255
- - test/response/test-error.rb
256
- - test/response/test-select.rb
257
- - test/response/test-table-list.rb
259
+ - test/protocol/test-http.rb
260
+ - test/run-test.rb
261
+ - test/response/test-base.rb
258
262
  - test/response/test-column-list.rb
259
263
  - test/response/helper.rb
260
- - test/response/test-base.rb
264
+ - test/response/test-error.rb
265
+ - test/response/test-table-list.rb
261
266
  - test/response/test-status.rb
262
- - test/results/test-table-list.rb
267
+ - test/response/test-select.rb
268
+ - test/response/test-table-create.rb
269
+ - test/response/test-table-remove.rb
263
270
  - test/results/test-column-list.rb
264
- - test/test-command.rb
265
- - test/run-test.rb
266
- - test/test-client.rb
271
+ - test/results/test-table-list.rb
267
272
  has_rdoc: