solr_wrapper 4.0.2 → 4.1.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
  SHA256:
3
- metadata.gz: d0ec6a2ca3c8e571ae16e5ded77d9786ce333094a0fc8773d61b46d2bf1ba211
4
- data.tar.gz: 3636273764eb165f5dc132bb2a558fd13b974c91f0f6e3a6d1cfaa318fb1b327
3
+ metadata.gz: dea9ffb20f5c86f84c5f55ac9ccd393ebdb4ac3eccc321bec26327727626b882
4
+ data.tar.gz: d9f85c0414b81491599cc76ba88540e8ba894c47205debb0b6699ccec00b5905
5
5
  SHA512:
6
- metadata.gz: da1cfd3a2b98fc21125970c6357c2763394e6620f9b22df2ee1d08594d0948c0cb99f0051f4c79c76cd4f89c170db00b078f80687163a119fa6a5882a3c56c52
7
- data.tar.gz: 5ebff3d507a4ff72b3fc711756c2f9bfb1e443c617b4a55d12da8f64ecbe655da417c5b3063f81dead29cf94acfc0d3baa1cb439af5936933c5b73e68beafe61
6
+ metadata.gz: 86d8223ecd9df368ede9c624f3d150f65f06e6644b060ad3c2628b3338145aeaf1c82c72818b9867ff7b428480663a3da65694185641998f5d5cfade3830b2ef
7
+ data.tar.gz: '08585c280ca1884815c42d4d585eef463bb3cc878376a6fbb33a77e4e1add615e5effc72d76d6ac4b0a7eee8b36719f8c34b930277956e179f07660912b99bbe'
@@ -12,11 +12,19 @@ jobs:
12
12
  strategy:
13
13
  matrix:
14
14
  ruby:
15
- - 2.7
16
- - 3.0
17
- - jruby-9.2.20.0
15
+ - '3.2.5'
16
+ - '3.3.4'
17
+ - jruby-9.4.8.0
18
+ solr_version: ['']
19
+ include:
20
+ - ruby: '3.3.4'
21
+ solr_version: '8.11.4'
22
+ - ruby: '3.3.4'
23
+ solr_version: '9.6.1'
24
+ env:
25
+ SOLR_WRAPPER_SOLR_VERSION: ${{ matrix.solr_version }}
18
26
  steps:
19
- - uses: actions/checkout@v2
27
+ - uses: actions/checkout@v3
20
28
  - name: Set up Ruby
21
29
  uses: ruby/setup-ruby@v1
22
30
  with:
@@ -13,13 +13,16 @@ module SolrWrapper
13
13
 
14
14
  def validate?(file)
15
15
  return true if config.validate == false
16
- Digest.const_get(algorithm.upcase).file(file).hexdigest == expected_sum(algorithm)
16
+
17
+ actual_sum(file) == expected_sum
17
18
  end
18
19
 
19
20
  def validate!(file)
20
- unless validate? file
21
- raise "Checksum mismatch" unless config.ignore_checksum
22
- end
21
+ return if validate?(file)
22
+
23
+ return if config.ignore_checksum || defined?(JRUBY_VERSION)
24
+
25
+ raise "Checksum mismatch: #{file} (expected(#{expected_sum}) != actual(#{actual_sum(file)})"
23
26
  end
24
27
 
25
28
  private
@@ -36,8 +39,12 @@ module SolrWrapper
36
39
  File.join(config.download_dir, File.basename(checksumurl(suffix)))
37
40
  end
38
41
 
39
- def expected_sum(alg)
40
- config.checksum || read_file(alg)
42
+ def actual_sum(file)
43
+ Digest.const_get(algorithm.upcase).file(file).hexdigest
44
+ end
45
+
46
+ def expected_sum
47
+ config.checksum || read_file(algorithm)
41
48
  end
42
49
 
43
50
  def read_file(alg)
@@ -1,4 +1,4 @@
1
- require 'http'
1
+ require 'faraday'
2
2
  require 'json'
3
3
 
4
4
  module SolrWrapper
@@ -18,7 +18,7 @@ module SolrWrapper
18
18
  private
19
19
 
20
20
  def collection?(name)
21
- response = HTTP.get("#{url}admin/collections?action=LIST&wt=json")
21
+ response = Faraday.get("#{url}admin/collections?action=LIST&wt=json")
22
22
  data = JSON.parse(response.body)
23
23
  return if data['error'] && data['error']['msg'] == 'Solr instance is not running in SolrCloud mode.'
24
24
 
@@ -26,7 +26,7 @@ module SolrWrapper
26
26
  end
27
27
 
28
28
  def core?(name)
