search_solr_tools 5.0.1 → 5.1.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of search_solr_tools might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 763cb91da974c8cfa5841996b861f5a0492d950d3abf39fd62813af3a521ce22
4
- data.tar.gz: d1d8ea0232c02f91f739baae6387a1ca71a03030962f0919904d03635b2d7ba2
3
+ metadata.gz: 6eb73f77a8b012afbb965dbeb800fd1a0fcdd3261711d2f4d218f35e0276f2c9
4
+ data.tar.gz: a04a061409ad6fca267e91fd21efb6d4ee010b75024e499eeb8f451be56ba0ea
5
5
  SHA512:
6
- metadata.gz: 7c4bc5946b0a19f0634a28acfc6ff2282098ad3a730fb1060c4360f1a25a10edc78278c4ea123da688a4eeeaf62887ef6d86ec2ca24bebfd51f08783926d1681
7
- data.tar.gz: 248141e1bc29f26b60795b1d4f73f9dda804ddbf1841ffbc490ca7690fe84fb2d1fb5b501c3f8df23cd8c9c11efd7dd66b65e0394114005f5e22c9b81b002781
6
+ metadata.gz: e39d629876795a63ed4802dc4cc334208300b82b42368eb7a00ecf9ad274b5af2444ac3a91204b80c50058ec1e8ecf3ea85f8aa35fc54fbd274620fef513d218
7
+ data.tar.gz: 367b9a206cb10f2b2b2285c2d6882c578c4df5eab99cbf9110f942ab7e98df9509849775ffe8f23d6222182bb4f35dd4ba23121d77a7228e9efa3b1895538fac
@@ -1,3 +1,9 @@
1
+ ## Unreleased
2
+
3
+ - Added a CLI method to "ping" the Solr and Source servers for a given
4
+ data center.
5
+ - Updated the CLI harvest to return more useful error codes on failure.
6
+
1
7
  ## v5.0.1 (2020-07-02)
2
8
 
3
9
  - Bug fix: some requires weren't included that needed to be.
data/README.md CHANGED
@@ -124,9 +124,9 @@ tagging, and publishing to RubyGems.
124
124
  |---------------------------|-------------|
125
125
  | `rake release:pre[false]` | Increase the current prerelease version number, push changes |
126
126
  | `rake release:pre[true]` | Increase the current prerelease version number, publish release\* |
127
- | `rake release:none` | Drop the prerelease version, publish release, then `pre[false]` (does a patch release) |
128
- | `rake release:minor` | Increase the minor version number, publish release, then `pre[false]` |
129
- | `rake release:major` | Increase the major version number, publish release, then `pre[false]` |
127
+ | `rake release:none` | Drop the prerelease version, publish release\*, then `pre[false]` (does a patch release) |
128
+ | `rake release:minor` | Increase the minor version number, publish release\*, then `pre[false]` |
129
+ | `rake release:major` | Increase the major version number, publish release\*, then `pre[false]` |
130
130
 
131
131
  \*"publish release" means each of the following occurs:
132
132
 
@@ -4,6 +4,7 @@
4
4
  require 'search_solr_tools'
5
5
  require 'thor'
6
6
 
7
+ # rubocop:disable Metrics/AbcSize
7
8
  class SolrHarvestCLI < Thor
8
9
  map %w[--version -v] => :__print_version
9
10
 
@@ -12,6 +13,48 @@ class SolrHarvestCLI < Thor
12
13
  puts SearchSolrTools::VERSION
13
14
  end
14
15
 
