bulkrax 5.5.1 → 6.0.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 +4 -4
- data/app/controllers/bulkrax/importers_controller.rb +1 -1
- data/app/factories/bulkrax/object_factory.rb +4 -8
- data/app/jobs/bulkrax/create_relationships_job.rb +1 -1
- data/app/jobs/bulkrax/delete_job.rb +1 -1
- data/app/jobs/bulkrax/download_cloud_file_job.rb +1 -1
- data/app/jobs/bulkrax/import_collection_job.rb +1 -1
- data/app/jobs/bulkrax/import_file_set_job.rb +1 -1
- data/app/jobs/bulkrax/import_work_job.rb +1 -1
- data/app/jobs/bulkrax/importer_job.rb +1 -1
- data/app/models/concerns/bulkrax/import_behavior.rb +1 -0
- data/app/parsers/bulkrax/application_parser.rb +7 -0
- data/lib/bulkrax/version.rb +1 -1
- data/lib/bulkrax.rb +198 -207
- data/lib/generators/bulkrax/templates/config/initializers/bulkrax.rb +1 -1
- data/lib/tasks/bulkrax_tasks.rake +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27625a6224b5a9a1f395e6e0ef8b7169fdfcf497b2fcd4268b760ed6d1c0444a
|
4
|
+
data.tar.gz: 2bdaba078e12824c62afb300ecf054d9299705b735acd552a86af3296e7e4599
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a5b037670580f6ae08a0a7cb810a4d11020d61baeeabe53aa17540767ae36385c72b0b3b1d953a73bd5a7a7bb7c979182db7b6c98f588fe362ae955b1a1c32ab
|
7
|
+
data.tar.gz: 7948683559e6ba2b5c1bc221ebcc6f5b10b674cf014baa1ff355baa7cfffc487148a701aa198572777c6a19457b13969156200ea02b8c74b79030a70bef6ddc9
|
@@ -28,15 +28,16 @@ module Bulkrax
|
|
28
28
|
class_attribute :transformation_removes_blank_hash_values, default: false
|
29
29
|
|
30
30
|
define_model_callbacks :save, :create
|
31
|
-
attr_reader :attributes, :object, :source_identifier_value, :klass, :replace_files, :update_files, :work_identifier, :related_parents_parsed_mapping, :importer_run_id
|
31
|
+
attr_reader :attributes, :object, :source_identifier_value, :klass, :replace_files, :update_files, :work_identifier, :work_identifier_search_field, :related_parents_parsed_mapping, :importer_run_id
|
32
32
|
|
33
33
|
# rubocop:disable Metrics/ParameterLists
|
34
|
-
def initialize(attributes:, source_identifier_value:, work_identifier:, related_parents_parsed_mapping: nil, replace_files: false, user: nil, klass: nil, importer_run_id: nil, update_files: false)
|
34
|
+
def initialize(attributes:, source_identifier_value:, work_identifier:, work_identifier_search_field:, related_parents_parsed_mapping: nil, replace_files: false, user: nil, klass: nil, importer_run_id: nil, update_files: false)
|
35
35
|
@attributes = ActiveSupport::HashWithIndifferentAccess.new(attributes)
|
36
36
|
@replace_files = replace_files
|
37
37
|
@update_files = update_files
|
38
38
|
@user = user || User.batch_user
|
39
39
|
@work_identifier = work_identifier
|
40
|
+
@work_identifier_search_field = work_identifier_search_field
|
40
41
|
@related_parents_parsed_mapping = related_parents_parsed_mapping
|
41
42
|
@source_identifier_value = source_identifier_value
|
42
43
|
@klass = klass || Bulkrax.default_work_type.constantize
|
@@ -103,12 +104,7 @@ module Bulkrax
|
|
103
104
|
end
|
104
105
|
|
105
106
|
def search_by_identifier
|
106
|
-
|
107
|
-
# ref: https://github.com/samvera-labs/bulkrax/issues/866
|
108
|
-
# ref:https://github.com/samvera-labs/bulkrax/issues/867
|
109
|
-
# work_index = ::ActiveFedora.index_field_mapper.solr_name(work_identifier, :facetable)
|
110
|
-
work_index = work_identifier
|
111
|
-
query = { work_index =>
|
107
|
+
query = { work_identifier_search_field =>
|
112
108
|
source_identifier_value }
|
113
109
|
# Query can return partial matches (something6 matches both something6 and something68)
|
114
110
|
# so we need to weed out any that are not the correct full match. But other items might be
|
@@ -40,7 +40,7 @@ module Bulkrax
|
|
40
40
|
|
41
41
|
include DynamicRecordLookup
|
42
42
|
|
43
|
-
queue_as
|
43
|
+
queue_as :import
|
44
44
|
|
45
45
|
# @param parent_identifier [String] Work/Collection ID or Bulkrax::Entry source_identifiers
|
46
46
|
# @param importer_run [Bulkrax::ImporterRun] current importer run (needed to properly update counters)
|
@@ -179,6 +179,7 @@ module Bulkrax
|
|
179
179
|
@factory ||= of.new(attributes: self.parsed_metadata,
|
180
180
|
source_identifier_value: identifier,
|
181
181
|
work_identifier: parser.work_identifier,
|
182
|
+
work_identifier_search_field: parser.work_identifier_search_field,
|
182
183
|
related_parents_parsed_mapping: parser.related_parents_parsed_mapping,
|
183
184
|
replace_files: replace_files,
|
184
185
|
user: user,
|
@@ -81,6 +81,13 @@ module Bulkrax
|
|
81
81
|
@work_identifier ||= get_field_mapping_hash_for('source_identifier')&.keys&.first&.to_sym || :source
|
82
82
|
end
|
83
83
|
|
84
|
+
# @return [Symbol] the solr property of the source_identifier. Used for searching.
|
85
|
+
# defaults to work_identifier value + "_sim"
|
86
|
+
# @see #work_identifier
|
87
|
+
def work_identifier_search_field
|
88
|
+
@work_identifier_search_field ||= get_field_mapping_hash_for('source_identifier')&.values&.first&.[]('search_field')&.first&.to_s || "#{work_identifier}_sim"
|
89
|
+
end
|
90
|
+
|
84
91
|
# @return [String]
|
85
92
|
def generated_metadata_mapping
|
86
93
|
@generated_metadata_mapping ||= 'generated'
|
data/lib/bulkrax/version.rb
CHANGED
data/lib/bulkrax.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
require "bulkrax/version"
|
4
|
+
require "bulkrax/engine"
|
5
|
+
require 'active_support/all'
|
6
6
|
|
7
|
-
|
7
|
+
# rubocop:disable Metrics/ModuleLength
|
8
8
|
module Bulkrax
|
9
|
-
|
10
|
-
|
9
|
+
extend self # rubocop:disable Style/ModuleFunction
|
10
|
+
extend Forwardable
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
##
|
13
|
+
# @api public
|
14
14
|
class Configuration
|
15
15
|
attr_accessor :api_definition,
|
16
16
|
:curation_concerns,
|
@@ -35,15 +35,6 @@ module Bulkrax
|
|
35
35
|
:reserved_properties,
|
36
36
|
:server_name
|
37
37
|
|
38
|
-
attr_writer :ingest_queue_name
|
39
|
-
##
|
40
|
-
# @return [String, Proc]
|
41
|
-
def ingest_queue_name
|
42
|
-
return @ingest_queue_name if @ingest_queue_name.present?
|
43
|
-
return Hyrax.config.ingest_queue_name if defined?(Hyrax)
|
44
|
-
:import
|
45
|
-
end
|
46
|
-
|
47
38
|
attr_writer :use_locking
|
48
39
|
|
49
40
|
def use_locking
|
@@ -54,61 +45,61 @@ module Bulkrax
|
|
54
45
|
alias use_locking? use_locking
|
55
46
|
end
|
56
47
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
48
|
+
def config
|
49
|
+
@config ||= Configuration.new
|
50
|
+
yield @config if block_given?
|
51
|
+
@config
|
52
|
+
end
|
53
|
+
alias setup config
|
63
54
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
55
|
+
def_delegators :@config,
|
56
|
+
:api_definition,
|
57
|
+
:api_definition=,
|
58
|
+
:curation_concerns,
|
59
|
+
:curation_concerns=,
|
60
|
+
:default_field_mapping,
|
61
|
+
:default_field_mapping=,
|
62
|
+
:default_work_type,
|
63
|
+
:default_work_type=,
|
64
|
+
:export_path,
|
65
|
+
:export_path=,
|
66
|
+
:field_mappings,
|
67
|
+
:field_mappings=,
|
68
|
+
:file_model_class,
|
69
|
+
:file_model_class=,
|
70
|
+
:fill_in_blank_source_identifiers,
|
71
|
+
:fill_in_blank_source_identifiers=,
|
72
|
+
:generated_metadata_mapping,
|
73
|
+
:generated_metadata_mapping=,
|
74
|
+
:import_path,
|
75
|
+
:import_path=,
|
76
|
+
:multi_value_element_join_on,
|
77
|
+
:multi_value_element_join_on=,
|
78
|
+
:multi_value_element_split_on,
|
79
|
+
:multi_value_element_split_on=,
|
80
|
+
:object_factory,
|
81
|
+
:object_factory=,
|
82
|
+
:parsers,
|
83
|
+
:parsers=,
|
84
|
+
:qa_controlled_properties,
|
85
|
+
:qa_controlled_properties=,
|
86
|
+
:related_children_field_mapping,
|
87
|
+
:related_children_field_mapping=,
|
88
|
+
:related_parents_field_mapping,
|
89
|
+
:related_parents_field_mapping=,
|
90
|
+
:relationship_job_class,
|
91
|
+
:relationship_job_class=,
|
92
|
+
:removed_image_path,
|
93
|
+
:removed_image_path=,
|
94
|
+
:required_elements,
|
95
|
+
:required_elements=,
|
96
|
+
:reserved_properties,
|
97
|
+
:reserved_properties=,
|
98
|
+
:server_name,
|
99
|
+
:server_name=,
|
100
|
+
:use_locking,
|
101
|
+
:use_locking=,
|
102
|
+
:use_locking?
|
112
103
|
|
113
104
|
config do |conf|
|
114
105
|
conf.parsers = [
|
@@ -147,149 +138,149 @@ module Bulkrax
|
|
147
138
|
# Based on Hyrax CoreMetadata && BasicMetadata
|
148
139
|
# Override at application level to change
|
149
140
|
conf.field_mappings = {
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
141
|
+
"Bulkrax::OaiDcParser" => {
|
142
|
+
"contributor" => { from: ["contributor"] },
|
143
|
+
# no appropriate mapping for coverage (based_near needs id)
|
144
|
+
# ""=>{:from=>["coverage"]},
|
145
|
+
"creator" => { from: ["creator"] },
|
146
|
+
"date_created" => { from: ["date"] },
|
147
|
+
"description" => { from: ["description"] },
|
148
|
+
# no appropriate mapping for format
|
149
|
+
# ""=>{:from=>["format"]},
|
150
|
+
"identifier" => { from: ["identifier"] },
|
151
|
+
"language" => { from: ["language"], parsed: true },
|
152
|
+
"publisher" => { from: ["publisher"] },
|
153
|
+
"related_url" => { from: ["relation"] },
|
154
|
+
"rights_statement" => { from: ["rights"] },
|
155
|
+
"source" => { from: ["source"] },
|
156
|
+
"subject" => { from: ["subject"], parsed: true },
|
157
|
+
"title" => { from: ["title"] },
|
158
|
+
"resource_type" => { from: ["type"], parsed: true },
|
159
|
+
"remote_files" => { from: ["thumbnail_url"], parsed: true }
|
169
160
|
},
|
170
|
-
|
171
|
-
|
172
|
-
|
161
|
+
"Bulkrax::OaiQualifiedDcParser" => {
|
162
|
+
"abstract" => { from: ["abstract"] },
|
163
|
+
"alternative_title" => { from: ["alternative"] },
|
173
164
|
"bibliographic_citation" => { from: ["bibliographicCitation"] },
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
165
|
+
"contributor" => { from: ["contributor"] },
|
166
|
+
"creator" => { from: ["creator"] },
|
167
|
+
"date_created" => { from: ["created"] },
|
168
|
+
"description" => { from: ["description"] },
|
169
|
+
"language" => { from: ["language"] },
|
170
|
+
"license" => { from: ["license"] },
|
171
|
+
"publisher" => { from: ["publisher"] },
|
172
|
+
"related_url" => { from: ["relation"] },
|
173
|
+
"rights_holder" => { from: ["rightsHolder"] },
|
174
|
+
"rights_statement" => { from: ["rights"] },
|
175
|
+
"source" => { from: ["source"] },
|
176
|
+
"subject" => { from: ["subject"], parsed: true },
|
177
|
+
"title" => { from: ["title"] },
|
178
|
+
"resource_type" => { from: ["type"], parsed: true },
|
179
|
+
"remote_files" => { from: ["thumbnail_url"], parsed: true }
|
180
|
+
},
|
181
|
+
# When empty, a default_field_mapping will be generated
|
182
|
+
"Bulkrax::CsvParser" => {},
|
183
|
+
'Bulkrax::BagitParser' => {},
|
184
|
+
'Bulkrax::XmlParser' => {}
|
185
|
+
}
|
195
186
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
187
|
+
# Lambda to set the default field mapping
|
188
|
+
conf.default_field_mapping = lambda do |field|
|
189
|
+
return if field.blank?
|
190
|
+
{
|
191
|
+
field.to_s =>
|
192
|
+
{
|
193
|
+
from: [field.to_s],
|
194
|
+
split: false,
|
195
|
+
parsed: Bulkrax::ApplicationMatcher.method_defined?("parse_#{field}"),
|
196
|
+
if: nil,
|
197
|
+
excluded: false
|
198
|
+
}
|
199
|
+
}
|
200
|
+
end
|
210
201
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
202
|
+
# Properties that should not be used in imports. They are reserved for use by Hyrax.
|
203
|
+
conf.reserved_properties = %w[
|
204
|
+
create_date
|
205
|
+
modified_date
|
206
|
+
date_modified
|
207
|
+
date_uploaded
|
208
|
+
depositor
|
209
|
+
arkivo_checksum
|
210
|
+
has_model
|
211
|
+
head
|
212
|
+
label
|
213
|
+
import_url
|
214
|
+
on_behalf_of
|
215
|
+
proxy_depositor
|
216
|
+
owner
|
217
|
+
state
|
218
|
+
tail
|
219
|
+
original_url
|
220
|
+
relative_path
|
221
|
+
]
|
231
222
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
223
|
+
# List of Questioning Authority properties that are controlled via YAML files in
|
224
|
+
# the config/authorities/ directory. For example, the :rights_statement property
|
225
|
+
# is controlled by the active terms in config/authorities/rights_statements.yml
|
226
|
+
conf.qa_controlled_properties = %w[rights_statement license]
|
227
|
+
end
|
237
228
|
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
229
|
+
def api_definition
|
230
|
+
@api_definition ||= ActiveSupport::HashWithIndifferentAccess.new(
|
231
|
+
YAML.safe_load(
|
232
|
+
ERB.new(
|
233
|
+
File.read(Rails.root.join('config', 'bulkrax_api.yml'))
|
234
|
+
).result
|
235
|
+
)
|
236
|
+
)
|
237
|
+
end
|
247
238
|
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
239
|
+
DEFAULT_MULTI_VALUE_ELEMENT_JOIN_ON = ' | '
|
240
|
+
# Specify the delimiter for joining an attribute's multi-value array into a string.
|
241
|
+
#
|
242
|
+
# @note the specific delimiter should likely be present in the multi_value_element_split_on
|
243
|
+
# expression.
|
244
|
+
def multi_value_element_join_on
|
245
|
+
@multi_value_element_join_on ||= DEFAULT_MULTI_VALUE_ELEMENT_JOIN_ON
|
246
|
+
end
|
256
247
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
248
|
+
DEFAULT_MULTI_VALUE_ELEMENT_SPLIT_ON = /\s*[:;|]\s*/.freeze
|
249
|
+
# @return [RegexClass] the regular express to use to "split" an attribute's values. If set to
|
250
|
+
# `true` use the DEFAULT_MULTI_VALUE_ELEMENT_JOIN_ON.
|
251
|
+
#
|
252
|
+
# @note The "true" value is to preserve backwards compatibility.
|
253
|
+
# @see DEFAULT_MULTI_VALUE_ELEMENT_JOIN_ON
|
263
254
|
def multi_value_element_split_on
|
264
|
-
|
265
|
-
|
255
|
+
if @multi_value_element_join_on.is_a?(TrueClass)
|
256
|
+
DEFAULT_MULTI_VALUE_ELEMENT_SPLIT_ON
|
266
257
|
else
|
267
|
-
|
258
|
+
@multi_value_element_split_on ||= DEFAULT_MULTI_VALUE_ELEMENT_SPLIT_ON
|
268
259
|
end
|
269
260
|
end
|
270
261
|
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
262
|
+
# Responsible for stripping hidden characters from the given string.
|
263
|
+
#
|
264
|
+
# @param value [#to_s]
|
265
|
+
# @return [String] with hidden characters removed
|
266
|
+
#
|
267
|
+
# @see https://github.com/samvera-labs/bulkrax/issues/688
|
268
|
+
def normalize_string(value)
|
269
|
+
# Removing [Byte Order Mark (BOM)](https://en.wikipedia.org/wiki/Byte_order_mark)
|
270
|
+
value.to_s.delete("\xEF\xBB\xBF")
|
271
|
+
end
|
281
272
|
|
282
|
-
|
283
|
-
|
273
|
+
def fallback_user_for_importer_exporter_processing
|
274
|
+
return User.batch_user if defined?(Hyrax) && User.respond_to?(:batch_user)
|
284
275
|
|
285
|
-
|
286
|
-
|
276
|
+
raise "We have no fallback user available for Bulkrax.fallback_user_for_importer_exporter_processing"
|
277
|
+
end
|
287
278
|
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
279
|
+
# This class confirms to the Active::Support.serialize interface. It's job is to ensure that we
|
280
|
+
# don't have keys with the tricksy Byte Order Mark character.
|
281
|
+
#
|
282
|
+
# @see https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize
|
283
|
+
class NormalizedJson
|
293
284
|
def self.normalize_keys(hash)
|
294
285
|
return hash unless hash.respond_to?(:each_pair)
|
295
286
|
returning_value = {}
|
@@ -301,18 +292,18 @@ module Bulkrax
|
|
301
292
|
|
302
293
|
# When we write the serialized data to the database, we "dump" the value into that database
|
303
294
|
# column.
|
304
|
-
|
305
|
-
|
306
|
-
|
295
|
+
def self.dump(value)
|
296
|
+
JSON.dump(normalize_keys(value))
|
297
|
+
end
|
307
298
|
|
308
299
|
# When we load the serialized data from the database, we pass the database's value into "load"
|
309
300
|
# function.
|
310
301
|
#
|
311
302
|
# rubocop:disable Security/JSONLoad
|
312
|
-
|
313
|
-
|
314
|
-
|
303
|
+
def self.load(string)
|
304
|
+
normalize_keys(JSON.load(string))
|
305
|
+
end
|
315
306
|
# rubocop:enable Security/JSONLoad
|
316
|
-
|
307
|
+
end
|
317
308
|
end
|
318
|
-
|
309
|
+
# rubocop:disable Metrics/ModuleLength
|
@@ -47,7 +47,7 @@ Bulkrax.setup do |config|
|
|
47
47
|
# (For more info on importing relationships, see Bulkrax Wiki: https://github.com/samvera-labs/bulkrax/wiki/Configuring-Bulkrax#parent-child-relationship-field-mappings)
|
48
48
|
#
|
49
49
|
# # e.g. to add the required source_identifier field
|
50
|
-
# # config.field_mappings["Bulkrax::CsvParser"]["source_id"] = { from: ["old_source_id"], source_identifier: true
|
50
|
+
# # config.field_mappings["Bulkrax::CsvParser"]["source_id"] = { from: ["old_source_id"], source_identifier: true, search_field: 'source_id_sim' }
|
51
51
|
# If you want Bulkrax to fill in source_identifiers for you, see below
|
52
52
|
|
53
53
|
# To duplicate a set of mappings from one parser to another
|
@@ -124,7 +124,7 @@ namespace :bulkrax do
|
|
124
124
|
end
|
125
125
|
|
126
126
|
def make_new_exports
|
127
|
-
Bulkrax::Exporter.
|
127
|
+
Bulkrax::Exporter.find_each { |e| Bulkrax::ExporterJob.perform_later(e.id) }
|
128
128
|
rescue => e
|
129
129
|
puts "(#{e.message})"
|
130
130
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bulkrax
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Kaufman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|