bulk_ops 0.1.4 → 0.1.5
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/bulk_ops/operations_controller.rb +1 -1
- data/lib/bulk_ops/verification.rb +16 -6
- data/lib/bulk_ops/verification_job.rb +10 -10
- data/lib/bulk_ops/version.rb +1 -1
- data/lib/bulk_ops/work_proxy.rb +21 -30
- 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: 5ca22890f1ad64017c266506d40ec4da8a457534bab1a129b8a19b2e49081bbc
|
4
|
+
data.tar.gz: dca608af70c35c1d1afb2def0c5afbdbf015d035f4ee15d4d7e58baaaf89f1a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b3f8b03cd80cc8e24a1f135ebf8dadac1dc274d8c49d7fb0b1f968f41b5836aa2c92353d40e24a3a9d6dd48e32543ffe8ab83195c1cd8702cc481901bfd6d21
|
7
|
+
data.tar.gz: 9252201c835571f0a2c9d5a8027cd45c03acf95ffc865e5e5eebdbdab1c765d6c97c7515175874de2aede0a5950037a55b395fd47ed5ec590139501801f75751
|
@@ -316,7 +316,7 @@ module BulkOps
|
|
316
316
|
|
317
317
|
@operation.stage = "verifying"
|
318
318
|
@operation.save
|
319
|
-
BulkOps::VerificationJob.perform_later(@operation)
|
319
|
+
BulkOps::VerificationJob.perform_later(@operation.id)
|
320
320
|
flash[:notice] = "We are now running the data from your spreadsheet through an automatic verification process to anticipate any problems before we begin the ingest. This may take a few minutes. You should recieve an email when the process completes."
|
321
321
|
redirect_to action: "show"
|
322
322
|
end
|
@@ -4,9 +4,13 @@ module BulkOps
|
|
4
4
|
|
5
5
|
def verify
|
6
6
|
@verification_errors ||= []
|
7
|
+
update(message: "verifying spreadsheet column headers")
|
7
8
|
verify_column_headers
|
9
|
+
update(message: "verifying controlled vocab urls (starting)")
|
8
10
|
verify_remote_urls
|
11
|
+
update(message: "verifying complex object structures")
|
9
12
|
verify_internal_references
|
13
|
+
update(message: "verifying that all files exist")
|
10
14
|
verify_files
|
11
15
|
verify_works_to_update if operation_type.to_s == "update"
|
12
16
|
unless @verification_errors.blank?
|
@@ -29,6 +33,7 @@ module BulkOps
|
|
29
33
|
|
30
34
|
def is_file_field?(fieldname)
|
31
35
|
return false if fieldname.blank?
|
36
|
+
return false if schema.get_field(fieldname)
|
32
37
|
field_parts = fieldname.underscore.humanize.downcase.gsub(/[-_]/,' ').split(" ")
|
33
38
|
return false unless field_parts.any?{ |field_type| BulkOps::WorkProxy::FILE_FIELDS.include?(field_type) }
|
34
39
|
return "remove" if field_parts.any?{ |field_type| ['remove','delete'].include?(field_type) }
|
@@ -126,12 +131,18 @@ module BulkOps
|
|
126
131
|
end
|
127
132
|
|
128
133
|
def verify_remote_urls
|
129
|
-
|
134
|
+
row_offset = BulkOps::GithubAccess::ROW_OFFSET.present? ? BulkOps::GithubAccess::ROW_OFFSET : 2
|
135
|
+
get_spreadsheet.each_with_index do |row, row_num|
|
136
|
+
update(message: "verifying controlled vocab urls (row number #{row_num})")
|
137
|
+
next if row_num.nil?
|
130
138
|
schema.controlled_field_names.each do |controlled_field_name|
|
131
|
-
next unless (
|
132
|
-
|
133
|
-
|
134
|
-
|
139
|
+
next unless (urls = row[controlled_field_name])
|
140
|
+
urls.split(';').each do |url|
|
141
|
+
label = ::WorkIndexer.fetch_remote_label(url)
|
142
|
+
# if we can't get the label, and we aren't going to add a local label, throw an error
|
143
|
+
if (!label || label.blank?) && !schema.get_field(controlled_field_name).vocabularies.any?{|vocab| vocab["authority"].to_s.downcase == "local"}
|
144
|
+
@verification_errors << BulkOps::Error.new({type: :cannot_retrieve_label, row_number: row_num + row_offset, field: controlled_field_name, url: url})
|
145
|
+
end
|
135
146
|
end
|
136
147
|
end
|
137
148
|
end
|
@@ -148,7 +159,6 @@ module BulkOps
|
|
148
159
|
end
|
149
160
|
end
|
150
161
|
|
151
|
-
|
152
162
|
def verify_works_to_update
|
153
163
|
return [] unless operation_type == "update"
|
154
164
|
get_spreadsheet.each_with_index do |row, row_num|
|
@@ -7,17 +7,17 @@ class BulkOps::VerificationJob < ActiveJob::Base
|
|
7
7
|
|
8
8
|
queue_as :default
|
9
9
|
|
10
|
-
def perform(
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
else
|
17
|
-
operation.notify(subject: "Bulk Operation - Error creating Github pull request", message: "Your bulk ingest has passed verification, but we had a problem creating a pull request on Github in order to merge this operation with the master branch. Please check your github configuration.")
|
18
|
-
end
|
10
|
+
def perform(operation_id)
|
11
|
+
operation = BulkOps::Operation.find(operation_id)
|
12
|
+
if operation.verify
|
13
|
+
operation.set_stage "authorize"
|
14
|
+
if operation.create_pull_request
|
15
|
+
operation.notify(subject: "Bulk Operation Verification Successful", message: "Your bulk ingest has passed verification, and we have requested to start applying the operation. It may required one final approval from an administrator before the operation proceeds.")
|
19
16
|
else
|
20
|
-
operation.
|
17
|
+
operation.notify(subject: "Bulk Operation - Error creating Github pull request", message: "Your bulk ingest has passed verification, but we had a problem creating a pull request on Github in order to merge this operation with the master branch. Please check your github configuration.")
|
21
18
|
end
|
19
|
+
else
|
20
|
+
operation.set_stage "pending"
|
21
|
+
end
|
22
22
|
end
|
23
23
|
end
|
data/lib/bulk_ops/version.rb
CHANGED
data/lib/bulk_ops/work_proxy.rb
CHANGED
@@ -111,7 +111,7 @@ class BulkOps::WorkProxy < ActiveRecord::Base
|
|
111
111
|
def split_values value_string
|
112
112
|
# Split values on all un-escaped separator character (escape character is '\')
|
113
113
|
# Then replace all escaped separator charactors with un-escaped versions
|
114
|
-
value_string.split(/(?<!\\)#{SEPARATOR}/).map{|val| val.gsub("\\#{SEPARATOR}",SEPARATOR)}
|
114
|
+
value_string.split(/(?<!\\)#{SEPARATOR}/).map{|val| val.gsub("\\#{SEPARATOR}",SEPARATOR).strip}
|
115
115
|
end
|
116
116
|
|
117
117
|
def interpret_controlled_fields raw_data
|
@@ -154,11 +154,14 @@ class BulkOps::WorkProxy < ActiveRecord::Base
|
|
154
154
|
|
155
155
|
remove = field_name.downcase.starts_with?("remove") || field_name.downcase.starts_with?("delete")
|
156
156
|
|
157
|
+
|
157
158
|
# handle multiple values
|
158
|
-
split_values(value)
|
159
|
-
|
159
|
+
value_array = split_values(value)
|
160
|
+
controlled_data[field_name_norm] ||= [] unless value_array.blank?
|
161
|
+
value_array.each do |value|
|
160
162
|
# Decide of we're dealing with a label or url
|
161
163
|
# It's an ID if it's a URL and the name doesn't end in 'label'
|
164
|
+
value.strip!
|
162
165
|
if value =~ /^#{URI::regexp}$/ and !field_name.downcase.ends_with?("label")
|
163
166
|
id = value
|
164
167
|
label = WorkIndexer.fetch_remote_label(value)
|
@@ -173,37 +176,21 @@ class BulkOps::WorkProxy < ActiveRecord::Base
|
|
173
176
|
url: value,
|
174
177
|
row_number: row_number) unless id
|
175
178
|
end
|
176
|
-
|
179
|
+
controlled_data[field_name_norm] << {id: id, label: label, remove: field_name.downcase.starts_with?("remove")}
|
177
180
|
end
|
178
181
|
end
|
179
182
|
|
180
183
|
#delete any duplicates (if someone listed a url and also its label, or the same url twice)
|
181
184
|
controlled_data.each{|field_name, values| controlled_data[field_name] = values.uniq }
|
182
|
-
|
183
|
-
if operation.options["compare_labels"]
|
184
|
-
controlled_data.each do |field_name,values|
|
185
|
-
unless labels['field'].count == values.count
|
186
|
-
report_error(:mismatched_auth_terms,
|
187
|
-
message: "Different numbers of labels and ids for #{field}",
|
188
|
-
row_number: row_number)
|
189
|
-
end
|
190
|
-
end
|
191
|
-
labels['field'].each do |label|
|
192
|
-
next if controlled_data.any?{|dt| dt["label"] == label}
|
193
|
-
report_error(:mismatched_auth_terms,
|
194
|
-
message: "There are controlled vocab term labels that no provided URL resolves to, in the field #{field}.",
|
195
|
-
row_number: row_number)
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
185
|
+
|
199
186
|
# Actually add all the data
|
200
187
|
metadata = {}
|
201
188
|
leftover_data = raw_data.dup.to_hash
|
202
189
|
controlled_data.each do |property_name, data|
|
190
|
+
metadata["#{property_name}_attributes"] ||= [] unless data.blank?
|
203
191
|
data.each do |datum|
|
204
192
|
atts = {"id" => datum[:id]}
|
205
193
|
atts["_delete"] = true if datum[:remove]
|
206
|
-
metadata["#{property_name}_attributes"] ||= []
|
207
194
|
metadata["#{property_name}_attributes"] << atts
|
208
195
|
leftover_data.except! property_name
|
209
196
|
end
|
@@ -382,7 +369,8 @@ class BulkOps::WorkProxy < ActiveRecord::Base
|
|
382
369
|
end
|
383
370
|
end
|
384
371
|
|
385
|
-
def mintLocalAuthUrl(auth_name, value)
|
372
|
+
def mintLocalAuthUrl(auth_name, value)
|
373
|
+
value.strip!
|
386
374
|
id = value.parameterize
|
387
375
|
auth = Qa::LocalAuthority.find_or_create_by(name: auth_name)
|
388
376
|
entry = Qa::LocalAuthorityEntry.create(local_authority: auth,
|
@@ -392,22 +380,25 @@ class BulkOps::WorkProxy < ActiveRecord::Base
|
|
392
380
|
end
|
393
381
|
|
394
382
|
def findAuthUrl(auth, value)
|
383
|
+
value.strip!
|
395
384
|
return nil if auth.nil?
|
396
385
|
return nil unless (entries = Qa::Authorities::Local.subauthority_for(auth).search(value))
|
397
386
|
entries.each do |entry|
|
398
387
|
#require exact match
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
end
|
388
|
+
next unless entry["label"] == value
|
389
|
+
url = entry["url"]
|
390
|
+
url ||= entry["id"]
|
391
|
+
url = localIdToUrl(url,auth) unless url =~ URI::regexp
|
392
|
+
return url
|
405
393
|
end
|
406
394
|
return nil
|
407
395
|
end
|
408
396
|
|
409
397
|
def localIdToUrl(id,auth_name)
|
410
|
-
|
398
|
+
hostname = Socket.gethostname
|
399
|
+
hostname = "localhost" unless hostname.include?(',')
|
400
|
+
protocol = (Rails.env == "production") ? "https" : "http"
|
401
|
+
return "#{protocol}://#{hostname}/authorities/show/local/#{auth_name}/#{id}"
|
411
402
|
end
|
412
403
|
|
413
404
|
def getLocalAuth(field_name)
|
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.
|
4
|
+
version: 0.1.5
|
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-
|
11
|
+
date: 2019-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|