rsolr 1.1.2 → 2.3.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
- SHA1:
3
- metadata.gz: e401f0dcdd04d8215eec9b67a1e7c775c41ac7f4
4
- data.tar.gz: 6e466531f33da1560869ce39586101dfc4bbb08e
2
+ SHA256:
3
+ metadata.gz: 1ca1fd66200c07e8e4ffc42bc8d71e6735a7294b7c53485ed8b49f8cfc99ac68
4
+ data.tar.gz: 3a0b50c5807543beed8ddc533cb8d446909176d61d1022ef0d8bb26ee1250648
5
5
  SHA512:
6
- metadata.gz: 29a5ac0f898a33e2d8efc2a0b0b7ed618c169e63597dcc283573ae9302183f0ee983ec18e30d3c9dc100bb13e06ff86358d02ad0df91515101efc8a26f82b7f8
7
- data.tar.gz: 1a509a26c086ffbad2543154106584989d7c40d42b747a422a622ba77fe1dd87202373ae1cd8d10727a0b61b89ad16a5cfcdc5655375ebc7d4b5733d9fa7dcb0
6
+ metadata.gz: 1a4bf74cc57d3523c4774f86c895b2e4a6bed229cc67499278fad4cf320575c68df1774d1fb0615108ca5ced0267798cea42a3e4c96723d6f2fb0f4294f38bcb
7
+ data.tar.gz: a51ec9142aba1761511058ed8614f600325e32551e6ae23b1638e2654b67e8a5ef3b8db1f6653171b67c492264079f368f95a0856ce1d7db5d1e5a06998b32d8
data/.gitignore CHANGED
@@ -10,3 +10,4 @@ Gemfile.lock
10
10
 
11
11
  *.gem
12
12
  .bundle
13
+ /spec/examples.txt
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.travis.yml CHANGED
@@ -1,21 +1,14 @@
1
- addons:
2
- apt:
3
- packages:
4
- - libgmp-dev
5
1
  language: ruby
6
2
  sudo: false
7
3
  rvm:
8
- - 2.3.1
9
- - 2.2.5
10
- - jruby-9.0.5.0
11
-
12
- notifications:
13
- irc: "irc.freenode.org#blacklight"
14
- email:
15
- - blacklight-commits@googlegroups.com
4
+ - 2.6
5
+ - 2.5
6
+ - 2.4
7
+ - jruby
16
8
 
17
9
  env:
18
10
  global:
19
11
  - JRUBY_OPTS="-J-Xms512m -J-Xmx1024m"
20
12
  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
21
- jdk: oraclejdk8
13
+
14
+ jdk: openjdk8
data/CHANGES.txt CHANGED
@@ -1,3 +1,14 @@
1
+ 2.0.0.pre1
2
+
3
+ In this release, we've added many new features, including:
4
+
5
+ - a new JSON request generator (enabled by default, replacing the XML-based requests) (@mootprinter)
6
+ - using Faraday for added flexibility for HTTP configuration
7
+ - native support for nested child documents and atomic updates in RSolr::Document and RSolr::Client.add
8
+ - better support for custom field value converters (@solenko)
9
+ - removing code deprecated in RSolr 1.x (@vipulnsward, and others)
10
+
11
+
1
12
  1.0.12
2
13
  - Fix bug where specifying the wt property as a string, would add the supplied value to the default ('ruby') rather than overriding it.
3
14
 
data/Gemfile CHANGED
@@ -3,7 +3,3 @@ source "https://rubygems.org"
3
3
  gemspec
4
4
 
5
5
  gem "builder", ">= 2.1.2"
6
-
7
- if defined? RUBY_VERSION and RUBY_VERSION < "1.9"
8
- gem 'nokogiri', "< 1.6"
9
- end
data/README.rdoc CHANGED
@@ -11,7 +11,6 @@ The code docs http://www.rubydoc.info/gems/rsolr
11
11
  gem install rsolr
12
12
 
13
13
  == Example:
14
- require 'rubygems'
15
14
  require 'rsolr'
16
15
 
17
16
  # Direct connection
@@ -19,7 +18,17 @@ The code docs http://www.rubydoc.info/gems/rsolr
19
18
 
20
19
  # Connecting over a proxy server
21
20
  solr = RSolr.connect :url => 'http://solrserver.com', :proxy=>'http://user:pass@proxy.example.com:8080'
