bulk_ops 0.1.11 → 0.1.12

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: 58a1fcfbb6f75f1a90103383bf9d77afc7912db5e837d57e7f514a0d2620646b
4
- data.tar.gz: c6e74c188710b832d14a62c8622c7d4b116b3fc24069bce83ef044f3c1de7bf7
3
+ metadata.gz: d5769c63fe85e0a97a16da3f147f2788af3ce5114ac84fd9ea1e3078f187ce11
4
+ data.tar.gz: 6164cafacea7e4f88cb39464ad2cf19cd38268f63cf4fdccda6f0bee35cc3515
5
5
  SHA512:
6
- metadata.gz: 629745639d8de5bdb9ced3eaa7473721d33ed87beb2d6e7af100306e5177545ee65419ee172a7eaa900e2e94434437f6236209f6fe00c5b26dd4b21975096687
7
- data.tar.gz: 38ecec91afaccc17de448fd42d6aab6d295dab4e40a25d786dd57c77af642e978bfdb0f6805341e57494a135a04c8fdd2dc3da4020fe4a2cc9681cec8d7d4e16
6
+ metadata.gz: e93c25e5bf47b3d9230b78b42695871bb4c7905270c9f9eeda92e459f030e4a74cc32e5a362e2224a1817ee0dd3f639b36aa573032d90cea00aaf0c3b4c9717a
7
+ data.tar.gz: 307ad0126fd62baa1a21b7f0ca5073c0847a27435a0665955aa3df68df24a28b85b96396ba01ef966e82d9b218e6b728ef46cd03ec8bcfbb369b18c56d24d32e
@@ -33,6 +33,7 @@ class CreateBulkOpsTables < ActiveRecord::Migration[5.0]
33
33
  t.string :identifier_type
34
34
  t.string :relationship_type
35
35
  t.string :status
36
+ t.string :next
36
37
  t.timestamps
37
38
  end
38
39
 
@@ -1,7 +1,8 @@
1
1
  class BulkOps::Error
2
2
  attr_accessor :type, :row_number, :object_id, :message, :option_name, :file, :option_values, :field, :url
3
3
 
4
- MAX_ERROR = 50
4
+ MAX_ERROR = 5000
5
+ MAX_ERROR_SHORT = 50
5
6
 
6
7
  def initialize type:, row_number: nil, object_id: nil, message: nil, options_name: nil, option_values: nil, field: nil, url: nil , file: nil
7
8
  @type = type
@@ -39,12 +40,13 @@ class BulkOps::Error
39
40
  return error_file_name
40
41
  end
41
42
 
42
- def self.error_message type, errors
43
+ def self.error_message type, errors, short=false
44
+ max_error = short ? MAX_ERROR_SHORT : MAX_ERROR
43
45
  case type
44
46
  when :mismatched_auth_terms
45
47
  message = "\n-- Controlled Authority IDs and Labels don't match -- \n"
46
48
  message += "The operation is set to create an error if the provided URLs for controlled authority terms do not resolve to the provided labels.\n"
47
- if errors.count < MAX_ERROR
49
+ if errors.count < max_error
48
50
  message += "The following rows were affected:\n"
49
51
  message += errors.map{|error| error.row_number}.join(",")+"\n"
50
52
  else
@@ -53,7 +55,7 @@ class BulkOps::Error
53
55
  when :upload_error
54
56
  message = "\n-- Errors uploading files -- \n"
55
57
  message += "Your files looked ok when we checked earlier, but we couldn't access them when we were trying to actually start the operation.\n"
56
- if errors.count < MAX_ERROR
58
+ if errors.count < max_error
57
59
  message += "The following files were affected:\n"
58
60
  message += errors.map{|error| "Row #{row_number}, Filename: #{error.file}"}.join("\n")+"\n"
59
61
  else
@@ -90,7 +92,7 @@ class BulkOps::Error
90
92
  when :cannot_retrieve_label
91
93
  message = "\n-- Errors Retrieving Remote Labels --\n"
92
94
  urls = errors.map{|error| error.url}.uniq
93
- if urls.count < MAX_ERROR
95
+ if urls.count < max_error
94
96
  urls.each do |url|
95
97
  url_errors = errors.select{|er| er.url == url}
96
98
  message += "Error retrieving label for remote url #{url}. \nThis url appears in #{url_errors.count} instances in the spreadsheet.\n"
