search_solr_tools 5.0.1 → 5.1.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
2
  SHA256:
3
- metadata.gz: 763cb91da974c8cfa5841996b861f5a0492d950d3abf39fd62813af3a521ce22
4
- data.tar.gz: d1d8ea0232c02f91f739baae6387a1ca71a03030962f0919904d03635b2d7ba2
3
+ metadata.gz: a961c7f8cdb3a126f31ba685db351337dda8816f64de94b82aad774f53b49a0c
4
+ data.tar.gz: bcadb76963b19f66567c3e5a233dd599a66d642073eb5c043b3fc5653ce2502f
5
5
  SHA512:
6
- metadata.gz: 7c4bc5946b0a19f0634a28acfc6ff2282098ad3a730fb1060c4360f1a25a10edc78278c4ea123da688a4eeeaf62887ef6d86ec2ca24bebfd51f08783926d1681
7
- data.tar.gz: 248141e1bc29f26b60795b1d4f73f9dda804ddbf1841ffbc490ca7690fe84fb2d1fb5b501c3f8df23cd8c9c11efd7dd66b65e0394114005f5e22c9b81b002781
6
+ metadata.gz: 1a238ac9143e968252c4f37474c99ed38a6920160f9f3d8ba8753b72848dbf7152ba0bc0b142298141eae6693102481a34f20d7c461e869b1a1606b7a3fcb471
7
+ data.tar.gz: 0ca3f51c62c0683d58652928ea2bf8a09987cee68d8af691ee523186e1d3ce7dc0f4bec0e294cdb82206eb8ebb5d2b6ad6085bed651b6f0944f979cecb0875bb
@@ -1,3 +1,11 @@
1
+ ## v5.1.0 (2020-07-23)
2
+
3
+ - Added a CLI method to "ping" the Solr and Source servers for a given
4
+ data center.
5
+ - Added a CLI method "errcode" to get information about the various
6
+ error codes that may be returned during harvest
7
+ - Updated the CLI harvest to return more useful error codes on failure.
8
+
1
9
  ## v5.0.1 (2020-07-02)
2
10
 
3
11
  - 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 CODE', 'Print all exit codes bundled in CODE. Omit CODE to print 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,88 @@
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
+ PING_ERRCODE_MAP = {
23
+ 'ping_solr' => ERRCODE_SOLR_PING,
24
+ 'ping_source' => ERRCODE_SOURCE_PING,
25
+ }
26
+
27
+ STATUS_ERRCODE_MAP = {
28
+ Helpers::HarvestStatus::HARVEST_NO_DOCS => ERRCODE_SOURCE_NO_RESULTS,
29
+ Helpers::HarvestStatus::HARVEST_FAILURE => ERRCODE_SOURCE_HARVEST_ERROR,
30
+ Helpers::HarvestStatus::INGEST_ERR_INVALID_DOC => ERRCODE_DOCUMENT_INVALID,
31
+ Helpers::HarvestStatus::INGEST_ERR_SOLR_ERROR => ERRCODE_INGEST_ERROR,
32
+ Helpers::HarvestStatus::OTHER_ERROR => ERRCODE_OTHER
33
+ }.freeze
34
+
35
+ # If code is -1, it means display all error codes
36
+ def self.describe_exit_code(code = -1)
37
+ code = code.to_i
38
+ code_list = []
39
+
40
+ # Loop through all bit-flag values
41
+ [128, 64, 32, 16, 8, 4, 2, 1].each do |k|
42
+ if code >= k || code == -1
43
+ code_list.prepend k
44
+ code -= k unless code == -1
45
+ end
46
+ end
47
+
48
+ codes = {}
49
+ code_list.each do |k|
50
+ next if code == -1 && !ERRCODE_DESC.keys.include?(k) # skip INVALID CODE if showing all codes
51
+ codes[k] = ERRCODE_DESC.keys.include?(k) ? ERRCODE_DESC[k] : 'INVALID CODE NUMBER'
52
+ end
53
+
54
+ codes
55
+ end
56
+
57
+ def initialize(status, message=nil)
58
+ @status_data = status
59
+ @other_message = message
60
+ end
61
+
62
+ def exit_code
63
+ if @status_data.nil?
64
+ puts "OTHER ERROR REPORTED: #{@other_message}"
65
+ return ERRCODE_OTHER
66
+ end
67
+
68
+ puts "EXIT CODE STATUS:\n#{@status_data.status}"
69
+
70
+ code = 0
71
+ code += ERRCODE_SOLR_PING unless @status_data.ping_solr
72
+ code += ERRCODE_SOURCE_PING unless @status_data.ping_source
73
+ code += ERRCODE_SOURCE_NO_RESULTS if @status_data.status[Helpers::HarvestStatus::HARVEST_NO_DOCS] > 0
74
+ code += ERRCODE_SOURCE_HARVEST_ERROR if @status_data.status[Helpers::HarvestStatus::HARVEST_FAILURE] > 0
75
+ code += ERRCODE_DOCUMENT_INVALID if @status_data.status[Helpers::HarvestStatus::INGEST_ERR_INVALID_DOC] > 0
76
+ code += ERRCODE_INGEST_ERROR if @status_data.status[Helpers::HarvestStatus::INGEST_ERR_SOLR_ERROR] > 0
77
+
78
+ code = ERRCODE_OTHER if code == 0
79
+
80
+ code
81
+ end
82
+
83
+ def message
84
+ self.class.describe_exit_code(exit_code).map{|c,v| v}.join("\n")
85
+ end
86
+ end
87
+ end
88
+ 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 data center. 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)
121
+ status.record_status 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,22 @@ 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_status(Helpers::HarvestStatus::HARVEST_NO_DOCS) if result[:num_docs] == 0
41
+
42
+ # Record the number of harvest failures; note that if this is 0, thats OK, the status will stay at 0
43
+ status.record_status(Helpers::HarvestStatus::HARVEST_FAILURE, result[:failure_ids].length)
44
+
45
+ raise Errors::HarvestError, status unless status.ok?
46
+ rescue Errors::HarvestError => e
47
+ raise e
48
+ rescue StandardError => e
49
+ puts "An unexpected exception occurred while trying to harvest or insert: #{e}"
50
+ puts e.backtrace
51
+ status = Helpers::HarvestStatus.new(Helpers::HarvestStatus::OTHER_ERROR => e)
52
+ raise Errors::HarvestError, status
27
53
  end
28
54
 
29
55
  def nsidc_json_url
@@ -33,7 +59,7 @@ module SearchSolrTools
33
59
  def result_ids_from_nsidc
34
60
  url = SolrEnvironments[@environment][:nsidc_dataset_metadata_url] +
35
61
  SolrEnvironments[@environment][:nsidc_oai_identifiers_url]
36
- get_results url, '//xmlns:identifier'
62
+ get_results(url, '//xmlns:identifier') || []
37
63
  end
38
64
 
39
65
  # Fetch a JSON representation of a dataset's metadata
@@ -48,7 +74,8 @@ module SearchSolrTools
48
74
  docs = []
49
75
  failure_ids = []
50
76
 
51
- result_ids_from_nsidc.each do |r|
77
+ all_docs = result_ids_from_nsidc
78
+ all_docs.each do |r|
52
79
  # Each result looks like:
53
80
  # oai:nsidc.org/AE_L2A
54
81
  id = r.text.split('/').last
@@ -60,7 +87,7 @@ module SearchSolrTools
60
87
  end
61
88
  end
62
89
 
63
- { add_docs: docs, failure_ids: failure_ids }
90
+ { num_docs: all_docs.size, add_docs: docs, failure_ids: failure_ids }
64
91
  end
65
92
  end
66
93
  end
@@ -0,0 +1,44 @@
1
+ module SearchSolrTools
2
+ module Helpers
3
+ class HarvestStatus
4
+ INGEST_OK = :ok
5
+ HARVEST_NO_DOCS = :harvest_none
6
+ HARVEST_FAILURE = :harvest_fail
7
+ INGEST_ERR_INVALID_DOC = :invalid
8
+ INGEST_ERR_SOLR_ERROR = :solr_error
9
+ OTHER_ERROR = :other
10
+ PING_SOLR = :ping_solr # used for initialize only
11
+ PING_SOURCE = :ping_source # used for initialize only
12
+
13
+ ERROR_STATUS = [HARVEST_NO_DOCS, HARVEST_FAILURE, INGEST_ERR_INVALID_DOC, INGEST_ERR_SOLR_ERROR, OTHER_ERROR]
14
+
15
+ attr_reader :status, :ping_solr, :ping_source
16
+ attr_writer :ping_solr, :ping_source
17
+
18
+ # init_info is an optional hash that contains the various status keys and the documents to
19
+ # associate with them
20
+ def initialize(init_info={})
21
+ @status = { INGEST_OK => 0 }
22
+ @ping_solr = true
23
+ @ping_source = true
24
+ ERROR_STATUS.each { |s| @status[s] = 0 }
25
+
26
+ init_info.each do |key, count|
27
+ @status[key] = count if @status.include? key
28
+ end
29
+
30
+ @ping_solr = init_info[PING_SOLR] if init_info.include? PING_SOLR
31
+ @ping_source = init_info[PING_SOURCE] if init_info.include? PING_SOURCE
32
+ end
33
+
34
+ def record_status(status, count = 1)
35
+ @status[status] += count
36
+ end
37
+
38
+ def ok?
39
+ ERROR_STATUS.each { |s| return false unless @status[s] == 0 }
40
+ @ping_solr && @ping_source
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,3 +1,3 @@
1
1
  module SearchSolrTools
2
- VERSION = '5.0.1.release.1'
2
+ VERSION = '5.2.0'
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
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-23 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: []