16
+ desc 'errcode', 'Get a description of the specified error exit code. Leave empty to see all codes'
17
+ def errcode(code = -1)
18
+ codes = SearchSolrTools::Errors::HarvestError.describe_exit_code(code)
19
+
20
+ puts 'CODE | DESCRIPTION'
21
+ puts '-----+------------'
22
+ codes.each do |c, text|
23
+ puts format('%4<code>d | %<text>s', code: c, text: text)
24
+ end
25
+ end
26
+
27
+ desc 'ping', 'Ping the solr and harvesting endpoints related to the specified data center(s)'
28
+ option :data_center, type: :array, required: true
29
+ option :environment, required: true
30
+ def ping
31
+ solr_success = true
32
+ source_success = true
33
+ options[:data_center].each do |target|
34
+ begin
35
+ harvest_class = get_harvester_class(target)
36
+ harvester = harvest_class.new(options[:environment])
37
+ solr_status = harvester.ping_solr
38
+ source_status = harvester.ping_source
39
+ rescue StandardError => e
40
+ solr_status = false
41
+ source_status = false
42
+ puts "Error trying to ping for #{target}: #{e}"
43
+ end
44
+ solr_success &&= solr_status
45
+ source_success &&= source_status
46
+ puts "Target: #{target}, Solr ping OK? #{solr_status}, data center ping OK? #{source_status}"
47
+ end
48
+
49
+ ping_status = SearchSolrTools::Helpers::HarvestStatus.new(
50
+ SearchSolrTools::Helpers::HarvestStatus::PING_SOLR => solr_success,
51
+ SearchSolrTools::Helpers::HarvestStatus::PING_SOURCE => source_success
52
+ )
53
+ raise SearchSolrTools::Errors::HarvestError, ping_status unless ping_status.ok?
54
+ rescue SearchSolrTools::Errors::HarvestError => e
55
+ exit e.exit_code
56
+ end
57
+
15
58
  desc 'harvest', 'Harvest from the specified data centers'
16
59
  option :data_center, type: :array, required: true
17
60
  option :environment, required: true
@@ -22,10 +65,21 @@ class SolrHarvestCLI < Thor
22
65
  begin
23
66
  harvest_class = get_harvester_class(target)
24
67
  harvester = harvest_class.new(options[:environment], die_on_failure)
68
+ ping_status = SearchSolrTools::Helpers::HarvestStatus.new(
69
+ SearchSolrTools::Helpers::HarvestStatus::PING_SOLR => harvester.ping_solr,
70
+ SearchSolrTools::Helpers::HarvestStatus::PING_SOURCE => harvester.ping_source
71
+ )
72
+ raise SearchSolrTools::Errors::HarvestError, ping_status unless ping_status.ok?
73
+
25
74
  harvester.harvest_and_delete
75
+ rescue SearchSolrTools::Errors::HarvestError => e
76
+ puts "THERE WERE HARVEST STATUS ERRORS:\n#{e.message}"
77
+ exit e.exit_code
26
78
  rescue StandardError => e
79
+ # If it gets here, there is an error that we aren't expecting.
27
80
  puts "harvest failed for #{target}: #{e.message}"
28
- raise e
81
+ puts e.backtrace
82
+ exit SearchSolrTools::Errors::HarvestError::ERRCODE_OTHER
29
83
  end
30
84
  end
31
85
  end
@@ -85,10 +139,12 @@ class SolrHarvestCLI < Thor
85
139
 
86
140
  def get_harvester_class(data_center_name)
87
141
  name = data_center_name.downcase.to_s
88
- raise("Invalid data center #{name}") unless harvester_map.key?(name)
142
+ raise SearchSolrTools::Errors::HarvestError.new(nil, "Invalid data center #{name}") unless harvester_map.key?(name)
89
143
 
90
144
  harvester_map[name]
91
145
  end
92
146
  end
93
147
  end
148
+ # rubocop:enable Metrics/AbcSize
149
+
94
150
  SolrHarvestCLI.start(ARGV)
@@ -2,6 +2,9 @@ require_relative 'search_solr_tools/config/environments'
2
2
  require_relative 'search_solr_tools/version'
3
3
 
4
4
  require_relative 'search_solr_tools/helpers/selectors'
