bulkrax 5.0.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/bulkrax/entries_controller.rb +4 -2
  3. data/app/controllers/bulkrax/exporters_controller.rb +13 -9
  4. data/app/controllers/bulkrax/importers_controller.rb +10 -10
  5. data/app/helpers/bulkrax/application_helper.rb +1 -1
  6. data/app/helpers/bulkrax/importers_helper.rb +2 -2
  7. data/app/helpers/bulkrax/validation_helper.rb +4 -4
  8. data/app/jobs/bulkrax/create_relationships_job.rb +78 -59
  9. data/app/jobs/bulkrax/delete_job.rb +1 -1
  10. data/app/jobs/bulkrax/export_work_job.rb +2 -2
  11. data/app/jobs/bulkrax/import_file_set_job.rb +1 -1
  12. data/app/jobs/bulkrax/import_work_job.rb +20 -7
  13. data/app/jobs/bulkrax/importer_job.rb +2 -2
  14. data/app/jobs/bulkrax/schedule_relationships_job.rb +2 -1
  15. data/app/matchers/bulkrax/application_matcher.rb +1 -0
  16. data/app/models/bulkrax/csv_entry.rb +93 -24
  17. data/app/models/bulkrax/exporter.rb +18 -19
  18. data/app/models/bulkrax/importer.rb +5 -5
  19. data/app/models/bulkrax/importer_run.rb +6 -0
  20. data/app/models/bulkrax/oai_entry.rb +14 -2
  21. data/app/models/bulkrax/pending_relationship.rb +4 -0
  22. data/app/models/concerns/bulkrax/dynamic_record_lookup.rb +3 -1
  23. data/app/models/concerns/bulkrax/export_behavior.rb +6 -4
  24. data/app/models/concerns/bulkrax/has_matchers.rb +1 -0
  25. data/app/models/concerns/bulkrax/import_behavior.rb +6 -3
  26. data/app/models/concerns/bulkrax/importer_exporter_behavior.rb +9 -1
  27. data/app/models/concerns/bulkrax/status_info.rb +9 -4
  28. data/app/parsers/bulkrax/application_parser.rb +14 -16
  29. data/app/parsers/bulkrax/bagit_parser.rb +6 -17
  30. data/app/parsers/bulkrax/csv_parser.rb +43 -111
  31. data/app/parsers/bulkrax/oai_dc_parser.rb +2 -2
  32. data/app/parsers/bulkrax/parser_export_record_set.rb +281 -0
  33. data/app/parsers/bulkrax/xml_parser.rb +9 -5
  34. data/app/services/bulkrax/remove_relationships_for_importer.rb +4 -2
  35. data/app/views/bulkrax/entries/show.html.erb +1 -1
  36. data/app/views/bulkrax/exporters/_form.html.erb +60 -45
  37. data/app/views/bulkrax/exporters/edit.html.erb +1 -1
  38. data/app/views/bulkrax/exporters/index.html.erb +2 -2
  39. data/app/views/bulkrax/exporters/new.html.erb +1 -1
  40. data/app/views/bulkrax/exporters/show.html.erb +3 -3
  41. data/app/views/bulkrax/importers/_bagit_fields.html.erb +13 -12
  42. data/app/views/bulkrax/importers/_csv_fields.html.erb +13 -12
  43. data/app/views/bulkrax/importers/_form.html.erb +5 -5
  44. data/app/views/bulkrax/importers/_oai_fields.html.erb +12 -10
  45. data/app/views/bulkrax/importers/_xml_fields.html.erb +12 -11
  46. data/app/views/bulkrax/importers/show.html.erb +18 -16
  47. data/app/views/bulkrax/shared/_collection_entries_tab.html.erb +6 -6
  48. data/app/views/bulkrax/shared/_file_set_entries_tab.html.erb +6 -6
  49. data/app/views/bulkrax/shared/_work_entries_tab.html.erb +6 -6
  50. data/config/locales/bulkrax.en.yml +26 -0
  51. data/lib/bulkrax/entry_spec_helper.rb +190 -0
  52. data/lib/bulkrax/version.rb +1 -1
  53. data/lib/bulkrax.rb +124 -45
  54. data/lib/generators/bulkrax/templates/config/initializers/bulkrax.rb +1 -1
  55. data/lib/tasks/reset.rake +1 -1
  56. metadata +5 -3
@@ -0,0 +1,190 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'oai'
4
+ require 'xml/libxml'
5
+
6
+ module Bulkrax
7
+ ##
8
+ # The purpose of this module is to provide some testing facilities for those that include the
9
+ # Bulkrax gem in their application.
10
+ #
11
+ # This module came about through a desire to expose a quick means of vetting the accuracy of the
12
+ # different parsers.
13
+ module EntrySpecHelper
14
+ ##
15
+ # @api public
16
+ # @since v5.0.1
17
+ #
18
+ # The purpose of this method is encapsulate the logic of creating the appropriate Bulkrax::Entry
19
+ # object based on the given data, identifier, and parser_class_name.
20
+ #
21
+ # From that entry, you should be able to test how {Bulkrax::Entry#build_metadata} populates the
22
+ # {Bulkrax::Entry#parsed_metadata} variable. Other uses may emerge.
23
+ #
24
+ # @param data [Object] the data that we use to populate the raw metadata. Due to implementation
25
+ # details of each entry, the data will be of different formats.
26
+ #
27
+ # @param identifier [String, Integer] The identifier of the entry. This might also be found in
28
+ # the metadata of the entry, but for instantiation purposes we need this value.
29
+ # @param parser_class_name [String] The name of the parser class you're wanting to test.
30
+ # @param type [Sybmol] The type of entry (e.g. :entry, :collection, :file_set) for testing.
31
+ # @param options [Hash<Symbol,Object>] these are to be passed along into the instantiation of
32
+ # the various classes. See implementation details.
33
+ #
34
+ # @return [Bulkrax::Entry]
35
+ def self.entry_for(data:, identifier:, parser_class_name:, type: :entry, **options)
36
+ importer = importer_for(parser_class_name: parser_class_name, **options)
37
+ entry_type_method_name = ENTRY_TYPE_TO_METHOD_NAME_MAP.fetch(type)
38
+ entry_class = importer.parser.public_send(entry_type_method_name)
39
+
40
+ # Using an instance of the entry_class to dispatch to different
41
+ entry_for_dispatch = entry_class.new
42
+
43
+ # Using the {is_a?} test we get the benefit of inspecting an object's inheritance path
44
+ # (e.g. ancestry). The logic, as implemented, also provides a mechanism for folks in their
45
+ # applications to add a {class_name_entry_for}; something that I suspect isn't likely
46
+ # but given the wide variety of underlying needs I could see happening and I want to encourage
47
+ # patterned thinking to fold that different build method into this structure.
48
+ key = entry_class_to_symbol_map.keys.detect { |class_name| entry_for_dispatch.is_a?(class_name.constantize) }
49
+
50
+ # Yes, we'll raise an error if we didn't find a corresponding key. And that's okay.
51
+ symbol = entry_class_to_symbol_map.fetch(key)
52
+
53
+ send("build_#{symbol}_entry_for",
54
+ importer: importer,
55
+ identifier: identifier,
56
+ entry_class: entry_class,
57
+ data: data,
58
+ **options)
59
+ end
60
+
61
+ # @api public
62
+ #
63
+ # @param parser_class_name [String]
64
+ # @param parser_fields [Hash<String,Hash>]
65
+ #
66
+ # @return [Bulkrax::Exporter]
67
+ def self.exporter_for(parser_class_name:, parser_fields: {}, **options)
68
+ Bulkrax::Exporter.new(
69
+ name: options.fetch(:exporter_name, "Test importer for identifier"),
70
+ user: options.fetch(:exporter_user, User.new(email: "hello@world.com")),
71
+ limit: options.fetch(:exporter_limit, 1),
72
+ parser_klass: parser_class_name,
73
+ field_mapping: options.fetch(:exporter_field_mappings) { Bulkrax.field_mappings.fetch(parser_class_name) },
74
+ parser_fields: parser_fields
75
+ )
76
+ end
77
+
78
+ ENTRY_TYPE_TO_METHOD_NAME_MAP = {
79
+ entry: :entry_class,
80
+ collection: :collection_entry_class,
81
+ file_set: :file_set_entry_class
82
+ }.freeze
83
+
84
+ DEFAULT_ENTRY_CLASS_TO_SYMBOL_MAP = {
85
+ 'Bulkrax::OaiEntry' => :oai,
86
+ 'Bulkrax::XmlEntry' => :xml,
87
+ 'Bulkrax::CsvEntry' => :csv
88
+ }.freeze
89
+
90
+ # Present implementations of entry classes tend to inherit from the below listed class names.
91
+ # We're not looking to register all descendents of the {Bulkrax::Entry} class, but instead find
92
+ # the ancestor where there is significant deviation.
93
+ def self.entry_class_to_symbol_map
94
+ @entry_class_to_symbol_map || DEFAULT_ENTRY_CLASS_TO_SYMBOL_MAP
95
+ end
96
+
97
+ def self.entry_class_to_symbol_map=(value)
98
+ @entry_class_to_symbol_map = value
99
+ end
100
+
101
+ def self.importer_for(parser_class_name:, parser_fields: {}, **options)
102
+ # Ideally, we could pass in the field_mapping. However, there is logic that ignores the
103
+ # parser's field_mapping and directly asks for Bulkrax's field_mapping (e.g. model_mapping
104
+ # method).
105
+ Rails.logger.warn("You passed :importer_field_mapping as an option. This may not fully work as desired.") if options.key?(:importer_field_mapping)
106
+ Bulkrax::Importer.new(
107
+ name: options.fetch(:importer_name, "Test importer for identifier"),
108
+ admin_set_id: options.fetch(:importer_admin_set_id, "admin_set/default"),
109
+ user: options.fetch(:importer_user, User.new(email: "hello@world.com")),
110
+ limit: options.fetch(:importer_limits, 1),
111
+ parser_klass: parser_class_name,
112
+ field_mapping: options.fetch(:importer_field_mappings) { Bulkrax.field_mappings.fetch(parser_class_name) },
113
+ parser_fields: parser_fields
114
+ ).tap do |importer|
115
+ # Why are we saving the importer and a run? We might want to delve deeper into the call
116
+ # stack. See https://github.com/scientist-softserv/adventist-dl/pull/266
117
+ importer.save!
118
+ # Later on, we might to want a current run
119
+ importer.importer_runs.create!
120
+ end
121
+ end
122
+ private_class_method :importer_for
123
+
124
+ ##
125
+ # @api private
126
+ #
127
+ # @param data [Hash<Symbol,String>] we're expecting a hash with keys that are symbols and then
128
+ # values that are strings.
129
+ #
130
+ # @return [Bulkrax::CsvEntry]
131
+ #
132
+ # @note As a foible of this implementation, you'll need to include along a CSV to establish the
133
+ # columns that you'll parse (e.g. the first row
134
+ def self.build_csv_entry_for(importer:, data:, identifier:, entry_class:, **_options)
135
+ entry_class.new(
136
+ importerexporter: importer,
137
+ identifier: identifier,
138
+ raw_metadata: data
139
+ )
140
+ end
141
+
142
+ ##
143
+ # @api private
144
+ #
145
+ # @param data [String] we're expecting a string that is well-formed XML for OAI parsing.
146
+ #
147
+ # @return [Bulkrax::OaiEntry]
148
+ def self.build_oai_entry_for(importer:, data:, identifier:, entry_class:, **options)
149
+ # The raw record assumes we take the XML data, parse it and then send that to the
150
+ # OAI::GetRecordResponse object.
151
+ doc = XML::Parser.string(data)
152
+ raw_record = OAI::GetRecordResponse.new(doc.parse)
153
+
154
+ raw_metadata = {
155
+ importer.parser.source_identifier.to_s => identifier,
156
+ "data" => data,
157
+ "collections" => options.fetch(:raw_metadata_collections, []),
158
+ "children" => options.fetch(:raw_metadata_children, [])
159
+ }
160
+
161
+ entry_class.new(
162
+ raw_record: raw_record,
163
+ importerexporter: importer,
164
+ identifier: identifier,
165
+ raw_metadata: raw_metadata
166
+ )
167
+ end
168
+
169
+ ##
170
+ # @api private
171
+ #
172
+ # @param data [String] we're expecting a string that is well-formed XML.
173
+ #
174
+ # @return [Bulkrax::XmlEntry]
175
+ def self.build_xml_entry_for(importer:, data:, identifier:, entry_class:, **options)
176
+ raw_metadata = {
177
+ importer.parser.source_identifier.to_s => identifier,
178
+ "data" => data,
179
+ "collections" => options.fetch(:raw_metadata_collections, []),
180
+ "children" => options.fetch(:raw_metadata_children, [])
181
+ }
182
+
183
+ entry_class.new(
184
+ importerexporter: importer,
185
+ identifier: identifier,
186
+ raw_metadata: raw_metadata
187
+ )
188
+ end
189
+ end
190
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bulkrax
4
- VERSION = '5.0.0'
4
+ VERSION = '5.2.0'
5
5
  end