@@ -104,7 +106,7 @@ class BulkOps::Error
104
106
  when :cannot_retrieve_url
105
107
  message = "\n-- Errors Retrieving Remote URLs --\n"
106
108
  urls = errors.map{|error| error.url}.uniq
107
- if urls.count < MAX_ERROR
109
+ if urls.count < max_error
108
110
  urls.each do |url|
109
111
  url_errors = errors.select{|er| er.url == url}
110
112
  message += "Error retrieving URL for remote authority term #{url}. \nThis term appears in #{url_errors.count} instances in the spreadsheet.\n"
@@ -118,7 +120,7 @@ class BulkOps::Error
118
120
  when :bad_object_reference
119
121
  message = "\n-- Error: bad object reference --\m"
120
122
  message += "We enountered #{errors.count} problems resolving object references.\n"
121
- if errors.count < MAX_ERROR
123
+ if errors.count < max_error
122
124
  message += "The row numbers with problems were:\n"
123
125
  message += errors.map{|er| "row number #{er.row_number} references the object #{er.object_id}"}.join("\n")
124
126
  else
@@ -128,7 +130,7 @@ class BulkOps::Error
128
130
  when :cannot_find_file
129
131
  message = "\n-- Missing File Errors --\n "
130
132
  message += "We couldn't find the files listed on #{errors.count} rows.\n"
131
- if errors.count < MAX_ERROR
133
+ if errors.count < max_error
132
134
  message += "Missing filenames:\n"
133
135
  message += errors.map{|er| er.file}.join("\n")
134
136
  else
@@ -141,12 +141,21 @@ module BulkOps
141
141
  def check_if_finished
142
142
  return unless stage == "running" && !busy?
143
143
 
144
+ update(stage: "finishing")
145
+
144
146
  # Attempt to resolve each dangling (objectless) relationships
145
147
  BulkOps::Relationship.where(:status => "pending").each do |relationship|
146
- relationship.resolve!
148
+ relationship.resolve! if relationship.work_proxy.operation_id == id
149
+ end
150
+
151
+ work_proxies.each do |proxy|
152
+ wrk = Work.find(proxy.work_id)
153
+ wrk.save if wrk.members.any?{|mem| mem.class.to_s !== "FileSet"}
154
+ sd = SolrDocument.find(wrk.id)
155
+ wrk.save if sd['hasRelatedImage_ssim'].present? && sd['relatedImageId_ss'].blank?
147
156
  end
148
157
 
149
- update(stage: accumulated_errors.blank? ? "complete" : "errors" )
158
+ update(stage: (accumulated_errors.blank? ? "complete" : "errors" ))
150
159
  report_errors!
151
160
  lift_holds
152
161
  end
@@ -272,7 +281,7 @@ module BulkOps
272
281
  def options
273
282
  return {} if name.nil?
274
283
  return @options if @options
275
- branch = running? ? "master" : nil
284
+ branch = (running? || complete?) ? "master" : nil
276
285
  @options ||= git.load_options(branch: branch)
277
286
  end
278
287
 
@@ -0,0 +1,21 @@
1
+ class BulkOps::QueueWorkIngestsJob < ActiveJob::Base
2
+ attr_accessor :operation
3
+
4
+ queue_as :ingest
5
+
6
+ def perform(op)
7
+ @operation = op
8
+ metadata = op.final_spreadsheet
9
+ op.work_proxies.where(status:'queued').each do |proxy|
10
+ data = proxy.interpret_data(metadata[proxy.row_number])
11
+ next unless proxy.proxy_errors.blank?
12
+ proxy.update(status: 'sidekiq', message: "interpreted at #{DateTime.now.strftime("%d/%m/%Y %H:%M")} " + proxy.message)
13
+ BulkOps::CreateWorkJob.perform_later(proxy.work_type || "Work",
14
+ op.user.email,
15
+ data,
16
+ proxy.id,
17
+ proxy.visibility)
18
+ end
19
+ end
20
+
21
+ end
@@ -3,6 +3,7 @@ class BulkOps::Relationship < ActiveRecord::Base
3
3
 
4
4
  self.table_name = "bulk_ops_relationships"
5
5
  belongs_to :work_proxy, class_name: "BulkOps::WorkProxy", foreign_key: "work_proxy_id"
6
+ delegate :operation, :operation_id, to: :work_proxy
6
7
 
7
8
  def initialize *args