29
- response = HTTP.get("#{url}admin/cores?action=STATUS&wt=json&core=#{name}")
29
+ response = Faraday.get("#{url}admin/cores?action=STATUS&wt=json&core=#{name}")
30
30
  !JSON.parse(response.body)['status'][name].empty?
31
31
  end
32
32
  end
@@ -1,4 +1,5 @@
1
- require 'http'
1
+ require 'faraday'
2
+ require 'faraday/follow_redirects'
2
3
 
3
4
  module SolrWrapper
4
5
  class Configuration
@@ -9,6 +10,7 @@ module SolrWrapper
9
10
  @verbose = options[:verbose]
10
11
 
11
12
  @options = load_configs(Array(options[:config])).merge(options)
13
+ @options[:env] ||= ENV
12
14
  end
13
15
 
14
16
  def solr_xml
@@ -84,7 +86,12 @@ module SolrWrapper
84
86
 
85
87
  def version
86
88
  @version ||= begin
87
- config_version = options.fetch(:version, SolrWrapper.default_instance_options[:version])
89
+ config_version = if env_options[:version].nil? || env_options[:version].empty?
90
+ options.fetch(:version, SolrWrapper.default_instance_options[:version])
91
+ else
92
+ env_options[:version]
93
+ end
94
+
88
95
  if config_version == 'latest'
89
96
  fetch_latest_version
90
97
  else
@@ -110,18 +117,23 @@ module SolrWrapper
110
117
  options[:mirror_url] + mirror_artifact_path
111
118
  else
112
119
  begin
113
- json = HTTP.follow.get(closest_mirror_url).body
120
+ client = Faraday.new(closest_mirror_url) do |faraday|
121
+ faraday.use Faraday::FollowRedirects::Middleware
122
+ faraday.adapter Faraday.default_adapter
123
+ end
124
+
125
+ json = client.get.body
114
126
  doc = JSON.parse(json)
115
127
  url = doc['preferred'] + doc['path_info']
116
128
 
117
- response = HTTP.head(url)
129
+ response = Faraday.head(url)
118
130
 
119
- if response.status.success?
131
+ if response.success?
120
132
  url
121
133
  else
122
134
  archive_download_url
123
135
  end
124
- rescue Errno::ECONNRESET, SocketError, HTTP::Error
136
+ rescue Errno::ECONNRESET, SocketError, Faraday::Error
125
137
  archive_download_url
126
138
  end
127
139
  end
@@ -210,8 +222,24 @@ module SolrWrapper
210
222
  end
211
223
 
212
224
  def fetch_latest_version
213
- response = HTTP.follow.get(options.fetch(:latest_version_url, 'https://solr.apache.org/downloads.html'))
225
+ url = options.fetch(:latest_version_url, 'https://solr.apache.org/downloads.html')
226
+
227
+ client = Faraday.new(url) do |faraday|
228
+ faraday.use Faraday::FollowRedirects::Middleware
229
+ faraday.adapter Faraday.default_adapter
230
+ end
231
+
232
+ response = client.get
214
233
  response.body.to_s[/Solr \d+\.\d+\.\d+/][/\d+\.\d+\.\d+/]
215
234
  end
235
+
236
+ def env_options
237
+ @env_options ||= begin
238
+ env = options.fetch(:env, {})
239
+ {
240
+ version: env['SOLR_WRAPPER_SOLR_VERSION']
241
+ }
242
+ end
243
+ end
216
244
  end
217
245
  end
@@ -1,23 +1,29 @@
1
1
  require 'ruby-progressbar'
2
- require 'http'
2
+ require 'faraday'
3
+ require 'faraday/follow_redirects'
3
4
 
4
5
  module SolrWrapper
5
6
  class Downloader
6
7
  def self.fetch_with_progressbar(url, output)
7
8
  pbar = SafeProgressBar.new(title: File.basename(url), total: nil, format: '%t: |%B| %p%% (%e )')
8
9
 
9
- response = HTTP.follow.get(url)
10
- pbar.total = response.headers['content-length'].to_i
10
+ client = Faraday.new(url) do |faraday|
11
+ faraday.use Faraday::FollowRedirects::Middleware
12
+ faraday.adapter Faraday.default_adapter
13
+ end
11
14
 
12
15
  File.open(output, 'wb') do |f|
13
- response.body.each do |chunk|
14
- f.write(chunk)
15
- pbar.progress += chunk.length
16
+ client.get do |req|
17
+ req.options.on_data = Proc.new do |chunk, overall_received_bytes, env|
18
+ pbar.total = env.response_headers['content-length'].to_i
19
+ pbar.progress = overall_received_bytes
20
+ f.write(chunk)
21
+ end
16
22
  end