5
+ require_relative 'search_solr_tools/helpers/harvest_status'
6
+ require_relative 'search_solr_tools/errors/harvest_error'
7
+
5
8
  %w( selectors harvesters translators ).each do |subdir|
6
9
  Dir[File.join(__dir__, 'search_solr_tools', subdir, '*.rb')].each { |file| require file }
7
10
  end
@@ -0,0 +1,73 @@
1
+ module SearchSolrTools
2
+ module Errors
3
+ class HarvestError < StandardError
4
+ ERRCODE_SOLR_PING = 1
5
+ ERRCODE_SOURCE_PING = 2
6
+ ERRCODE_SOURCE_NO_RESULTS = 4
7
+ ERRCODE_SOURCE_HARVEST_ERROR = 8
8
+ ERRCODE_DOCUMENT_INVALID = 16
9
+ ERRCODE_INGEST_ERROR = 32
10
+ ERRCODE_OTHER = 128
11
+
12
+ ERRCODE_DESC = {
13
+ ERRCODE_SOLR_PING => 'Solr instance did not return a successful ping',
14
+ ERRCODE_SOURCE_PING => 'Source to be harvested did not return a successful ping',
15
+ ERRCODE_SOURCE_NO_RESULTS => 'Source to be harvested returned no documents matching query',
16
+ ERRCODE_SOURCE_HARVEST_ERROR => 'One or more source documents returned an error when trying to retrieve or translate',
17
+ ERRCODE_DOCUMENT_INVALID => 'One or more documents to be harvested was invalid (malformed)',
18
+ ERRCODE_INGEST_ERROR => 'Solr returned an error trying to ingest one or more harvested documents',
19
+ ERRCODE_OTHER => 'General error code for non-harvest related issues'
20
+ }.freeze
21
+
22
+ # If code is -1, it means display all error codes
23
+ def self.describe_exit_code(code = -1)
24
+ code = code.to_i
25
+ code_list = []
26
+
27
+ # Loop through all bit-flag values
28
+ [128, 64, 32, 16, 8, 4, 2, 1].each do |k|
29
+ if code >= k || code == -1
30
+ code_list.prepend k
31
+ code -= k unless code == -1
32
+ end
33
+ end
34
+
35
+ codes = {}
36
+ code_list.each do |k|
37
+ next if code == -1 && !ERRCODE_DESC.keys.include?(k) # skip INVALID CODE if showing all codes
38
+ codes[k] = ERRCODE_DESC.keys.include?(k) ? ERRCODE_DESC[k] : 'INVALID CODE NUMBER'
39
+ end
40
+
41
+ codes
42
+ end
43
+
44
+ def initialize(status, message=nil)
45
+ @status_data = status
46
+ @other_message = message
47
+ end
48
+
49
+ def exit_code
50
+ if @status_data.nil?
51
+ puts "OTHER ERROR REPORTED: #{@other_message}"
52
+ return ERRCODE_OTHER
53
+ end
54
+
55
+ code = 0
56
+ code += ERRCODE_SOLR_PING unless @status_data.ping_solr
57
+ code += ERRCODE_SOURCE_PING unless @status_data.ping_source
58
+ code += ERRCODE_SOURCE_NO_RESULTS if @status_data.documents_with_status(Helpers::HarvestStatus::HARVEST_NO_DOCS).size > 0
59
+ code += ERRCODE_SOURCE_HARVEST_ERROR if @status_data.documents_with_status(Helpers::HarvestStatus::HARVEST_FAILURE).size > 0
60
+ code += ERRCODE_DOCUMENT_INVALID if @status_data.documents_with_status(Helpers::HarvestStatus::INGEST_ERR_INVALID_DOC).size > 0
61
+ code += ERRCODE_INGEST_ERROR if @status_data.documents_with_status(Helpers::HarvestStatus::INGEST_ERR_SOLR_ERROR).size > 0
62
+
63
+ code = ERRCODE_OTHER if code == 0
64
+
65
+ code
66
+ end
67
+
68
+ def message
69
+ self.class.describe_exit_code(exit_code).map{|c,v| v}.join("\n")
70
+ end
71
+ end
72
+ end
73
+ end
@@ -46,8 +46,11 @@ module SearchSolrTools
46
46
  end