data/lib/bulkrax.rb CHANGED
@@ -6,31 +6,91 @@ require 'active_support/all'
6
6
 
7
7
  # rubocop:disable Metrics/ModuleLength
8
8
  module Bulkrax
9
- class << self
10
- # @todo Move from module attribute methods to a configuration class. With module attributes,
11
- # when we make a change we are polluting the global space. This means that our tests that
12
- # modify these config values are modifying global state. Which is not desirous, as it can
13
- # introduce unexpected flakey tests.
14
- mattr_accessor :api_definition,
15
- :default_field_mapping,
16
- :default_work_type,
17
- :export_path,
18
- :field_mappings,
19
- :fill_in_blank_source_identifiers,
20
- :generated_metadata_mapping,
21
- :import_path,
22
- :multi_value_element_join_on,
23
- :multi_value_element_split_on,
24
- :object_factory,
25
- :parsers,
26
- :qa_controlled_properties,
27
- :related_children_field_mapping,
28
- :related_parents_field_mapping,
29
- :removed_image_path,
30
- :reserved_properties,
31
- :server_name
32
-
33
- self.parsers = [
9
+ extend self # rubocop:disable Style/ModuleFunction
10
+ extend Forwardable
11
+
12
+ ##
13
+ # @api public
14
+ class Configuration
15
+ attr_accessor :api_definition,
16
+ :curation_concerns,
17
+ :default_field_mapping,
18
+ :default_work_type,
19
+ :export_path,
20
+ :field_mappings,
21
+ :file_model_class,
22
+ :fill_in_blank_source_identifiers,
23
+ :generated_metadata_mapping,
24
+ :import_path,
25
+ :multi_value_element_join_on,
26
+ :multi_value_element_split_on,
27
+ :object_factory,
28
+ :parsers,
29
+ :qa_controlled_properties,
30
+ :related_children_field_mapping,
31
+ :related_parents_field_mapping,
32
+ :relationship_job_class,
33
+ :removed_image_path,
34
+ :required_elements,
35
+ :reserved_properties,
36
+ :server_name
37
+ end
38
+
39
+ def config
40
+ @config ||= Configuration.new
41
+ yield @config if block_given?
42
+ @config
43
+ end
44
+ alias setup config
45
+
46
+ def_delegators :@config,
47
+ :api_definition,
48
+ :api_definition=,
49
+ :curation_concerns,
50
+ :curation_concerns=,
51
+ :default_field_mapping,
52
+ :default_field_mapping=,
53
+ :default_work_type,
54
+ :default_work_type=,
55
+ :export_path,
56
+ :export_path=,
57
+ :field_mappings,
58
+ :field_mappings=,
59
+ :file_model_class,
60
+ :file_model_class=,
61
+ :fill_in_blank_source_identifiers,
62
+ :fill_in_blank_source_identifiers=,
63
+ :generated_metadata_mapping,
64
+ :generated_metadata_mapping=,
65
+ :import_path,
66
+ :import_path=,
67
+ :multi_value_element_join_on,
68
+ :multi_value_element_join_on=,
69
+ :multi_value_element_split_on,
70
+ :multi_value_element_split_on=,
71
+ :object_factory,
72
+ :object_factory=,
73
+ :parsers,
74
+ :parsers=,
75
+ :qa_controlled_properties,
76
+ :qa_controlled_properties=,
77
+ :related_children_field_mapping,
78
+ :related_children_field_mapping=,
79
+ :related_parents_field_mapping,
80
+ :related_parents_field_mapping=,
81
+ :relationship_job_class,
82
+ :relationship_job_class=,
83
+ :removed_image_path,
84
+ :removed_image_path=,
85
+ :required_elements,
86
+ :required_elements=,
87
+ :reserved_properties,
88
+ :reserved_properties=,
89
+ :server_name,
90
+ :server_name=
91
+
92
+ config do |conf|
93
+ conf.parsers = [
34
94
  { name: "OAI - Dublin Core", class_name: "Bulkrax::OaiDcParser", partial: "oai_fields" },
35
95
  { name: "OAI - Qualified Dublin Core", class_name: "Bulkrax::OaiQualifiedDcParser", partial: "oai_fields" },
36
96
  { name: "CSV - Comma Separated Values", class_name: "Bulkrax::CsvParser", partial: "csv_fields" },
@@ -38,16 +98,34 @@ module Bulkrax
38
98
  { name: "XML", class_name: "Bulkrax::XmlParser", partial: "xml_fields" }
39
99
  ]
40
100
 
41
- self.import_path = Bulkrax.import_path || 'tmp/imports'
42
- self.export_path = Bulkrax.export_path || 'tmp/exports'
43
- self.removed_image_path = Bulkrax::Engine.root.join('spec', 'fixtures', 'removed.png').to_s
44
- self.server_name = 'bulkrax@example.com'
101
+ conf.import_path = Bulkrax.import_path || 'tmp/imports'
102
+ conf.export_path = Bulkrax.export_path || 'tmp/exports'
103
+ conf.removed_image_path = Bulkrax::Engine.root.join('spec', 'fixtures', 'removed.png').to_s
104
+ conf.server_name = 'bulkrax@example.com'
105
+ conf.relationship_job_class = "Bulkrax::CreateRelationshipsJob"
106
+ conf.required_elements = ['title']
107
+
108
+ def conf.curation_concerns
109
+ @curation_concerns ||= defined?(::Hyrax) ? ::Hyrax.config.curation_concerns : []
110
+ end
111
+
112
+ def conf.curation_concerns=(val)
113
+ @curation_concerns = val
114
+ end
115
+
116
+ def conf.file_model_class
117
+ @file_model_class ||= defined?(::Hyrax) ? ::FileSet : File
118
+ end
119
+
120
+ def conf.file_model_class=(val)
121
+ @file_model_class = val
122
+ end
45
123
 
46
124
  # Hash of Generic field_mappings for use in the view
47
- # There must be one field_mappings hash per view parial
125
+ # There must be one field_mappings hash per view partial
48
126
  # Based on Hyrax CoreMetadata && BasicMetadata
49
127
  # Override at application level to change
50
- self.field_mappings = {
128
+ conf.field_mappings = {
51
129
  "Bulkrax::OaiDcParser" => {
52
130
  "contributor" => { from: ["contributor"] },
53
131
  # no appropriate mapping for coverage (based_near needs id)
@@ -95,7 +173,7 @@ module Bulkrax
95
173
  }
96
174
 
97
175
  # Lambda to set the default field mapping
98
- self.default_field_mapping = lambda do |field|
176
+ conf.default_field_mapping = lambda do |field|
99
177
  return if field.blank?
100
178
  {
101
179
  field.to_s =>
@@ -110,7 +188,7 @@ module Bulkrax
110
188
  end
111
189
 
112
190
  # Properties that should not be used in imports. They are reserved for use by Hyrax.
113
- self.reserved_properties = %w[
191
+ conf.reserved_properties = %w[
114
192
  create_date
115
193
  modified_date
116
194
  date_modified
@@ -133,10 +211,10 @@ module Bulkrax
133
211
  # List of Questioning Authority properties that are controlled via YAML files in
134
212
  # the config/authorities/ directory. For example, the :rights_statement property
135
213
  # is controlled by the active terms in config/authorities/rights_statements.yml
136
- self.qa_controlled_properties = %w[rights_statement license]
214
+ conf.qa_controlled_properties = %w[rights_statement license]
137
215
  end
138
216
 
139
- def self.api_definition
217
+ def api_definition
140
218
  @api_definition ||= ActiveSupport::HashWithIndifferentAccess.new(
141
219
  YAML.safe_load(
142
220
  ERB.new(
@@ -149,9 +227,9 @@ module Bulkrax
149
227
  DEFAULT_MULTI_VALUE_ELEMENT_JOIN_ON = ' | '
150
228
  # Specify the delimiter for joining an attribute's multi-value array into a string.
151
229
  #
152
- # @note the specific delimeter should likely be present in the multi_value_element_split_on
230
+ # @note the specific delimiter should likely be present in the multi_value_element_split_on
153
231
  # expression.
154
- def self.multi_value_element_join_on
232
+ def multi_value_element_join_on
155
233
  @multi_value_element_join_on ||= DEFAULT_MULTI_VALUE_ELEMENT_JOIN_ON
156
234
  end
157
235
 
@@ -161,7 +239,7 @@ module Bulkrax
161
239
  #
162
240
  # @note The "true" value is to preserve backwards compatibility.
163
241
  # @see DEFAULT_MULTI_VALUE_ELEMENT_JOIN_ON
164
- def self.multi_value_element_split_on
242
+ def multi_value_element_split_on
165
243
  if @multi_value_element_join_on.is_a?(TrueClass)
166
244
  DEFAULT_MULTI_VALUE_ELEMENT_SPLIT_ON
167
245
  else
@@ -169,23 +247,24 @@ module Bulkrax
169
247
  end
170
248
  end
171
249
 
172
- # this function maps the vars from your app into your engine
173
- def self.setup
174
- yield self
175
- end
176
-
177
250
  # Responsible for stripping hidden characters from the given string.
178
251
  #
179
252
  # @param value [#to_s]
180
253
  # @return [String] with hidden characters removed
181
254
  #
182
255
  # @see https://github.com/samvera-labs/bulkrax/issues/688
183
- def self.normalize_string(value)
256
+ def normalize_string(value)
184
257
  # Removing [Byte Order Mark (BOM)](https://en.wikipedia.org/wiki/Byte_order_mark)
185
258
  value.to_s.delete("\xEF\xBB\xBF")
186
259
  end
187
260
 
188
- # This class confirms to the Active::Support.serialze interface. It's job is to ensure that we
261
+ def fallback_user_for_importer_exporter_processing
262
+ return User.batch_user if defined?(Hyrax) && User.respond_to?(:batch_user)
263
+
264
+ raise "We have no fallback user available for Bulkrax.fallback_user_for_importer_exporter_processing"
265
+ end
266
+
267
+ # This class confirms to the Active::Support.serialize interface. It's job is to ensure that we
189
268
  # don't have keys with the tricksy Byte Order Mark character.
190
269
  #
191
270
  # @see https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize
@@ -72,7 +72,7 @@ Bulkrax.setup do |config|
72
72
  # config.qa_controlled_properties += ['my_field']
73
73
 
74
74
  # Specify the delimiter regular expression for splitting an attribute's values into a multi-value array.
75
- # config.multi_value_element_split_on = //\s*[:;|]\s*/.freeze
75
+ # config.multi_value_element_split_on = /\s*[:;|]\s*/.freeze
76
76
 
77
77
  # Specify the delimiter for joining an attribute's multi-value array into a string. Note: the
78
78
  # specific delimeter should likely be present in the multi_value_element_split_on expression.
data/lib/tasks/reset.rake CHANGED
@@ -32,7 +32,7 @@ namespace :hyrax do
32
32
  Mailboxer::Notification.delete_all
33
33
  Mailboxer::Conversation::OptOut.delete_all
34
34
  Mailboxer::Conversation.delete_all
35
- AccountElevator.switch!('single.tenant.default')
35
+ AccountElevator.switch!(Site.instance.account) if defined?(AccountElevator)
36
36
  # we need to wait till Fedora is done with its cleanup
37
37
  # otherwise creating the admin set will fail
38
38
  while AdminSet.exists?(AdminSet::DEFAULT_ID)
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: 5.0.0
4
+ version: 5.2.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: 2023-01-24 00:00:00.000000000 Z
11
+ date: 2023-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -327,6 +327,7 @@ files:
327
327
  - app/parsers/bulkrax/csv_parser.rb
328
328
  - app/parsers/bulkrax/oai_dc_parser.rb
329
329
  - app/parsers/bulkrax/oai_qualified_dc_parser.rb
330
+ - app/parsers/bulkrax/parser_export_record_set.rb
330
331
  - app/parsers/bulkrax/xml_parser.rb
331
332
  - app/services/bulkrax/remove_relationships_for_importer.rb
332
333
  - app/views/bulkrax/entries/_parsed_metadata.html.erb
@@ -396,6 +397,7 @@ files:
396
397
  - db/migrate/20220609001128_rename_bulkrax_importer_run_to_importer_run.rb
397
398
  - lib/bulkrax.rb
398
399
  - lib/bulkrax/engine.rb
400
+ - lib/bulkrax/entry_spec_helper.rb
399
401
  - lib/bulkrax/version.rb
400
402
  - lib/generators/bulkrax/install_generator.rb
401
403
  - lib/generators/bulkrax/templates/README
@@ -425,7 +427,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
425
427
  - !ruby/object:Gem::Version
426
428
  version: '0'
427
429
  requirements: []
428
- rubygems_version: 3.0.3
430
+ rubygems_version: 3.1.6
429
431
  signing_key:
430
432
  specification_version: 4
431
433
  summary: Import and export tool for Hyrax and Hyku