17
-
18
- nil
19
23
  end
20
- rescue HTTP::Error => e
24
+
25
+ true
26
+ rescue Faraday::Error => e
21
27
  raise SolrWrapperError, "Unable to download solr from #{url}\n#{e}"
22
28
  end
23
29
 
@@ -144,23 +144,52 @@ module SolrWrapper
144
144
  # @option options [String] :name
145
145
  # @option options [String] :dir
146
146
  def create(options = {})
147
- options[:name] ||= SecureRandom.hex
147
+ tmpdir = nil
148
148
 
149
- create_options = { p: port }
150
- create_options[:c] = options[:name] if options[:name]
151
- create_options[:n] = options[:config_name] if options[:config_name]
152
- create_options[:d] = options[:dir] if options[:dir]
149
+ begin
150
+ options[:name] ||= SecureRandom.hex
153
151
 
154
- Retriable.retriable do
155
- raise "Not started yet" unless started?
156
- end
152
+ create_options = {}
153
+ if version >= '9.7'
154
+ create_options[:url] = config.base_url
155
+ else
156
+ create_options[:p] = port
157
+ end
158
+ create_options[:c] = options[:name] if options[:name]
159
+ create_options[:n] = options[:config_name] if options[:config_name]
160
+
161
+ if options[:dir]
162
+ # Solr 9.7 required that the dir argument contain a `conf` directory that
163
+ # contains the actual configuration files.
164
+ if version >= '9.7' && !File.exist?(File.join(options[:dir], 'conf'))
165
+
166
+ if options[:dir].match?(/conf\/$/)
167
+ create_options[:d] = File.expand_path(options[:dir], '..')
168
+ else
169
+ tmpdir = Dir.mktmpdir
170
+
171
+ FileUtils.mkdir("#{tmpdir}/conf")
172
+ FileUtils.cp_r("#{options[:dir]}/.", "#{tmpdir}/conf")
173
+ create_options[:d] = tmpdir
174
+ end
175
+ else
176
+ create_options[:d] = options[:dir]
177
+ end
178
+ end
179
+
180
+ Retriable.retriable do
181
+ raise "Not started yet" unless started?
182
+ end
157
183
 
158
- # short-circuit if we're using persisted data with an existing core/collection
159
- return if options[:persist] && create_options[:c] && client.exists?(create_options[:c])
184
+ # short-circuit if we're using persisted data with an existing core/collection
185
+ return if options[:persist] && create_options[:c] && client.exists?(create_options[:c])
160
186
 
161
- exec("create", create_options)
187
+ exec("create", create_options)
162
188
 
163
- options[:name]
189
+ options[:name]
190
+ ensure
191
+ FileUtils.remove_entry tmpdir if tmpdir
192
+ end
164
193
  end
165
194
 
166
195
  ##
@@ -203,7 +232,15 @@ module SolrWrapper
203
232
  # Create a new collection in solr
204
233
  # @param [String] name collection name
205
234
  def delete(name, _options = {})
206
- exec("delete", c: name, p: port)
235
+ delete_options = { c: name }
236
+
237
+ if version >= '9.7'
238
+ delete_options[:url] = config.base_url
239
+ else
240
+ delete_options[:p] = port
241
+ end
242
+
243
+ exec("delete", delete_options)
207
244
  end
208
245
 
209
246
  ##
@@ -42,10 +42,14 @@ module SolrWrapper
42
42
  @zookeeper_port ||= "#{port.to_i + 1000}"
43
43
  end
44
44
 
45
+ def base_url
46
+ "http://#{host}:#{port}/"
47
+ end
48
+
45
49
  ##
46
50
  # Get a (likely) URL to the solr instance
47
51
  def url
48
- "http://#{host}:#{port}/solr/"
52
+ "#{base_url}solr/"
49
53
  end
50
54
 
51
55
  def instance_dir
@@ -1,3 +1,3 @@
1
1
  module SolrWrapper
2
- VERSION = '4.0.2'
2
+ VERSION = '4.1.0'
3
3
  end
data/solr_wrapper.gemspec CHANGED
@@ -18,16 +18,17 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "http"
21
+ spec.add_dependency "faraday"
22
+ spec.add_dependency "faraday-follow_redirects"
22
23
  spec.add_dependency "minitar"
23
24
  spec.add_dependency "ruby-progressbar"
24
25
  spec.add_dependency "retriable"
26
+ spec.add_dependency "ostruct"
25
27
 
26
28
  spec.add_development_dependency "bundler", ">= 1.7", "< 3"
27
- spec.add_development_dependency "rake", "~> 10.0", "< 13"
29
+ spec.add_development_dependency "rake", ">= 12.2", "< 14"
28
30
 
29
31
  spec.add_development_dependency "rspec"
30
32
  spec.add_development_dependency "simple_solr_client", "= 0.2.0" # 0.2.1 removed support for schema retrieval
31
- spec.add_development_dependency "coveralls"
32
33
  spec.add_development_dependency "webmock"
33
34
  end
@@ -240,7 +240,7 @@
240
240
  autowarmCount - the number of entries to prepopulate from
241
241
  and old cache.
242
242
  -->
243
- <filterCache class="solr.FastLRUCache"
243
+ <filterCache class="solr.CaffeineCache"
244
244
  size="512"
245
245
  initialSize="512"
246
246
  autowarmCount="0"/>
@@ -250,7 +250,7 @@
250
250
  Caches results of searches - ordered lists of document ids
251
251
  (DocList) based on a query, a sort, and the range of documents requested.
252
252
  -->
253
- <queryResultCache class="solr.LRUCache"
253
+ <queryResultCache class="solr.CaffeineCache"
254
254
  size="512"
255
255
  initialSize="512"
256
256
  autowarmCount="0"/>
@@ -261,14 +261,14 @@
261
261
  document). Since Lucene internal document ids are transient,
262
262
  this cache will not be autowarmed.
263
263
  -->
264
- <documentCache class="solr.LRUCache"
264
+ <documentCache class="solr.CaffeineCache"
265
265
  size="512"
266
266
  initialSize="512"
267
267
  autowarmCount="0"/>
268
268
 
269
269
  <!-- custom cache currently used by block join -->
270
270
  <cache name="perSegFilter"
271
- class="solr.search.LRUCache"
271
+ class="solr.CaffeineCache"
272
272
  size="10"
273
273
  initialSize="0"
274
274
  autowarmCount="10"
@@ -1,7 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe SolrWrapper::Configuration do
4
- let(:config) { described_class.new options }
4
+ let(:config) { described_class.new default_options.merge(options) }
5
+ let(:default_options) { { env: {} } }
5
6
 
6
7
  describe "#port" do
7
8
  subject { config.port }
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,3 @@
1
- require 'coveralls'
2
- Coveralls.wear!
3
-
4
1
  require 'solr_wrapper'
5
2
  require 'simple_solr_client'
6
3
 
metadata CHANGED
@@ -1,17 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solr_wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.2
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Beer
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-05-23 00:00:00.000000000 Z
11
+ date: 2024-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: http
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday-follow_redirects
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - ">="
@@ -66,6 +80,20 @@ dependencies:
66
80
  - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: ostruct
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: bundler
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -90,22 +118,22 @@ dependencies:
90
118
  name: rake
91
119
  requirement: !ruby/object:Gem::Requirement
92
120
  requirements:
93
- - - "~>"
121
+ - - ">="
94
122
  - !ruby/object:Gem::Version
95
- version: '10.0'
123
+ version: '12.2'
96
124
  - - "<"
97
125
  - !ruby/object:Gem::Version
98
- version: '13'
126
+ version: '14'
99
127
  type: :development
100
128
  prerelease: false
101
129
  version_requirements: !ruby/object:Gem::Requirement
102
130
  requirements:
103
- - - "~>"
131
+ - - ">="
104
132
  - !ruby/object:Gem::Version
105
- version: '10.0'
133
+ version: '12.2'
106
134
  - - "<"
107
135
  - !ruby/object:Gem::Version
108
- version: '13'
136
+ version: '14'
109
137
  - !ruby/object:Gem::Dependency
110
138
  name: rspec
111
139
  requirement: !ruby/object:Gem::Requirement
@@ -134,20 +162,6 @@ dependencies:
134
162
  - - '='
135
163
  - !ruby/object:Gem::Version
136
164
  version: 0.2.0
137
- - !ruby/object:Gem::Dependency
138
- name: coveralls
139
- requirement: !ruby/object:Gem::Requirement
140
- requirements:
141
- - - ">="
142
- - !ruby/object:Gem::Version
143
- version: '0'
144
- type: :development
145
- prerelease: false
146
- version_requirements: !ruby/object:Gem::Requirement
147
- requirements:
148
- - - ">="
149
- - !ruby/object:Gem::Version
150
- version: '0'
151
165
  - !ruby/object:Gem::Dependency
152
166
  name: webmock
153
167
  requirement: !ruby/object:Gem::Requirement
@@ -230,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
230
244
  - !ruby/object:Gem::Version
231
245
  version: '0'
232
246
  requirements: []
233
- rubygems_version: 3.2.32
247
+ rubygems_version: 3.5.9
234
248
  signing_key:
235
249
  specification_version: 4
236
250
  summary: Solr service wrapper