47
47
 
48
48
  def add_documents_to_solr(add_docs)
49
- if insert_solr_doc add_docs, Base::JSON_CONTENT_TYPE, @env_settings[:auto_suggest_collection_name]
49
+ status = insert_solr_doc add_docs, Base::JSON_CONTENT_TYPE, @env_settings[:auto_suggest_collection_name]
50
+
51
+ if status == Helpers::HarvestStatus::INGEST_OK
50
52
  puts "Added #{add_docs.size} auto suggest documents in one commit"
53
+ return Helpers::HarvestStatus.new(Helpers::HarvestStatus::INGEST_OK => add_docs)
51
54
  else
52
55
  puts "Failed adding #{add_docs.size} documents in single commit, retrying one by one"
53
56
  new_add_docs = []
@@ -39,10 +39,40 @@ module SearchSolrTools
39
39
  url
40
40
  end
41
41
 
42
+ # Ping the Solr instance to ensure that it's running.
43
+ # The ping query is specified to manually check the title, as it's possible
44
+ # there is no "default" query in the solr instance.
45
+ def ping_solr(core = SolrEnvironments[@environment][:collection_name])
46
+ url = solr_url + "/#{core}/admin/ping?df=title"
47
+ success = false
48
+
49
+ # Some docs will cause solr to time out during the POST
50
+ begin
51
+ RestClient.get(url) do |response, _request, _result|
52
+ success = response.code == 200
53
+ puts "Error in ping request: #{response.body}" unless success
54
+ end
55
+ rescue => e
56
+ puts "Rest exception while pinging Solr: #{e}"
57
+ end
58
+ success
59
+ end
60
+
61
+ # This should be overridden by child classes to implement the ability
62
+ # to "ping" the dataset. Returns true if the ping is successful (or, as
63
+ # in this default, no ping method was defined)
64
+ def ping_source
65
+ puts "Harvester does not have ping method defined, assuming true"
66
+ true
67
+ end
68
+
42
69
  def harvest_and_delete(harvest_method, delete_constraints, solr_core = SolrEnvironments[@environment][:collection_name])
43
70
  start_time = Time.now.utc.iso8601
44
- harvest_method.call
71
+
72
+ harvest_status = harvest_method.call
45
73
  delete_old_documents start_time, delete_constraints, solr_core
74
+
75
+ harvest_status
46
76
  end
47
77
 
48
78
  def delete_old_documents(timestamp, constraints, solr_core, force = false)
@@ -83,21 +113,31 @@ module SearchSolrTools
83
113
  def insert_solr_docs(docs, content_type = XML_CONTENT_TYPE, core = SolrEnvironments[@environment][:collection_name])
84
114
  success = 0
85
115
  failure = 0
116
+
117
+ status = Helpers::HarvestStatus.new
118
+
86
119
  docs.each do |doc|
87
- insert_solr_doc(doc, content_type, core) ? success += 1 : failure += 1
120
+ doc_status = insert_solr_doc(doc, content_type, core) #? success += 1 : failure += 1
121
+ status.record_document_status(doc, doc_status)
122
+ doc_status == Helpers::HarvestStatus::INGEST_OK ? success += 1 : failure += 1
88
123
  end
89
124
  puts "#{success} document#{success == 1 ? '' : 's'} successfully added to Solr."
90
125
  puts "#{failure} document#{failure == 1 ? '' : 's'} not added to Solr."
91
- fail 'Some documents failed to be inserted into Solr' if failure > 0
126
+
127
+ status
92
128
  end
93
129
 
130
+ # TODO Need to return a specific type of failure:
131
+ # - Bad record content identified and no ingest attempted
132
+ # - Solr tries to ingest document and fails (bad content not detected prior to ingest)
133
+ # - Solr cannot insert document for reasons other than the document structure and content.
94
134
  def insert_solr_doc(doc, content_type = XML_CONTENT_TYPE, core = SolrEnvironments[@environment][:collection_name])
95
135
  url = solr_url + "/#{core}/update?commit=true"
96
- success = false
136
+ status = Helpers::HarvestStatus::INGEST_OK
97
137
 
98
138
  # Some of the docs will cause Solr to crash - CPU goes to 195% with `top` and it
99
139
  # doesn't seem to recover.
100
- return success if content_type == XML_CONTENT_TYPE && !doc_valid?(doc)
140
+ return Helpers::HarvestStatus::INGEST_ERR_INVALID_DOC if content_type == XML_CONTENT_TYPE && !doc_valid?(doc)
101
141
 
102
142
  doc_serialized = get_serialized_doc(doc, content_type)
103
143
 
@@ -105,13 +145,18 @@ module SearchSolrTools
105
145
  begin
106
146
  RestClient.post(url, doc_serialized, content_type: content_type) do |response, _request, _result|
107
147
  success = response.code == 200
108
- puts "Error for #{doc_serialized}\n\n response: #{response.body}" unless success
148
+ unless success
149
+ puts "Error for #{doc_serialized}\n\n response: #{response.body}"
150
+ status = Helpers::HarvestStatus::INGEST_ERR_SOLR_ERROR
151
+ end
109
152
  end
110
153
  rescue => e
154
+ # TODO Need to provide more detail re: this failure so we know whether to
155
+ # exit the job with a status != 0
111
156
  puts "Rest exception while POSTing to Solr: #{e}, for doc: #{doc_serialized}"
157
+ status = Helpers::HarvestStatus::INGEST_ERR_SOLR_ERROR
112
158
  end
113
-
114
- success
159
+ status
115
160
  end
116
161
 
117
162
  def get_serialized_doc(doc, content_type)
@@ -124,7 +169,7 @@ module SearchSolrTools
124
169
  end
125
170
  end
126
171
 
127
- # Get results from some ISO end point specified in the query string
172
+ # Get results from an end point specified in the request_url
128
173
  def get_results(request_url, metadata_path, content_type = 'application/xml')
129
174
  timeout = 300
130
175
  retries_left = 3
@@ -140,6 +185,9 @@ module SearchSolrTools
140
185
 
141
186
  retry if retries_left > 0
142
187
 
188
+ # TODO - Do we really need this "die_on_failure" anymore? The empty return
189
+ # will cause the "No Documents" error to be thrown in the harvester class
190
+ # now, so it will pretty much always "die on failure"
143
191
  raise e if @die_on_failure
144
192
  return
145
193
  end
@@ -3,6 +3,7 @@ require 'rest-client'
3
3
 
4
4
  require 'search_solr_tools'
5
5
 
6
+
6
7
  module SearchSolrTools
7
8
  module Harvesters
8
9
  # Harvests data from NSIDC OAI and inserts it into Solr after it has been translated
@@ -13,6 +14,17 @@ module SearchSolrTools
13
14
  Helpers::FacetConfiguration.import_bin_configuration(env)
14
15
  end
15
16
 
17
+ def ping_source
18
+ begin
19
+ RestClient.options(nsidc_json_url) do |response, _request, _result|
20
+ return response.code == 200
21
+ end
22
+ rescue => e
23
+ puts "Error trying to get options for #{nsidc_json_url} (ping)"
24
+ end
25
+ false
26
+ end
27
+
16
28
  def harvest_and_delete
17
29
  puts "Running harvest of NSIDC catalog from #{nsidc_json_url}"
18
30
  super(method(:harvest_nsidc_json_into_solr), "data_centers:\"#{Helpers::SolrFormat::DATA_CENTER_NAMES[:NSIDC][:long_name]}\"")
@@ -22,8 +34,21 @@ module SearchSolrTools
22
34
  # this is the main entry point for the class
23
35
  def harvest_nsidc_json_into_solr
24
36
  result = docs_with_translated_entries_from_nsidc
25
- insert_solr_docs result[:add_docs], Base::JSON_CONTENT_TYPE
26
- fail 'Failed to harvest and insert some authoritative IDs' if result[:failure_ids].length > 0
37
+
38
+ status = insert_solr_docs result[:add_docs], Base::JSON_CONTENT_TYPE
39
+
40
+ status.record_document_status('harvest', Helpers::HarvestStatus::HARVEST_NO_DOCS) if result[:num_docs] == 0
41
+ status.record_multiple_document_status(result[:failure_ids],
42
+ Helpers::HarvestStatus::HARVEST_FAILURE) if result[:failure_ids].length > 0
43
+
44
+ raise Errors::HarvestError, status unless status.ok?
45
+ rescue Errors::HarvestError => e
46
+ raise e
47
+ rescue StandardError => e
48
+ puts "An unexpected exception occurred while trying to harvest or insert: #{e}"
49
+ puts e.backtrace
50
+ status = Helpers::HarvestStatus.new(Helpers::HarvestStatus::OTHER_ERROR => e)
51
+ raise Errors::HarvestError, status
27
52
  end
28
53
 
29
54
  def nsidc_json_url
@@ -33,7 +58,7 @@ module SearchSolrTools
33
58
  def result_ids_from_nsidc
34
59
  url = SolrEnvironments[@environment][:nsidc_dataset_metadata_url] +
35
60
  SolrEnvironments[@environment][:nsidc_oai_identifiers_url]
36
- get_results url, '//xmlns:identifier'
61
+ get_results(url, '//xmlns:identifier') || []
37
62
  end
38
63
 
39
64
  # Fetch a JSON representation of a dataset's metadata
@@ -48,7 +73,8 @@ module SearchSolrTools
48
73
  docs = []
49
74
  failure_ids = []
50
75
 
51
- result_ids_from_nsidc.each do |r|
76
+ all_docs = result_ids_from_nsidc
77
+ all_docs.each do |r|
52
78
  # Each result looks like:
53
79
  # oai:nsidc.org/AE_L2A
54
80
  id = r.text.split('/').last
@@ -60,7 +86,7 @@ module SearchSolrTools
60
86
  end
61
87
  end
62
88
 
63
- { add_docs: docs, failure_ids: failure_ids }
89
+ { num_docs: all_docs.size, add_docs: docs, failure_ids: failure_ids }
64
90
  end
65
91
  end
66
92
  end
@@ -0,0 +1,66 @@
1
+ module SearchSolrTools
2
+ module Helpers
3
+ class HarvestStatus
4
+
5
+ INGEST_OK = :ok
6
+ HARVEST_NO_DOCS = :harvest_none
7
+ HARVEST_FAILURE = :harvest_fail
8
+ INGEST_ERR_INVALID_DOC = :invalid
9
+ INGEST_ERR_SOLR_ERROR = :solr_error
10
+ OTHER_ERROR = :other
11
+ PING_SOLR = :ping_solr # used for initialize only
12
+ PING_SOURCE = :ping_source # used for initialize only
13
+
14
+ ERROR_STATUS = [HARVEST_NO_DOCS, HARVEST_FAILURE, INGEST_ERR_INVALID_DOC, INGEST_ERR_SOLR_ERROR, OTHER_ERROR]
15
+
16
+ # init_info is an optional hash that contains the various status keys and the documents to
17
+ # associate with them
18
+ def initialize(init_info={})
19
+ @status = { INGEST_OK => [] }
20
+ @ping_solr = true
21
+ @ping_source = true
22
+ ERROR_STATUS.each { |s| @status[s] = [] }
23
+
24
+ init_info.each do |key, docs|
25
+ @status[key] = docs if @status.include? key
26
+ end
27
+
28
+ @ping_solr = init_info[PING_SOLR] if init_info.include? PING_SOLR
29
+ @ping_source = init_info[PING_SOURCE] if init_info.include? PING_SOURCE
30
+ end
31
+
32
+ def record_multiple_document_status(documents, doc_status)
33
+ documents.each { |d| record_document_status d, doc_status }
34
+ end
35
+
36
+ def record_document_status(document, doc_status)
37
+ @status[doc_status] << document
38
+ end
39
+
40
+ def ping_solr=(newval)
41
+ @ping_solr = newval
42
+ end
43
+
44
+ def ping_source=(newval)
45
+ @ping_source = newval
46
+ end
47
+
48
+ def ok?
49
+ ERROR_STATUS.each { |s| return false unless @status[s].empty? }
50
+ @ping_solr && @ping_source
51
+ end
52
+
53
+ def ping_solr
54
+ @ping_solr
55
+ end
56
+
57
+ def ping_source
58
+ @ping_source
59
+ end
60
+
61
+ def documents_with_status(doc_status)
62
+ @status[doc_status]
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,3 +1,3 @@
1
1
  module SearchSolrTools
2
- VERSION = '5.0.1.release.1'
2
+ VERSION = '5.1.0.pre.2'
3
3
  end
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
16
16
  metadata into a working solr instance.
17
17
  EOF
18
18
  spec.homepage = 'https://github.com/nsidc/search-solr-tools'
19
- spec.license = 'GNU GPL Version 3'
19
+ spec.license = 'GPL-3.0-or-later'
20
20
 
21
21
  spec.files = `git ls-files -z #{gem_files}`.split("\x0")
22
22
  spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: search_solr_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.1
4
+ version: 5.1.0.pre.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Chalstrom
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2020-07-02 00:00:00.000000000 Z
17
+ date: 2020-07-22 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: ffi-geos
@@ -292,6 +292,7 @@ files:
292
292
  - lib/search_solr_tools.rb
293
293
  - lib/search_solr_tools/config/environments.rb
294
294
  - lib/search_solr_tools/config/environments.yaml
295
+ - lib/search_solr_tools/errors/harvest_error.rb
295
296
  - lib/search_solr_tools/harvesters/adc.rb
296
297
  - lib/search_solr_tools/harvesters/ade_auto_suggest.rb
297
298
  - lib/search_solr_tools/harvesters/auto_suggest.rb
@@ -317,6 +318,7 @@ files:
317
318
  - lib/search_solr_tools/helpers/csw_iso_query_builder.rb
318
319
  - lib/search_solr_tools/helpers/data_one_format.rb
319
320
  - lib/search_solr_tools/helpers/facet_configuration.rb
321
+ - lib/search_solr_tools/helpers/harvest_status.rb
320
322
  - lib/search_solr_tools/helpers/iso_namespaces.rb
321
323
  - lib/search_solr_tools/helpers/iso_to_solr.rb
322
324
  - lib/search_solr_tools/helpers/iso_to_solr_format.rb
@@ -349,7 +351,7 @@ files:
349
351
  - search_solr_tools.gemspec
350
352
  homepage: https://github.com/nsidc/search-solr-tools
351
353
  licenses:
352
- - GNU GPL Version 3
354
+ - GPL-3.0-or-later
353
355
  metadata: {}
354
356
  post_install_message:
355
357
  rdoc_options: []
@@ -362,9 +364,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
362
364
  version: 2.6.5
363
365
  required_rubygems_version: !ruby/object:Gem::Requirement
364
366
  requirements:
365
- - - ">="
367
+ - - ">"
366
368
  - !ruby/object:Gem::Version
367
- version: '0'
369
+ version: 1.3.1
368
370
  requirements: []
369
371
  rubygems_version: 3.0.8
370
372
  signing_key: