curation_concerns-models 0.10.0 → 0.11.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/actors/curation_concerns/file_actor.rb +8 -12
- data/app/indexers/curation_concerns/collection_indexer.rb +2 -2
- data/app/jobs/audit_job.rb +7 -12
- data/app/jobs/characterize_job.rb +5 -6
- data/app/jobs/create_derivatives_job.rb +6 -5
- data/app/jobs/import_url_job.rb +22 -21
- data/app/jobs/ingest_file_job.rb +2 -4
- data/app/models/concerns/curation_concerns/file_set_behavior.rb +1 -0
- data/app/models/concerns/curation_concerns/work_behavior.rb +1 -0
- data/app/services/curation_concerns/file_set_audit_service.rb +1 -1
- data/curation_concerns-models.gemspec +2 -1
- data/lib/curation_concerns/models/version.rb +1 -1
- metadata +26 -7
- data/app/jobs/active_fedora_id_based_job.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d2ce952ca856172a242fb615ba373ddf63110fb
|
4
|
+
data.tar.gz: 40858e4e383e4064df595aa3ae835339dbc8f765
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 843e33effb12627dd61670f19a4427d0e8211d1be63cd01421fbacca2b6d8d35d8a93cecac53d67a7b95e22eaf8a659ff165227851717a94a96536f5aca190a9
|
7
|
+
data.tar.gz: 6bab1ad84e209f202980a9361aab5629f66e343b3f2baa0b2e8438a97aaa07a088f9e887bb13c59b39b17661ca5d77de999e06f797be962ba2fb261f621922a0
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module CurationConcerns
|
2
|
-
# actions for a file identified by
|
2
|
+
# actions for a file identified by file_set and relation (maps to use predicate)
|
3
3
|
class FileActor
|
4
4
|
attr_reader :file_set, :relation, :user
|
5
5
|
|
@@ -19,10 +19,10 @@ module CurationConcerns
|
|
19
19
|
# have made it to the repo
|
20
20
|
# @param [File, ActionDigest::HTTP::UploadedFile, Tempfile] file the file to save in the repository
|
21
21
|
def ingest_file(file)
|
22
|
-
working_file = copy_file_to_working_directory(file,
|
22
|
+
working_file = copy_file_to_working_directory(file, file_set.id)
|
23
23
|
mime_type = file.respond_to?(:content_type) ? file.content_type : nil
|
24
|
-
IngestFileJob.perform_later(
|
25
|
-
make_derivative(file_set
|
24
|
+
IngestFileJob.perform_later(file_set, working_file, mime_type, user.user_key, relation)
|
25
|
+
make_derivative(file_set, working_file)
|
26
26
|
true
|
27
27
|
end
|
28
28
|
|
@@ -36,18 +36,14 @@ module CurationConcerns
|
|
36
36
|
|
37
37
|
# Retrieve a copy of the orginal file from the repository
|
38
38
|
working_file = copy_repository_resource_to_working_directory(repository_file)
|
39
|
-
make_derivative(
|
39
|
+
make_derivative(file_set, working_file)
|
40
40
|
true
|
41
41
|
end
|
42
42
|
|
43
43
|
private
|
44
44
|
|
45
|
-
def
|
46
|
-
file_set
|
47
|
-
end
|
48
|
-
|
49
|
-
def make_derivative(file_set_id, working_file)
|
50
|
-
CharacterizeJob.perform_later(file_set_id, working_file)
|
45
|
+
def make_derivative(file_set, working_file)
|
46
|
+
CharacterizeJob.perform_later(file_set, working_file)
|
51
47
|
end
|
52
48
|
|
53
49
|
# @param [File, ActionDispatch::Http::UploadedFile] file
|
@@ -61,7 +57,7 @@ module CurationConcerns
|
|
61
57
|
# @param [ActiveFedora::File] file the resource in the repo
|
62
58
|
# @return [String] path of the working file
|
63
59
|
def copy_repository_resource_to_working_directory(file)
|
64
|
-
copy_stream_to_working_directory(
|
60
|
+
copy_stream_to_working_directory(file_set.id, file.original_name, StringIO.new(file.content))
|
65
61
|
end
|
66
62
|
|
67
63
|
# @param [String] id the identifer
|
@@ -1,14 +1,14 @@
|
|
1
1
|
module CurationConcerns
|
2
2
|
class CollectionIndexer < Hydra::PCDM::CollectionIndexer
|
3
3
|
include IndexesThumbnails
|
4
|
-
|
4
|
+
STORED_LONG = Solrizer::Descriptor.new(:long, :stored)
|
5
5
|
|
6
6
|
def generate_solr_document
|
7
7
|
super.tap do |solr_doc|
|
8
8
|
# Makes Collections show under the "Collections" tab
|
9
9
|
Solrizer.set_field(solr_doc, 'generic_type', 'Collection', :facetable)
|
10
10
|
# Index the size of the collection in bytes
|
11
|
-
solr_doc[Solrizer.solr_name(:bytes,
|
11
|
+
solr_doc[Solrizer.solr_name(:bytes, STORED_LONG)] = object.bytes
|
12
12
|
solr_doc['thumbnail_path_ss'] = thumbnail_path
|
13
13
|
end
|
14
14
|
end
|
data/app/jobs/audit_job.rb
CHANGED
@@ -1,21 +1,16 @@
|
|
1
|
-
class AuditJob <
|
1
|
+
class AuditJob < ActiveJob::Base
|
2
2
|
queue_as :audit
|
3
3
|
|
4
|
-
attr_accessor :uri, :id, :file_id
|
5
|
-
|
6
4
|
# URI of the resource to audit.
|
7
5
|
# This URI could include the actual resource (e.g. content) and the version to audit:
|
8
6
|
# http://localhost:8983/fedora/rest/test/a/b/c/abcxyz/content/fcr:versions/version1
|
9
7
|
# but it could also just be:
|
10
8
|
# http://localhost:8983/fedora/rest/test/a/b/c/abcxyz/content
|
11
|
-
# @param [
|
9
|
+
# @param [FileSet] the parent object
|
12
10
|
# @param [String] file_id used to find the file within its parent object (usually "original_file")
|
13
11
|
# @param [String] uri of the specific file/version to be audited
|
14
|
-
def perform(
|
15
|
-
|
16
|
-
@file_id = file_id
|
17
|
-
@uri = uri
|
18
|
-
log = run_audit
|
12
|
+
def perform(file_set, file_id, uri)
|
13
|
+
log = run_audit(file_set, file_id, uri)
|
19
14
|
fixity_ok = log.pass == 1
|
20
15
|
unless fixity_ok
|
21
16
|
if CurationConcerns.config.callback.set?(:after_audit_failure)
|
@@ -29,7 +24,7 @@ class AuditJob < ActiveFedoraIdBasedJob
|
|
29
24
|
|
30
25
|
protected
|
31
26
|
|
32
|
-
def run_audit
|
27
|
+
def run_audit(file_set, file_id, uri)
|
33
28
|
begin
|
34
29
|
fixity_ok = ActiveFedora::FixityService.new(uri).check
|
35
30
|
rescue Ldp::NotFound
|
@@ -38,12 +33,12 @@ class AuditJob < ActiveFedoraIdBasedJob
|
|
38
33
|
|
39
34
|
if fixity_ok
|
40
35
|
passing = 1
|
41
|
-
ChecksumAuditLog.prune_history(id, file_id)
|
36
|
+
ChecksumAuditLog.prune_history(file_set.id, file_id)
|
42
37
|
else
|
43
38
|
logger.warn "***AUDIT*** Audit failed for #{uri} #{error_msg}"
|
44
39
|
passing = 0
|
45
40
|
end
|
46
|
-
ChecksumAuditLog.create!(pass: passing, file_set_id: id, version: uri, file_id: file_id)
|
41
|
+
ChecksumAuditLog.create!(pass: passing, file_set_id: file_set.id, version: uri, file_id: file_id)
|
47
42
|
end
|
48
43
|
|
49
44
|
private
|
@@ -1,12 +1,11 @@
|
|
1
|
-
class CharacterizeJob <
|
1
|
+
class CharacterizeJob < ActiveJob::Base
|
2
2
|
queue_as :characterize
|
3
3
|
|
4
|
-
# @param [
|
4
|
+
# @param [FileSet] file_set
|
5
5
|
# @param [String] filename a local path for the file to characterize. By using this, we don't have to pull a copy out of fedora.
|
6
|
-
def perform(
|
7
|
-
@id = id
|
6
|
+
def perform(file_set, filename)
|
8
7
|
Hydra::Works::CharacterizationService.run(file_set, filename)
|
9
|
-
file_set.save
|
10
|
-
CreateDerivativesJob.perform_later(file_set
|
8
|
+
file_set.save!
|
9
|
+
CreateDerivativesJob.perform_later(file_set, filename)
|
11
10
|
end
|
12
11
|
end
|
@@ -1,19 +1,20 @@
|
|
1
|
-
class CreateDerivativesJob <
|
1
|
+
class CreateDerivativesJob < ActiveJob::Base
|
2
2
|
queue_as :derivatives
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
# @param [FileSet] file_set
|
5
|
+
# @param [String] file_name
|
6
|
+
def perform(file_set, file_name)
|
6
7
|
return if file_set.video? && !CurationConcerns.config.enable_ffmpeg
|
7
8
|
|
8
9
|
file_set.create_derivatives(file_name)
|
9
10
|
# The thumbnail is indexed in the solr document, so reindex
|
10
11
|
file_set.update_index
|
11
|
-
file_set.parent.update_index if parent_needs_reindex?
|
12
|
+
file_set.parent.update_index if parent_needs_reindex?(file_set)
|
12
13
|
end
|
13
14
|
|
14
15
|
# If this file_set is the thumbnail for the parent work,
|
15
16
|
# then the parent also needs to be reindexed.
|
16
|
-
def parent_needs_reindex?
|
17
|
+
def parent_needs_reindex?(file_set)
|
17
18
|
return false unless file_set.parent
|
18
19
|
file_set.parent.thumbnail_id == file_set.id
|
19
20
|
end
|
data/app/jobs/import_url_job.rb
CHANGED
@@ -2,15 +2,14 @@ require 'net/https'
|
|
2
2
|
require 'uri'
|
3
3
|
require 'tempfile'
|
4
4
|
|
5
|
-
class ImportUrlJob <
|
5
|
+
class ImportUrlJob < ActiveJob::Base
|
6
6
|
queue_as :import_url
|
7
7
|
|
8
|
-
def perform(
|
9
|
-
@id = id
|
8
|
+
def perform(file_set)
|
10
9
|
user = User.find_by_user_key(file_set.depositor)
|
11
10
|
|
12
|
-
Tempfile.open(id.tr('/', '_')) do |f|
|
13
|
-
copy_remote_file(file_set
|
11
|
+
Tempfile.open(file_set.id.tr('/', '_')) do |f|
|
12
|
+
copy_remote_file(file_set, f)
|
14
13
|
|
15
14
|
# reload the generic file once the data is copied since this is a long running task
|
16
15
|
file_set.reload
|
@@ -25,23 +24,25 @@ class ImportUrlJob < ActiveFedoraIdBasedJob
|
|
25
24
|
end
|
26
25
|
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
27
|
+
protected
|
28
|
+
|
29
|
+
def copy_remote_file(file_set, f)
|
30
|
+
f.binmode
|
31
|
+
# download file from url
|
32
|
+
uri = URI(file_set.import_url)
|
33
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
34
|
+
http.use_ssl = uri.scheme == 'https' # enable SSL/TLS
|
35
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
36
|
+
mime_type = nil
|
37
|
+
|
38
|
+
http.start do
|
39
|
+
http.request_get(uri.request_uri) do |resp|
|
40
|
+
mime_type = resp.content_type
|
41
|
+
resp.read_body do |segment|
|
42
|
+
f.write(segment)
|
43
|
+
end
|
42
44
|
end
|
43
45
|
end
|
46
|
+
f.rewind
|
44
47
|
end
|
45
|
-
f.rewind
|
46
|
-
end
|
47
48
|
end
|
data/app/jobs/ingest_file_job.rb
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
class IngestFileJob < ActiveJob::Base
|
2
2
|
queue_as :ingest
|
3
3
|
|
4
|
-
# @param [
|
4
|
+
# @param [FileSet] file_set
|
5
5
|
# @param [String] filename
|
6
6
|
# @param [String,NilClass] mime_type
|
7
7
|
# @param [String] user_key
|
8
8
|
# @param [String] relation ('original_file')
|
9
|
-
def perform(
|
10
|
-
file_set = FileSet.find(file_set_id)
|
11
|
-
|
9
|
+
def perform(file_set, filename, mime_type, user_key, relation = 'original_file')
|
12
10
|
file = File.open(filename, "rb")
|
13
11
|
# If mime-type is known, wrap in an IO decorator
|
14
12
|
# Otherwise allow Hydra::Works service to determine mime_type
|
@@ -13,6 +13,7 @@ module CurationConcerns::WorkBehavior
|
|
13
13
|
include CurationConcerns::Naming
|
14
14
|
include CurationConcerns::RequiredMetadata
|
15
15
|
include Hydra::AccessControls::Embargoable
|
16
|
+
include GlobalID::Identification
|
16
17
|
|
17
18
|
included do
|
18
19
|
property :owner, predicate: RDF::URI.new('http://opaquenamespace.org/ns/hydra/owner'), multiple: false
|
@@ -81,7 +81,7 @@ module CurationConcerns
|
|
81
81
|
def audit_file_version(file_id, version_uri)
|
82
82
|
latest_audit = ChecksumAuditLog.logs_for(file_set.id, file_id).first
|
83
83
|
return latest_audit unless needs_audit?(latest_audit)
|
84
|
-
AuditJob.perform_later(file_set
|
84
|
+
AuditJob.perform_later(file_set, file_id, version_uri.to_s)
|
85
85
|
latest_audit || ChecksumAuditLog.new(pass: NO_RUNS, file_set_id: file_set.id, file_id: file_id, version: version_uri)
|
86
86
|
end
|
87
87
|
|
@@ -22,12 +22,13 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_dependency 'active_attr'
|
23
23
|
spec.add_dependency 'hydra-collections', '~> 8.1'
|
24
24
|
spec.add_dependency 'hydra-head', '~> 9.3'
|
25
|
-
spec.add_dependency 'hydra-works', '~> 0.
|
25
|
+
spec.add_dependency 'hydra-works', '~> 0.8', '>= 0.8.1'
|
26
26
|
spec.add_dependency 'active_fedora-noid', '~> 1.0'
|
27
27
|
spec.add_dependency 'resque', '~> 1.23'
|
28
28
|
spec.add_dependency 'resque-pool', '~> 0.3'
|
29
29
|
spec.add_dependency 'qa', '~> 0.5'
|
30
30
|
spec.add_dependency 'redlock', '~> 0.1.2'
|
31
|
+
spec.add_dependency 'solrizer', '~> 3.4'
|
31
32
|
|
32
33
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
33
34
|
spec.add_development_dependency 'rake'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: curation_concerns-models
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Coyne
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_attr
|
@@ -58,14 +58,20 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0.
|
61
|
+
version: '0.8'
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 0.8.1
|
62
65
|
type: :runtime
|
63
66
|
prerelease: false
|
64
67
|
version_requirements: !ruby/object:Gem::Requirement
|
65
68
|
requirements:
|
66
69
|
- - "~>"
|
67
70
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0.
|
71
|
+
version: '0.8'
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.8.1
|
69
75
|
- !ruby/object:Gem::Dependency
|
70
76
|
name: active_fedora-noid
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,6 +142,20 @@ dependencies:
|
|
136
142
|
- - "~>"
|
137
143
|
- !ruby/object:Gem::Version
|
138
144
|
version: 0.1.2
|
145
|
+
- !ruby/object:Gem::Dependency
|
146
|
+
name: solrizer
|
147
|
+
requirement: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - "~>"
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '3.4'
|
152
|
+
type: :runtime
|
153
|
+
prerelease: false
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - "~>"
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '3.4'
|
139
159
|
- !ruby/object:Gem::Dependency
|
140
160
|
name: bundler
|
141
161
|
requirement: !ruby/object:Gem::Requirement
|
@@ -187,7 +207,6 @@ files:
|
|
187
207
|
- app/indexers/curation_concerns/collection_indexer.rb
|
188
208
|
- app/indexers/curation_concerns/file_set_indexer.rb
|
189
209
|
- app/indexers/curation_concerns/work_indexer.rb
|
190
|
-
- app/jobs/active_fedora_id_based_job.rb
|
191
210
|
- app/jobs/audit_job.rb
|
192
211
|
- app/jobs/characterize_job.rb
|
193
212
|
- app/jobs/create_derivatives_job.rb
|
@@ -278,9 +297,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
278
297
|
version: '0'
|
279
298
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
280
299
|
requirements:
|
281
|
-
- - "
|
300
|
+
- - ">"
|
282
301
|
- !ruby/object:Gem::Version
|
283
|
-
version:
|
302
|
+
version: 1.3.1
|
284
303
|
requirements: []
|
285
304
|
rubyforge_project:
|
286
305
|
rubygems_version: 2.5.1
|