groonga-client 0.1.9 → 0.2.0

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: 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: