solr_wrapper 4.0.2 → 4.1.1

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
  SHA256:
3
- metadata.gz: d0ec6a2ca3c8e571ae16e5ded77d9786ce333094a0fc8773d61b46d2bf1ba211
4
- data.tar.gz: 3636273764eb165f5dc132bb2a558fd13b974c91f0f6e3a6d1cfaa318fb1b327
3
+ metadata.gz: 751cc40ca1d014568d2ec3a7b6f388a34ddf64667e22b5b7aec00155a99762d8
4
+ data.tar.gz: 3204adf72ccae744917b3fdb53597be80a08a26cab38702ab70cb1c4902e255a
5
5
  SHA512:
6
- metadata.gz: da1cfd3a2b98fc21125970c6357c2763394e6620f9b22df2ee1d08594d0948c0cb99f0051f4c79c76cd4f89c170db00b078f80687163a119fa6a5882a3c56c52
7
- data.tar.gz: 5ebff3d507a4ff72b3fc711756c2f9bfb1e443c617b4a55d12da8f64ecbe655da417c5b3063f81dead29cf94acfc0d3baa1cb439af5936933c5b73e68beafe61
6
+ metadata.gz: 8c9bfd8aa35f953b95d4e2c0f570f40509cf27ec052e5444c182ebbd338bbe865ff44be9d015d9c7dfbbd6872f56baf70d89f126034bf6e2e3035caeadd6d532
7
+ data.tar.gz: f2aa2cb38e686787991488c8fa693a3693920151ac6497ecef497d88b191aacc682399bd4026457aeb59a9878434c7e843154af1f159bb1ff4af47664fca38bf
@@ -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,35 @@
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
- end
16
+ client.get do |req|
17
+ req.options.on_data = Proc.new do |chunk, overall_received_bytes, env|
18
+ if env
19
+ pbar.total = env.response_headers['content-length'].to_i
20
+ pbar.progress = overall_received_bytes
21
+ else
22
+ pbar.increment
23
+ end
17
24
 
18
- nil
25
+ pbar.progress = overall_received_bytes
26
+ f.write(chunk)
27
+ end
28
+ end
19
29
  end
20
- rescue HTTP::Error => e
30
+
31
+ true
32
+ rescue Faraday::Error => e
21
33
  raise SolrWrapperError, "Unable to download solr from #{url}\n#{e}"
22
34
  end
23
35
 
@@ -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
  ##
@@ -172,11 +201,11 @@ module SolrWrapper
172
201
  options[:name] ||= SecureRandom.hex
173
202
  options[:zkhost] ||= zkhost
174
203
 
175
- upconfig_options = { upconfig: true, n: options[:name] }
204
+ upconfig_options = { n: options[:name] }
176
205
  upconfig_options[:d] = options[:dir] if options[:dir]
177
206
  upconfig_options[:z] = options[:zkhost] if options[:zkhost]
178
207
 
179
- exec 'zk', upconfig_options
208
+ exec ['zk', 'upconfig'], upconfig_options
180
209
 
181
210
  options[:name]
182
211
  end
@@ -190,11 +219,11 @@ module SolrWrapper
190
219
  options[:name] ||= SecureRandom.hex
191
220
  options[:zkhost] ||= zkhost
192
221
 
193
- downconfig_options = { downconfig: true, n: options[:name] }
222
+ downconfig_options = { n: options[:name] }
194
223
  downconfig_options[:d] = options[:dir] if options[:dir]
195
224
  downconfig_options[:z] = options[:zkhost] if options[:zkhost]
196
225
 
197
- exec 'zk', downconfig_options
226
+ exec ['zk', 'downconfig'], downconfig_options
198
227
 
199
228
  options[:name]
200
229
  end
@@ -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
  ##
@@ -17,7 +17,7 @@ module SolrWrapper
17
17
  private
18
18
 
19
19
  def argument_list
20
- [config.solr_binary, cmd] + config.solr_options.merge(options).map do |k, v|
20
+ [config.solr_binary] + Array(cmd) + config.solr_options.merge(options).map do |k, v|
21
21
  case v
22
22
  when true
23
23
  "-#{k}"
@@ -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.1'
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", "~> 2.5"
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 }
@@ -135,7 +135,7 @@ describe SolrWrapper::Instance do
135
135
  let(:cmd) { 'healthcheck' }
136
136
  let(:options) { { z: 'localhost:5098' } }
137
137
  it 'raises an error with the output from the shell command' do
138
- expect { subject }.to raise_error(RuntimeError, /Failed to execute solr healthcheck: collection parameter is required!/)
138
+ expect { subject }.to raise_error(RuntimeError, Regexp.union(/Failed to execute solr healthcheck: collection parameter is required!/, /Failed to parse command-line arguments due to: Missing required option: c/))
139
139
  end
140
140
  end
141
141
  end
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.1
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: 2025-03-17 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: '2.5'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.5'
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