21
+
22
+ # Using an alternate Faraday adapter
23
+ solr = RSolr.connect :url => 'http://solrserver.com', :adapter => :em_http
22
24
 
25
+ # Using a custom Faraday connection
26
+ conn = Faraday.new do |faraday|
27
+ faraday.response :logger # log requests to STDOUT
28
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
29
+ end
30
+ solr = RSolr.connect conn, :url => 'http://solrserver.com'
31
+
23
32
  # send a request to /select
24
33
  response = solr.get 'select', :params => {:q => '*:*'}
25
34
 
@@ -34,6 +43,14 @@ The +:request+ attribute contains the original request context. You can use this
34
43
 
35
44
  The +:response+ attribute contains the original response. This object contains the +:status+, +:body+ and +:headers+ keys.
36
45
 
46
+ == Request formats
47
+
48
+ By default, RSolr uses the Solr JSON command format for all requests.
49
+
50
+ RSolr.connect :url => 'http://solrserver.com', update_format: :json # the default
51
+ # or
52
+ RSolr.connect :url => 'http://solrserver.com', update_format: :xml
53
+
37
54
  == Timeouts
38
55
  The read and connect timeout settings can be set when creating a new instance of RSolr:
39
56
  solr = RSolr.connect(:read_timeout => 120, :open_timeout => 120)
@@ -44,6 +61,7 @@ A 503 is usually a temporary error which RSolr may retry if requested. You may s
44
61
  Only requests which specify a Retry-After header will be retried, after waiting the indicated retry interval, otherwise RSolr will treat the request as a 500. You may specify a maximum Retry-After interval to wait with the +:retry_after_limit+ option (default: one second).
45
62
  solr = RSolr.connect(:retry_503 => 1, :retry_after_limit => 1)
46
63
 
64
+ For additional control, consider using a custom Faraday connection (see above) using its `retry` middleware.
47
65
 
48
66
  == Querying
49
67
  Use the #get / #post method to send search requests to the /select handler:
@@ -119,9 +137,9 @@ Multiple documents via #add
119
137
  The optional +:add_attributes+ hash can also be used to set Solr "add" document attributes:
120
138
  solr.add documents, :add_attributes => {:commitWithin => 10}
121
139
 
122
- Raw XML via #update
123
- solr.update :data => '<commit/>'
124
- solr.update :data => '<optimize/>'
140
+ Raw commands via #update
141
+ solr.update data: '<commit/>', headers: { 'Content-Type' => 'text/xml' }
142
+ solr.update data: { optimize: true }.to_json, headers: { 'Content-Type' => 'application/json' }
125
143
 
126
144
  When adding, you can also supply "add" xml element attributes and/or a block for manipulating other "add" related elements (docs and fields) by calling the +xml+ method directly:
127
145
 
@@ -155,14 +173,13 @@ Delete by array of queries
155
173
  == Response Formats
156
174
  The default response format is Ruby. When the +:wt+ param is set to +:ruby+, the response is eval'd resulting in a Hash. You can get a raw response by setting the +:wt+ to +"ruby"+ - notice, the string -- not a symbol. RSolr will eval the Ruby string ONLY if the :wt value is :ruby. All other response formats are available as expected, +:wt=>'xml'+ etc..
157
175
 
158
- ===Evaluated Ruby (default)
176
+ ===Evaluated Ruby:
159
177
  solr.get 'select', :params => {:wt => :ruby} # notice :ruby is a Symbol
160
- ===Raw Ruby
178
+ ===Raw Ruby:
161
179
  solr.get 'select', :params => {:wt => 'ruby'} # notice 'ruby' is a String
162
-
163
180
  ===XML:
164
181
  solr.get 'select', :params => {:wt => :xml}
165
- ===JSON:
182
+ ===JSON (default):
166
183
  solr.get 'select', :params => {:wt => :json}
167
184
 
168
185
  ==Related Resources & Projects
@@ -170,7 +187,7 @@ The default response format is Ruby. When the +:wt+ param is set to +:ruby+, the
170
187
  * {rsolr-ext}[http://github.com/mwmitchell/rsolr-ext] -- An extension kit for RSolr
171
188
  * {rsolr-direct}[http://github.com/mwmitchell/rsolr-direct] -- JRuby direct connection for RSolr
172
189
  * {rsolr-nokogiri}[http://github.com/mwmitchell/rsolr-nokogiri] -- Gives RSolr Nokogiri for XML generation.
173
- * {SunSpot}[http://github.com/outoftime/sunspot] -- An awesome Solr DSL, built with RSolr
190
+ * {SunSpot}[http://github.com/sunspot/sunspot] -- An awesome Solr DSL, built with RSolr
174
191
  * {Blacklight}[http://blacklightopac.org] -- A "next generation" Library OPAC, built with RSolr
175
192
  * {java_bin}[http://github.com/kennyj/java_bin] -- Provides javabin/binary parsing for RSolr
176
193
  * {Solr}[http://lucene.apache.org/solr/] -- The Apache Solr project
data/Rakefile CHANGED
@@ -1,6 +1,19 @@
1
- require 'rake'
2
1
  require 'bundler/gem_tasks'
3
2
 
4
- Dir['tasks/**/*.rake'].each { |t| load t }
3
+ task default: ['spec']
5
4
 
6
- task :default => ['spec']
5
+ require 'rspec/core/rake_task'
6
+
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ # Rdoc
10
+ require 'rdoc/task'
11
+
12
+ desc 'Generate documentation for the rsolr gem.'
13
+ RDoc::Task.new(:doc) do |rdoc|
14
+ rdoc.rdoc_dir = 'doc'
15
+ rdoc.title = 'RSolr'
16
+ rdoc.options << '--line-numbers' << '--inline-source'
17
+ rdoc.rdoc_files.include('README.rdoc')
18
+ rdoc.rdoc_files.include('lib/**/*.rb')
19
+ end
data/lib/rsolr.rb CHANGED
@@ -1,16 +1,27 @@
1
1
  module RSolr
2
-
3
- Dir.glob(File.expand_path("../rsolr/*.rb", __FILE__)).each{|rb_file| require(rb_file)}
4
-
2
+ require 'rsolr/version'
3
+
4
+ autoload :Char, 'rsolr/char'
5
+ autoload :Client, 'rsolr/client'
6
+ autoload :Document, 'rsolr/document'
7
+ autoload :Error, 'rsolr/error'
8
+ autoload :Field, 'rsolr/field'
9
+ autoload :Generator, 'rsolr/generator'
10
+ autoload :HashWithResponse, 'rsolr/response'
11
+ autoload :JSON, 'rsolr/json'
12
+ autoload :Response, 'rsolr/response'
13
+ autoload :Uri, 'rsolr/uri'
14
+ autoload :Xml, 'rsolr/xml'
15
+
5
16
  def self.connect *args
6
- driver = Class === args[0] ? args[0] : RSolr::Connection
7
- opts = Hash === args[-1] ? args[-1] : {}
8
- Client.new driver.new, opts
17
+ opts = args.pop if args.last.is_a?(::Hash)
18
+ opts ||= {}
19
+
20
+ connection = args.first
21
+
22
+ Client.new connection, opts
9
23
  end
10
-
11
- # RSolr.escape, which is deprecated as of 2015-02
12
- extend Char
13
-
24
+
14
25
  # backslash escape characters that have special meaning to Solr query parser
15
26
  # per http://lucene.apache.org/core/4_0_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#Escaping_Special_Characters
16
27
  # + - & | ! ( ) { } [ ] ^ " ~ * ? : \ /
@@ -22,5 +33,20 @@ module RSolr
22
33
  # so the result sent to Solr is ultimately a single backslash in front of the particular character
23
34
  str.gsub(/([+\-&|!\(\)\{\}\[\]\^"~\*\?:\\\/])/, '\\\\\1')
24
35
  end
25
-
26
- end
36
+
37
+ module Array
38
+ def self.wrap(object)
39
+ if object.nil?
40
+ [nil]
41
+ elsif object.respond_to?(:to_ary)
42
+ object.to_ary || [object]
43
+ elsif object.is_a? Hash
44
+ [object]
45
+ elsif object.is_a? Enumerable
46
+ object
47
+ else
48
+ [object]
49
+ end
50
+ end
51
+ end
52
+ end
data/lib/rsolr/char.rb CHANGED
@@ -1,24 +1,6 @@
1
- # A module that contains (1) string related methods
2
- # @deprecated remove this module when we remove the method (duh)
1
+ # :nodoc:
3
2
  module RSolr::Char
4
-
5
- # backslash everything
6
- # that isn't a word character
7
- # @deprecated - this is incorrect Solr escaping
8
- def escape value
9
- warn "[DEPRECATION] `RSolr.escape` is deprecated (and incorrect). Use `RSolr.solr_escape` instead."
10
- value.gsub(/(\W)/, '\\\\\1')
3
+ def self.included(*)
4
+ warn 'RSolr::Char is deprecated without replacement, and will be removed in RSolr 3.x'
11
5
  end
12
-
13
- # LUCENE_CHAR_RX = /([\+\-\!\(\)\[\]\^\"\~\*\?\:\\]+)/
14
- # LUCENE_WORD_RX = /(OR|AND|NOT)/
15
- #
16
- # # More specific/lucene escape sequence
17
- # def lucene_escape string
18
- # delim = " "
19
- # string.gsub(LUCENE_CHAR_RX, '\\\\\1').split(delim).map { |v|
20
- # v.gsub(LUCENE_WORD_RX, '\\\\\1')
21
- # }.join(delim)
22
- # end
23
-
24
6
  end
data/lib/rsolr/client.rb CHANGED
@@ -1,13 +1,15 @@
1
- begin
2
- require 'json'
3
- rescue LoadError
4
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'faraday'
5
+ require 'uri'
5
6
 
6
7
  class RSolr::Client
8
+ DEFAULT_URL = 'http://127.0.0.1:8983/solr/'
7
9
 
8
10
  class << self
9
11
  def default_wt
10
- @default_wt || :ruby
12
+ @default_wt ||= :json
11
13
  end
12
14
 
13
15
  def default_wt= value
@@ -15,33 +17,41 @@ class RSolr::Client
15
17
  end
16
18
  end
17
19
 
18
- attr_reader :connection, :uri, :proxy, :options, :update_path
20
+ attr_reader :uri, :proxy, :update_format, :options, :update_path
19
21
 
20
22
  def initialize connection, options = {}
21
23
  @proxy = @uri = nil
22
24
  @connection = connection
23
25
  unless false === options[:url]
24
- url = options[:url] ? options[:url].dup : 'http://127.0.0.1:8983/solr/'
25
- url << "/" unless url[-1] == ?/
26
- @uri = RSolr::Uri.create url
26
+ @uri = extract_url_from_options(options)
27
27
  if options[:proxy]
28
28
  proxy_url = options[:proxy].dup
29
29
  proxy_url << "/" unless proxy_url.nil? or proxy_url[-1] == ?/
30
- @proxy = RSolr::Uri.create proxy_url if proxy_url
30
+ @proxy = ::URI.parse proxy_url if proxy_url
31
31
  elsif options[:proxy] == false
32
32
  @proxy = false # used to avoid setting the proxy from the environment.
33
33
  end
34
34
  end
35
+ @update_format = options.delete(:update_format) || RSolr::JSON::Generator
35
36
  @update_path = options.fetch(:update_path, 'update')
36
37
  @options = options
37
38
  end
38
39
 
40
+ def extract_url_from_options(options)
41
+ url = options[:url] ? options[:url].dup : DEFAULT_URL
42
+ url << "/" unless url[-1] == ?/
43
+ uri = ::URI.parse(url)
44
+ # URI::HTTPS is a subclass of URI::HTTP, so this check accepts HTTP(S)
45
+ raise ArgumentError, "You must provide an HTTP(S) url." unless uri.kind_of?(URI::HTTP)
46
+ uri
47
+ end
48
+
39
49
  # returns the request uri object.
40
50
  def base_request_uri
41
51
  base_uri.request_uri if base_uri
42
52
  end
43
53
 
44
- # returns the RSolr::URI uri object.
54
+ # returns the URI uri object.
45
55
  def base_uri
46
56
  @uri
47
57
  end
@@ -80,11 +90,10 @@ class RSolr::Client
80
90
  #
81
91
  def update opts = {}
82
92
  opts[:headers] ||= {}
83
- opts[:headers]['Content-Type'] ||= 'text/xml'
93
+ opts[:headers]['Content-Type'] ||= builder.content_type
84
94
  post opts.fetch(:path, update_path), opts
85
95
  end
86
96
 
87
- #
88
97
  # +add+ creates xml "add" documents and sends the xml data to the +update+ method
89
98
  #
90
99
  # http://wiki.apache.org/solr/UpdateXmlMessages#add.2BAC8-update
@@ -101,7 +110,7 @@ class RSolr::Client
101
110
  #
102
111
  def add doc, opts = {}
103
112
  add_attributes = opts.delete :add_attributes
104
- update opts.merge(:data => xml.add(doc, add_attributes))
113
+ update opts.merge(:data => builder.add(doc, add_attributes))
105
114
  end
106
115
 
107
116
  # send "commit" xml with opts
@@ -110,7 +119,7 @@ class RSolr::Client
110
119
  #
111
120
  def commit opts = {}
112
121
  commit_attrs = opts.delete :commit_attributes
113
- update opts.merge(:data => xml.commit( commit_attrs ))
122
+ update opts.merge(:data => builder.commit( commit_attrs ))
114
123
  end
115
124
 
116
125
  # send "optimize" xml with opts.
@@ -119,7 +128,7 @@ class RSolr::Client
119
128
  #
120
129
  def optimize opts = {}
121
130
  optimize_attributes = opts.delete :optimize_attributes
122
- update opts.merge(:data => xml.optimize(optimize_attributes))
131
+ update opts.merge(:data => builder.optimize(optimize_attributes))
123
132
  end
124
133
 
125
134
  # send </rollback>
@@ -128,14 +137,14 @@ class RSolr::Client
128
137
  #
129
138
  # NOTE: solr 1.4 only
130
139
  def rollback opts = {}
131
- update opts.merge(:data => xml.rollback)
140
+ update opts.merge(:data => builder.rollback)
132
141
  end
133
142
 
134
143
  # Delete one or many documents by id
135
144
  # solr.delete_by_id 10
136
145
  # solr.delete_by_id([12, 41, 199])
137
146
  def delete_by_id id, opts = {}
138
- update opts.merge(:data => xml.delete_by_id(id))
147
+ update opts.merge(:data => builder.delete_by_id(id))
139
148
  end
140
149
 
141
150
  # delete one or many documents by query.
@@ -145,12 +154,19 @@ class RSolr::Client
145
154
  # solr.delete_by_query 'available:0'
146
155
  # solr.delete_by_query ['quantity:0', 'manu:"FQ"']
147
156
  def delete_by_query query, opts = {}
148
- update opts.merge(:data => xml.delete_by_query(query))
157
+ update opts.merge(:data => builder.delete_by_query(query))
149
158
  end
150
159
 
151
- # shortcut to RSolr::Xml::Generator
152
- def xml
153
- @xml ||= RSolr::Xml::Generator.new
160
+ def builder
161
+ @builder ||= if update_format.is_a? Class
162
+ update_format.new
163
+ elsif update_format == :json
164
+ RSolr::JSON::Generator.new
165
+ elsif update_format == :xml
166
+ RSolr::Xml::Generator.new
167
+ else
168
+ update_format
169
+ end
154
170
  end
155
171
 
156
172
  # +send_and_receive+ is the main request method responsible for sending requests to the +connection+ object.
@@ -177,48 +193,21 @@ class RSolr::Client
177
193
 
178
194
  #
179
195
  def execute request_context
196
+ raw_response = begin
197
+ response = connection.send(request_context[:method], request_context[:uri].to_s) do |req|
198
+ req.body = request_context[:data] if request_context[:method] == :post and request_context[:data]
199
+ req.headers.merge!(request_context[:headers]) if request_context[:headers]
200
+ end
180
201
 
181
- raw_response = connection.execute self, request_context
182
-
183
- while retry_503?(request_context, raw_response)
184
- request_context[:retry_503] -= 1
185
- sleep retry_after(raw_response)
186
- raw_response = connection.execute self, request_context
202
+ { status: response.status.to_i, headers: response.headers, body: response.body.force_encoding('utf-8') }
203
+ rescue Errno::ECONNREFUSED, defined?(Faraday::ConnectionFailed) ? Faraday::ConnectionFailed : Faraday::Error::ConnectionFailed
204
+ raise RSolr::Error::ConnectionRefused, request_context.inspect
205
+ rescue Faraday::Error => e
206
+ raise RSolr::Error::Http.new(request_context, e.response)
187
207
  end
188
-
189
208
  adapt_response(request_context, raw_response) unless raw_response.nil?
190
209
  end
191
210
 
192
- def retry_503?(request_context, response)
193
- return false if response.nil?
194
- status = response[:status] && response[:status].to_i
195
- return false unless status == 503
196
- retry_503 = request_context[:retry_503]
197
- return false unless retry_503 && retry_503 > 0
198
- retry_after_limit = request_context[:retry_after_limit] || 1
199
- retry_after = retry_after(response)
200
- return false unless retry_after && retry_after <= retry_after_limit
201
- true
202
- end
203
-
204
- # Retry-After can be a relative number of seconds from now, or an RFC 1123 Date.
205
- # If the latter, attempt to convert it to a relative time in seconds.
206
- def retry_after(response)
207
- retry_after = Array(response[:headers]['Retry-After'] || response[:headers]['retry-after']).flatten.first.to_s
208
- if retry_after =~ /\A[0-9]+\Z/
209
- retry_after = retry_after.to_i
210
- else
211
- begin
212
- retry_after_date = DateTime.parse(retry_after)
213
- retry_after = retry_after_date.to_time - Time.now
214
- retry_after = nil if retry_after < 0
215
- rescue ArgumentError
216
- retry_after = retry_after.to_i
217
- end
218
- end
219
- retry_after
220
- end
221
-
222
211
  # +build_request+ accepts a path and options hash,
223
212
  # then prepares a normalized hash to return for sending
224
213
  # to a solr connection driver.
@@ -250,10 +239,6 @@ class RSolr::Client
250
239
  opts[:path] = path
251
240
  opts[:uri] = base_uri.merge(path.to_s + (query ? "?#{query}" : "")) if base_uri
252
241
 
253
- [:open_timeout, :read_timeout, :retry_503, :retry_after_limit].each do |k|
254
- opts[k] = @options[k]
255
- end
256
-
257
242
  opts
258
243
  end
259
244
 
@@ -285,7 +270,6 @@ class RSolr::Client
285
270
  def adapt_response request, response
286
271
  raise "The response does not have the correct keys => :body, :headers, :status" unless
287
272
  %W(body headers status) == response.keys.map{|k|k.to_s}.sort
288
- raise RSolr::Error::Http.new request, response unless [200,302].include? response[:status]
289
273
 
290
274
  result = if respond_to? "evaluate_#{request[:params][:wt]}_response", true
291
275
  send "evaluate_#{request[:params][:wt]}_response", request, response
@@ -299,6 +283,26 @@ class RSolr::Client
299
283
 
300
284
  result
301
285
  end
286
+
287
+ def connection
288
+ @connection ||= begin
289
+ conn_opts = { request: {} }
290
+ conn_opts[:url] = uri.to_s
291
+ conn_opts[:proxy] = proxy if proxy
292
+ conn_opts[:request][:open_timeout] = options[:open_timeout] if options[:open_timeout]
293
+ conn_opts[:request][:timeout] = options[:read_timeout] if options[:read_timeout]
294
+ conn_opts[:request][:params_encoder] = Faraday::FlatParamsEncoder
295
+
296
+ Faraday.new(conn_opts) do |conn|
297
+ conn.basic_auth(uri.user, uri.password) if uri.user && uri.password
298
+ conn.response :raise_error
299
+ conn.request :retry, max: options[:retry_after_limit], interval: 0.05,
300
+ interval_randomness: 0.5, backoff_factor: 2,
301
+ exceptions: ['Faraday::Error', 'Timeout::Error'] if options[:retry_503]
302
+ conn.adapter options[:adapter] || Faraday.default_adapter
303
+ end
304
+ end
305
+ end
302
306
 
303
307
  protected
304
308
 
@@ -319,21 +323,17 @@ class RSolr::Client
319
323
  # instead, giving full access to the
320
324
  # request/response objects.
321
325
  def evaluate_ruby_response request, response
322
- begin
323
- Kernel.eval response[:body].to_s
324
- rescue SyntaxError
325
- raise RSolr::Error::InvalidRubyResponse.new request, response
326
- end
326
+ Kernel.eval response[:body].to_s
327
+ rescue SyntaxError
328
+ raise RSolr::Error::InvalidRubyResponse.new request, response
327
329
  end
328
330
 
329
331
  def evaluate_json_response request, response
330
- return response[:body] unless defined? JSON
332
+ return if response[:body].nil? || response[:body].empty?
331
333
 
332
- begin
333
- JSON.parse response[:body].to_s
334
- rescue JSON::ParserError
335
- raise RSolr::Error::InvalidJsonResponse.new request, response
336
- end
334
+ JSON.parse response[:body].to_s
335
+ rescue JSON::ParserError
336
+ raise RSolr::Error::InvalidJsonResponse.new request, response
337
337
  end
338
338
 
339
339
  def default_wt