8
9
  super *args
@@ -13,7 +14,7 @@ class BulkOps::Relationship < ActiveRecord::Base
13
14
  end
14
15
 
15
16
  def findObject
16
- case identifier_type
17
+ case identifier_type.downcase
17
18
  when "id"
18
19
  begin
19
20
  object = ActiveFedora::Base.find(object_identifier)
@@ -25,7 +26,7 @@ class BulkOps::Relationship < ActiveRecord::Base
25
26
  # TODO clean up solr query and add work type to it
26
27
  query = "{!field f=title_tesim}#{object_identifier}"
27
28
  objects = ActiveFedora::SolrService.instance.conn.get(ActiveFedora::SolrService.select_path,
28
- params: { fq: query, rows: 100})["response"]["docs"].first
29
+ params: { fq: query, rows: 100})["response"]["docs"]
29
30
  if objects.present?
30
31
  return ActiveFedora::Base.find(objects.first["id"])
31
32
  elsif relationship_type.downcase == "collection"
@@ -39,9 +40,13 @@ class BulkOps::Relationship < ActiveRecord::Base
39
40
  return false if objects.blank?
40
41
  return ActiveFedora::Base.find(objects.first["id"])
41
42
  when "row"
42
- object_proxy = BulkOps::WorkProxy.find_by(operation_id: work_proxy.operation.id,
43
+ object_proxy = BulkOps::WorkProxy.find_by(operation_id: work_proxy.operation_id,
43
44
  row_number: (object_identifier.to_i - 2))
44
45
  ActiveFedora::Base.find(object_proxy.work_id)
46
+ when "proxy_id"
47
+ return false unless (proxy = BulkOps::WorkProxy.find(proxy_id))
48
+ return false unless proxy.work_id.present?
49
+ ActiveFedora::Base.find(proxy.work_id)
45
50
  end
46
51
  end
47
52
 
@@ -52,20 +57,47 @@ class BulkOps::Relationship < ActiveRecord::Base
52
57
  end
53
58
  implement_relationship! relationship_type, subject, object
54
59
  end
60
+
61
+ def insert_among_siblings(object,new_member)
62
+ return nil unless ["parent"].include?(relationship_type.downcase)
63
+ prev_sib_id = previous_sibling
64
+ # This is the id of the WorkProxy associate with the most recent sibling work
65
+ # that might be fully ingested. If is it not fully ingested, we will move on
66
+ # to the preceding sibling.
67
+ while prev_sib_id.present?
68
+ prev_sib_proxy = BulkOps::WorkProxy.find(previous_sibling)
69
+ # Check if the previous sibling is fully ingested
70
+ # and get its index among its siblings (if it has been successfully attached to the parent)
71
+ prev_sib_index = object.ordered_member_ids.index(prev_sib_proxy.work_id) if prev_sib_proxy.work_id.present? # Insert the new member among its siblings if we found the right place
72
+ return object.ordered_members.to_a.insert(prev_sib_index+1, new_member) if prev_sib_index.present?
73
+ # Otherwise, pull up the sibling's relationship field to check if it sibling has a sibling before it
74
+ sib_relationship = prev_sib_proxy.relationships.find_by(relationship_type: relationship_type, object_identifier: object_identifier)
75
+ # If we can't find an ingested sibling among the ordered members,
76
+ # make this work the first member.
77
+ break unless sib_relationship.present?
78
+ prev_sib_id = sib_relationship.previous_sibling
79
+ end
80
+ return [new_member]+ordered_members.to_a
81
+ end
55
82
 
56
83
  def implement_relationship!(type,subject,object)
57
- case type
84
+ case type.downcase
58
85
  when "parent"
59
- object.ordered_members << subject
60
- object.save
86
+ unless object.member_ids.include? subject.id
87
+ object.ordered_members = insert_among_siblings(object, new_member)
88
+ object.save
89
+ end
61
90
  when "child"
62
- subject.ordered_members << object
63
- subject.save
91
+ #CAVEAT ordering not fully implemented in this case
92
+ unless subject.member_ids.include? object.id
93
+ subject.ordered_members << object
94
+ subject.save
95
+ end
64
96
  when "collection"
65
- object.add_members([subject.id])
66
- object.save
67
- when "next"
68
- #TODO - implement this - related to ordering of filesets
97
+ unless object.member_object_ids.include? subject.id
98
+ object.add_members([subject.id])
99
+ object.save
100
+ end
69
101
  when "order"
70
102
  #TODO - implement this - related to ordering of filesets
71
103
 
@@ -200,7 +200,7 @@ module BulkOps
200
200
  if ref_id == "row" || (ref_id == "id/row" && obj_id.is_a?(Integer))
201
201
  obj_id = obj_id.to_i
202
202
  # This is a row number reference. It should be an integer in the range of possible row numbers.
203
- unless obj_id.present?(obj_id > 0) && (obj_id <= metadata.count)
203
+ unless obj_id.present? && (obj_id > 0) && (obj_id <= metadata.count)
204
204
  @verification_errors << BulkOps::Error.new({type: :bad_object_reference, object_id: obj_id, row_number: row_num + ROW_OFFSET})
205
205
  end
206
206
  elsif ref_id == "id" || ref_id == "hyrax id" || (ref_id == "id/row" && (obj_id.is_a? Integer))
@@ -1,3 +1,3 @@
1
1
  module BulkOps
2
- VERSION = "0.1.11"
2
+ VERSION = "0.1.12"
3
3
  end
@@ -9,42 +9,40 @@ class BulkOps::WorkJob < ActiveJob::Base
9
9
  after_perform do |job|
10
10
 
11
11
  # update BulkOperationsWorkProxy status
12
- @work ||= ActiveFedora::Base.find(@work_proxy.work_id)
13
- if @work.id.nil?
14
- status = "error"
12
+ if @work.nil? || @work.id.nil?
13
+ update_status "error"
15
14
  else
16
15
  @work_proxy.work_id = @work.id
17
- status = "complete"
18
- end
19
- update_status status
16
+ update_status "complete"
20
17
 
21
- # Attempt to resolve all of the relationships defined in this row
22
- @work_proxy.relationships.each do |relationship|
23
- relationship.resolve!
24
- end
18
+ # Attempt to resolve all of the relationships defined in this row
19
+ @work_proxy.relationships.each do |relationship|
20
+ relationship.resolve!
21
+ end
25
22
 
26
- # Delete any UploadedFiles. These take up tons of unnecessary disk space.
27
- @work.file_sets.each do |fileset|
28
- if uf = Hyrax::UploadedFile.find_by(file: fileset.label)
29
- uf.destroy!
23
+ # Delete any UploadedFiles. These take up tons of unnecessary disk space.
24
+ @work.file_sets.each do |fileset|
25
+ if uf = Hyrax::UploadedFile.find_by(file: fileset.label)
26
+ uf.destroy!
27
+ end
30
28
  end
31
- end
32
29
 
33
- # Remove any edit holds placed on an item
34
- @work_proxy.lift_hold
30
+ # Remove any edit holds placed on an item
31
+ @work_proxy.lift_hold
35
32
 
36
- # Check if the parent operation is finished
37
- # and do any cleanup if so
38
- if @work_proxy.operation.present? && @work_proxy.operation.respond_to?(:check_if_finished)
39
- @work_proxy.operation.check_if_finished
40
- end
41
-
33
+ # Check if the parent operation is finished
34
+ # and do any cleanup if so
35
+ if @work_proxy.operation.present? && @work_proxy.operation.respond_to?(:check_if_finished)
36
+ @work_proxy.operation.check_if_finished
37
+ end
38
+ end
42
39
  end
43
40
 
44
41
  def perform(workClass,user_email,attributes,work_proxy_id,visibility=nil)
45
42
  return if status == "complete"
46
43
  update_status "starting", "Initializing the job"
47
44
  attributes['visibility']= visibility if visibility.present?
45
+ attributes['title'] = ['Untitled'] if attributes['title'].blank?
48
46
  @work_proxy = BulkOps::WorkProxy.find(work_proxy_id)
49
47
  unless @work_proxy
50
48
  report_error("Cannot find work proxy with id: #{work_proxy_id}")
@@ -79,9 +77,10 @@ class BulkOps::WorkJob < ActiveJob::Base
79
77
  :create
80
78
  end
81
79
 
82
- def update_status status, message=false
80
+ def update_status stat, message=false
81
+ @status = stat
83
82
  return false unless @work_proxy
84
- atts = {status: status}
83
+ atts = {status: stat}
85
84
  atts[:message] = message if message
86
85
  @work_proxy.update(atts)
87
86
  end
@@ -2,7 +2,7 @@ class BulkOps::WorkProxy < ActiveRecord::Base
2
2
 
3
3
  require 'uri'
4
4
  OPTION_FIELDS = ['visibility','work type']
5
- RELATIONSHIP_FIELDS = ['parent','child','collection','next','order']
5
+ RELATIONSHIP_FIELDS = ['parent','child','collection','order']
6
6
  REFERENCE_IDENTIFIER_FIELDS = ['Reference Identifier','ref_id','Reference ID','Relationship ID','Relationship Identifier','Reference Identifier Type','Reference ID Type','Ref ID Type','relationship_identifier_type','relationship_id_type']
7
7
  FILE_FIELDS = ['file','files','filename','filenames']
8
8
  FILE_ACTIONS = ['add','upload','remove','delete']
@@ -49,6 +49,7 @@ class BulkOps::WorkProxy < ActiveRecord::Base
49
49
  metadata.merge! interpret_relationship_fields(raw_data )
50
50
  metadata.merge! interpret_option_fields(raw_data)
51
51
  metadata = setAdminSet(metadata)
52
+ metadata = setMetadataInheritance(metadata)
52
53
  return metadata
53
54
  end
54
55
 
@@ -208,7 +209,7 @@ class BulkOps::WorkProxy < ActiveRecord::Base
208
209
  field = schema.get_field(field_name)
209
210
  # Ignore controlled fields
210
211
  next if field.controlled?
211
- values.split(SEPARATOR).each do |value|
212
+ split_values(values).each do |value|
212
213
  next if value.blank?
213
214
  value = value.strip.encode('utf-8', :invalid => :replace, :undef => :replace, :replace => '_') unless value.blank?
214
215
  value = unescape_csv(value)
@@ -292,62 +293,94 @@ class BulkOps::WorkProxy < ActiveRecord::Base
292
293
  return {}
293
294
  end
294
295
 
295
- def interpret_relationship_fields raw_data
296
+ def interpret_relationship_fields raw_data, row_number=nil
296
297
  metadata = {}
297
- raw_data.each do |field,value|
298
+ raw_data do |field,value|
298
299
  next if value.blank? or field.blank?
299
300
  field = field.to_s
300
301
  value = unescape_csv(value)
302
+ identifer_type = reference_identifier
301
303
 
302
304
  next if value == field
303
305
 
304
306
  if (split = field.split(":")).count == 2
305
- ref_id = split.first
306
- field = split.last.to_s
307
+ identifier_type = split.last
308
+ field = split.first.to_s
307
309
  end
308
310
 
309
- normfield = field.downcase.parameterize.gsub(/[_\s-]/,'')
310
- # next unless RELATIONSHIP_FIELDS.include? normfield
311
-
312
- # If the field specifies the object's order among siblings (usually for multiple filesets)
313
- update(order: value.to_f) if normfield == "order"
314
-
315
- # If the field specifies the name or ID of a collection,
316
- # find or create the collection and update the metadata to match
317
- if ["collection","collectiontitle","memberofcollection","collectionname", "collectionid"].include?(normfield)
311
+ relationship_type = normalize_relationship_field_name(field)
312
+ case relationship_type
313
+ when "order"
314
+ # If the field specifies the object's order among siblings (usually for multiple filesets)
315
+ update(order: value.to_f)
316
+ when "collection"
317
+ # If the field specifies the name or ID of a collection,
318
+ # find or create the collection and update the metadata to match
318
319
  col = find_or_create_collection(value)
319
320
  ( metadata[:member_of_collection_ids] ||= [] ) << col.id if col
321
+ when "parent", "child"
322
+ object_id = interpret_relationship_value(value,identifier_type)
320
323
  end
321
-
322
- # All variations of field names that require BulkOps::Relationship objects
323
- next unless ["parent","parentid","parentidentifier","parentwork","child","childid","childidentifier","childwork","next","nextfile","nextwork","nextid","nextfileidentifier","nextfileid","nextworkid"].include?(normfield)
324
324
 
325
- # find which type of relationship
326
- ["parent","child","next"].select{|type| normfield.include?(type)}.first
327
325
  # correctly interpret the notation "id:a78C2d81"
328
326
  if ((split = value.split(":")).count == 2)
329
- ref_id = split.first
327
+ identifier_type = split.first
330
328
  value = split.last
331
329
  end
332
- BulkOps::Relationship.create( { work_proxy_id: id,
333
- identifier_type: ref_id || reference_identifier,
330
+
331
+ interpret_relationship_value(identifier_type, value)
332
+
333
+ relationship_parameters = { work_proxy_id: id,
334
+ identifier_type: ref_type,
334
335
  relationship_type: normfield,
335
336
  object_identifier: value,
336
- status: "new"} )
337
+ status: "new"}
338
+
339
+ #add previous sibling link if necessary
340
+ previous_value = op.metadata[row_number-1][field]
341
+ if previous_value.present? && (ref_type == "parent")
342
+ if value == interpret_relationship_value(ref_type, previous_value)
343
+ relationship_parameters[:previous_sibling] = operation.work_proxies.find_by(row_number: row_number-1).id
344
+ end
345
+ end
346
+ BulkOps::Relationship.create(relationship_parameters)
337
347
  end
338
348
  return metadata
339
349
  end
340
350
 
341
- def format_reference_id(value)
342
- return value if value=="id"
343
- # normalize the value string
344
- value_method = value.titleize.gsub(/[-_\s]/,'').downcase_first_letter
345
- # if this is a valid metadata property or solr parameter, return it as-is
346
- return value_method if (schema.get_field?(value_method) || SolrDocument.new.respond_to?(value_method))
347
- # if it is means to reference a row number, return the string "row"
348
- case value.downcase.parameterize.gsub(/[_\s-]/,'')
349
- when "row", "rownum","row number"
350
- return "row"
351
+ def normalize_relationship_field_name field
352
+ normfield = field.downcase.parameterize.gsub(/[_\s-]/,'')
353
+ RELATIONSHIP_FIELDS.find{|field| normfield.include?(field) }
354
+ end
355
+
356
+ def find_previous_parent field
357
+ i = 0;
358
+ while (prev_row = operation.metadata[row_number - i])
359
+ return (row_number - i) if prev_row[field].blank?
360
+ end
361
+ end
362
+
363
+ def find_previous_sibling (field,ref_type,object)
364
+ previous_value = interpret_relationship_value(ref_type,op.metadata[row_number-1][field])
365
+ return nil unless previous_value == object
366
+ return
367
+ end
368
+
369
+ def interpret_relationship_value id_type, value, field="parent"
370
+ #Handle "id:20kj4259" syntax if it hasn't already been handled
371
+ if (split = value.to_s.split(":")).count == 2
372
+ id_type = split.first
373
+ value = split.last
374
+ end
375
+ #Handle special shorthand syntax for refering to relative row numbers
376
+ if id_type == "row"
377
+ if value.to_i < 0
378
+ # if given a negative integer, count backwards from the current row
379
+ return row_number - value
380
+ elsif value.to_s.downcase.include?("prev")
381
+ # if given any variation of the word "previous", get the first preceding row with no parent of its own
382
+ return find_previous_parent(field)
383
+ end
351
384
  end
352
385
  end
353
386
 
@@ -422,7 +455,13 @@ class BulkOps::WorkProxy < ActiveRecord::Base
422
455
  return metadata if metadata[:admin_set_id]
423
456
  asets = AdminSet.where({title: "Bulk Ingest Set"})
424
457
  asets = AdminSet.find('admin_set/default') if asets.blank?
425
- metadata[:admin_set_id] = asets.first.id unless asets.blank?
458
+ metadata[:admin_set_id] = Array(asets).first.id unless asets.blank?
459
+ return metadata
460
+ end
461
+
462
+ def setMetadataInheritance metadata
463
+ return metadata if metadata[:metadataInheritance].present?
464
+ metadata[:metadataInheritance] = operation.options["metadataInheritance"] unless operation.options["metadataInheritance"].blank?
426
465
  return metadata
427
466
  end
428
467
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bulk_ops
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ned Henry, UCSC Library Digital Initiatives
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-16 00:00:00.000000000 Z
11
+ date: 2019-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -106,6 +106,7 @@ files:
106
106
  - lib/bulk_ops/github_access.rb
107
107
  - lib/bulk_ops/github_credential.rb
108
108
  - lib/bulk_ops/operation.rb
109
+ - lib/bulk_ops/queue_work_ingests_job.rb
109
110
  - lib/bulk_ops/relationship.rb
110
111
  - lib/bulk_ops/search_builder_behavior.rb
111
112
  - lib/bulk_ops/templates/configuration.yml