ddr-models 3.0.0.beta.4 → 3.0.0.beta.6
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/models/collection.rb +1 -1
- data/lib/ddr/events.rb +1 -0
- data/lib/ddr/events/migration_event.rb +9 -0
- data/lib/ddr/index.rb +0 -1
- data/lib/ddr/index/fields.rb +1 -0
- data/lib/ddr/index/query.rb +9 -0
- data/lib/ddr/jobs/fits_file_characterization.rb +2 -2
- data/lib/ddr/managers/derivatives_manager.rb +2 -2
- data/lib/ddr/managers/permanent_id_manager.rb +2 -2
- data/lib/ddr/models/attached_files_profile.rb +5 -1
- data/lib/ddr/models/base.rb +4 -8
- data/lib/ddr/models/event_loggable.rb +1 -1
- data/lib/ddr/models/file_management.rb +1 -1
- data/lib/ddr/models/has_admin_metadata.rb +1 -1
- data/lib/ddr/models/has_content.rb +5 -4
- data/lib/ddr/models/has_struct_metadata.rb +2 -2
- data/lib/ddr/models/indexing.rb +17 -14
- data/lib/ddr/models/metadata/metadata_vocabularies.rb +2 -2
- data/lib/ddr/models/search/search_builder.rb +2 -2
- data/lib/ddr/models/version.rb +1 -1
- data/lib/ddr/models/year_facet.rb +1 -1
- data/lib/ddr/notifications.rb +1 -0
- data/spec/auth/effective_permissions_spec.rb +1 -1
- data/spec/auth/effective_roles_spec.rb +1 -1
- data/spec/auth/roles/role_set_query_spec.rb +5 -5
- data/spec/factories/role_factories.rb +1 -1
- data/spec/index/query_spec.rb +22 -0
- data/spec/models/active_fedora_datastream_spec.rb +3 -2
- data/spec/models/collection_spec.rb +1 -1
- data/spec/models/effective_license_spec.rb +3 -3
- data/spec/models/events_spec.rb +57 -54
- data/spec/models/has_admin_metadata_spec.rb +1 -1
- data/spec/models/indexing_spec.rb +40 -27
- data/spec/models/solr_document_spec.rb +2 -2
- data/spec/spec_helper.rb +0 -4
- data/spec/support/shared_examples_for_describables.rb +7 -17
- data/spec/support/shared_examples_for_governables.rb +2 -2
- data/spec/support/shared_examples_for_has_content.rb +22 -29
- data/spec/support/shared_examples_for_indexing.rb +9 -9
- data/spec/support/shared_examples_for_non_collection_models.rb +1 -1
- metadata +3 -3
- data/lib/ddr/index/filters.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 459b647ededb659adc26f3d0a4ac39fcec9d7bdb
|
4
|
+
data.tar.gz: 750255ea83e547d666bc18e35c90bff4a9785659
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1245520f4f5221511c40edd77182a008c2ca0d21ba0c3e8424795e93fedccf2cf008087151ec7c577c3f334d2d9fd91574ea48b171133cbf3166ddff3026fbf7
|
7
|
+
data.tar.gz: 4d0b4daed25e1a942fe46805c8c52e771a92128d5c2d9721fc492d852d2485c077a71aaac28a6dded20c05361a2a3e89e7deb80a5f0ed1275bf55ae425459bb2
|
data/app/models/collection.rb
CHANGED
@@ -24,7 +24,7 @@ class Collection < Ddr::Models::Base
|
|
24
24
|
# @return A lazy enumerator of SolrDocuments.
|
25
25
|
def components_from_solr
|
26
26
|
query = "#{Ddr::Index::Fields::COLLECTION_URI}:#{RSolr.solr_escape(id)}"
|
27
|
-
filter = ActiveFedora::
|
27
|
+
filter = ActiveFedora::SolrQueryBuilder.construct_query_for_rel(:has_model => Component.to_class_uri)
|
28
28
|
results = ActiveFedora::SolrService.query(query, fq: filter, rows: 100000)
|
29
29
|
results.lazy.map {|doc| SolrDocument.new(doc)}
|
30
30
|
end
|
data/lib/ddr/events.rb
CHANGED
data/lib/ddr/index.rb
CHANGED
data/lib/ddr/index/fields.rb
CHANGED
@@ -13,6 +13,7 @@ module Ddr::Index
|
|
13
13
|
BOX_NUMBER_FACET = Field.new :box_number_facet, :facetable
|
14
14
|
COLLECTION_FACET = Field.new :collection_facet, :facetable
|
15
15
|
COLLECTION_URI = Field.new :collection_uri, :symbol
|
16
|
+
CONTENT_CREATE_DATE = Field.new :content_create_date, :stored_sortable, type: :date
|
16
17
|
CONTENT_SIZE = Field.new :content_size, solr_name: "content_size_lsi"
|
17
18
|
CONTENT_SIZE_HUMAN = Field.new :content_size_human, :symbol
|
18
19
|
CONTRIBUTOR_FACET = Field.new :contributor_facet, :facetable
|
data/lib/ddr/index/query.rb
CHANGED
@@ -52,5 +52,14 @@ module Ddr::Index
|
|
52
52
|
self
|
53
53
|
end
|
54
54
|
|
55
|
+
def ==(other)
|
56
|
+
other.instance_of?(self.class) &&
|
57
|
+
other.q == self.q &&
|
58
|
+
other.fields == self.fields &&
|
59
|
+
other.filters == self.filters &&
|
60
|
+
other.rows == self.rows &&
|
61
|
+
other.sort == self.sort
|
62
|
+
end
|
63
|
+
|
55
64
|
end
|
56
65
|
end
|
@@ -63,8 +63,8 @@ module Ddr
|
|
63
63
|
|
64
64
|
class DerivativeJob
|
65
65
|
@queue = :derivatives
|
66
|
-
def self.perform(
|
67
|
-
object = ActiveFedora::Base.find(
|
66
|
+
def self.perform(id, derivative_name)
|
67
|
+
object = ActiveFedora::Base.find(id)
|
68
68
|
derivative = Ddr::Derivatives::DERIVATIVES[derivative_name.to_sym]
|
69
69
|
object.derivatives.update_derivative(derivative)
|
70
70
|
end
|
@@ -10,7 +10,11 @@ module Ddr::Models
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def attributes
|
13
|
-
files_hash.keys.each_with_object({})
|
13
|
+
files_hash.keys.each_with_object({}) do |key, memo|
|
14
|
+
unless files_hash[key].destroyed?
|
15
|
+
memo[key.to_s] = nil
|
16
|
+
end
|
17
|
+
end
|
14
18
|
end
|
15
19
|
|
16
20
|
def read_attribute_for_serialization(key)
|
data/lib/ddr/models/base.rb
CHANGED
@@ -22,10 +22,6 @@ module Ddr::Models
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
def self.find_by_identifier(identifier)
|
26
|
-
find(Ddr::Index::Fields::IDENTIFIER_ALL => identifier)
|
27
|
-
end
|
28
|
-
|
29
25
|
def inspect
|
30
26
|
"#<#{model_and_id}, uri: \"#{uri}\">"
|
31
27
|
end
|
@@ -57,9 +53,9 @@ module Ddr::Models
|
|
57
53
|
arg = args.pop
|
58
54
|
terms = case arg.to_sym
|
59
55
|
when :empty
|
60
|
-
desc_metadata_terms.select { |t|
|
56
|
+
desc_metadata_terms.select { |t| desc_metadata.values(t).empty? }
|
61
57
|
when :present
|
62
|
-
desc_metadata_terms.select { |t|
|
58
|
+
desc_metadata_terms.select { |t| desc_metadata.values(t).present? }
|
63
59
|
when :defined_attributes
|
64
60
|
desc_metadata_terms & desc_metadata_attributes
|
65
61
|
when :required
|
@@ -97,10 +93,10 @@ module Ddr::Models
|
|
97
93
|
desc_metadata.set_values(term, values)
|
98
94
|
end
|
99
95
|
|
100
|
-
# Update all
|
96
|
+
# Update all desc_metadata terms with values in hash
|
101
97
|
# Note that term not having key in hash will be set to nil!
|
102
98
|
def set_desc_metadata(term_values_hash)
|
103
|
-
desc_metadata_terms.each { |t|
|
99
|
+
desc_metadata_terms.each { |t| desc_metadata.set_values(t, term_values_hash[t]) }
|
104
100
|
end
|
105
101
|
|
106
102
|
def attached_files_profile
|
@@ -17,7 +17,9 @@ module Ddr
|
|
17
17
|
|
18
18
|
around_save :update_derivatives, if: :content_changed?
|
19
19
|
|
20
|
-
|
20
|
+
before_save if: :re_characterize? do
|
21
|
+
fits.delete(eradicate: true)
|
22
|
+
end
|
21
23
|
|
22
24
|
delegate :validate_checksum!, to: :content
|
23
25
|
end
|
@@ -116,9 +118,8 @@ module Ddr
|
|
116
118
|
derivatives.update_derivatives(:later)
|
117
119
|
end
|
118
120
|
|
119
|
-
def
|
120
|
-
|
121
|
-
Resque.enqueue(Ddr::Jobs::FitsFileCharacterization, pid)
|
121
|
+
def re_characterize?
|
122
|
+
content_changed? && !fits.new_record?
|
122
123
|
end
|
123
124
|
|
124
125
|
def default_content_type
|
@@ -26,13 +26,13 @@ module Ddr
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def multires_image_file_paths(type='default')
|
29
|
-
::SolrDocument.find(
|
29
|
+
::SolrDocument.find(id).multires_image_file_paths(type)
|
30
30
|
end
|
31
31
|
|
32
32
|
private
|
33
33
|
|
34
34
|
def find_children
|
35
|
-
query = ActiveFedora::
|
35
|
+
query = ActiveFedora::SolrQueryBuilder.construct_query_for_rel([[ self.class.reflect_on_association(:children), self.id ]])
|
36
36
|
sort = "#{Ddr::Index::Fields::LOCAL_ID} ASC, #{Ddr::Index::Fields::OBJECT_CREATE_DATE} ASC"
|
37
37
|
ActiveFedora::SolrService.query(query, sort: sort, rows: 999999)
|
38
38
|
end
|
data/lib/ddr/models/indexing.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'time'
|
2
|
+
|
1
3
|
module Ddr
|
2
4
|
module Models
|
3
5
|
module Indexing
|
@@ -19,10 +21,10 @@ module Ddr
|
|
19
21
|
ADMIN_SET => admin_set,
|
20
22
|
ASPACE_ID => aspace_id,
|
21
23
|
ATTACHED_FILES => attached_files_profile.to_json,
|
22
|
-
BOX_NUMBER_FACET =>
|
23
|
-
CONTRIBUTOR_FACET =>
|
24
|
-
CREATOR_FACET =>
|
25
|
-
DATE_FACET =>
|
24
|
+
BOX_NUMBER_FACET => desc_metadata.values('box_number'),
|
25
|
+
CONTRIBUTOR_FACET => desc_metadata.values('contributor'),
|
26
|
+
CREATOR_FACET => desc_metadata.creator,
|
27
|
+
DATE_FACET => desc_metadata.date,
|
26
28
|
DATE_SORT => date_sort,
|
27
29
|
DEPOSITOR => depositor,
|
28
30
|
DISPLAY_FORMAT => display_format,
|
@@ -35,14 +37,14 @@ module Ddr
|
|
35
37
|
PERMANENT_ID => permanent_id,
|
36
38
|
PERMANENT_URL => permanent_url,
|
37
39
|
POLICY_ROLE => roles.in_policy_scope.agents,
|
38
|
-
PUBLISHER_FACET =>
|
40
|
+
PUBLISHER_FACET => desc_metadata.publisher,
|
39
41
|
RESEARCH_HELP_CONTACT => research_help_contact,
|
40
42
|
RESOURCE_ROLE => roles.in_resource_scope.agents,
|
41
|
-
SERIES_FACET =>
|
42
|
-
SPATIAL_FACET =>
|
43
|
-
SUBJECT_FACET =>
|
43
|
+
SERIES_FACET => desc_metadata.values('series'),
|
44
|
+
SPATIAL_FACET => desc_metadata.values('spatial'),
|
45
|
+
SUBJECT_FACET => desc_metadata.values('subject'),
|
44
46
|
TITLE => title_display,
|
45
|
-
TYPE_FACET =>
|
47
|
+
TYPE_FACET => desc_metadata.type,
|
46
48
|
WORKFLOW_STATE => workflow_state,
|
47
49
|
YEAR_FACET => year_facet,
|
48
50
|
}
|
@@ -56,6 +58,7 @@ module Ddr
|
|
56
58
|
end
|
57
59
|
if has_content?
|
58
60
|
fields[ORIGINAL_FILENAME] = original_filename
|
61
|
+
fields[CONTENT_CREATE_DATE] = Ddr::Utils.solr_date(content.create_date)
|
59
62
|
fields[CONTENT_SIZE] = content_size
|
60
63
|
fields[CONTENT_SIZE_HUMAN] = content_human_size
|
61
64
|
fields[MEDIA_TYPE] = content_type
|
@@ -87,14 +90,14 @@ module Ddr
|
|
87
90
|
end
|
88
91
|
|
89
92
|
def title_display
|
90
|
-
return
|
91
|
-
return
|
93
|
+
return desc_metadata.title.first if desc_metadata.title.present?
|
94
|
+
return desc_metadata.identifier.first if desc_metadata.identifier.present?
|
92
95
|
return original_filename if respond_to?(:original_filename) && original_filename.present?
|
93
|
-
"[#{
|
96
|
+
"[#{id}]"
|
94
97
|
end
|
95
98
|
|
96
99
|
def all_identifiers
|
97
|
-
|
100
|
+
desc_metadata.identifier + [local_id, permanent_id, id].compact
|
98
101
|
end
|
99
102
|
|
100
103
|
def associated_collection
|
@@ -114,7 +117,7 @@ module Ddr
|
|
114
117
|
end
|
115
118
|
|
116
119
|
def date_sort
|
117
|
-
|
120
|
+
desc_metadata.date.first
|
118
121
|
end
|
119
122
|
|
120
123
|
def year_facet
|
@@ -3,11 +3,11 @@ module Ddr::Models
|
|
3
3
|
module MetadataVocabularies
|
4
4
|
|
5
5
|
def dc11
|
6
|
-
MetadataVocabulary.new(RDF::DC11)
|
6
|
+
MetadataVocabulary.new(RDF::Vocab::DC11)
|
7
7
|
end
|
8
8
|
|
9
9
|
def dcterms
|
10
|
-
MetadataVocabulary.new(RDF::DC, except: RDF::DC.license)
|
10
|
+
MetadataVocabulary.new(RDF::Vocab::DC, except: RDF::Vocab::DC.license)
|
11
11
|
end
|
12
12
|
|
13
13
|
def duketerms
|
@@ -40,13 +40,13 @@ module Ddr::Models
|
|
40
40
|
def policy_role_filters
|
41
41
|
if policy_role_policies.present?
|
42
42
|
rels = policy_role_policies.map { |pid| [:isGovernedBy, pid] }
|
43
|
-
ActiveFedora::
|
43
|
+
ActiveFedora::SolrQueryBuilder.construct_query_for_rel(rels, " OR ")
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
def resource_role_filters
|
48
48
|
current_ability.agents.map do |agent|
|
49
|
-
ActiveFedora::
|
49
|
+
ActiveFedora::SolrQueryBuilder.raw_query(Ddr::Index::Fields::RESOURCE_ROLE, agent)
|
50
50
|
end.join(" OR ")
|
51
51
|
end
|
52
52
|
|
data/lib/ddr/models/version.rb
CHANGED
data/lib/ddr/notifications.rb
CHANGED
@@ -2,7 +2,7 @@ module Ddr::Auth
|
|
2
2
|
RSpec.describe EffectivePermissions do
|
3
3
|
|
4
4
|
let(:resource) { FactoryGirl.build(:item) }
|
5
|
-
let(:policy) { Collection.new(
|
5
|
+
let(:policy) { Collection.new(id: "coll-1") }
|
6
6
|
let(:agents) { [ "Editors", "bob@example.com" ] }
|
7
7
|
|
8
8
|
before do
|
@@ -4,7 +4,7 @@ module Ddr::Auth
|
|
4
4
|
let(:resource) { FactoryGirl.build(:item) }
|
5
5
|
let(:policy) { Collection.new(id: "coll-1") }
|
6
6
|
let(:agents) { [ "Editors", "bob@example.com", "public" ] }
|
7
|
-
let(:editor) { Roles::Role.
|
7
|
+
let(:editor) { Roles::Role.new role_type: "Editor", agent: "Editors", scope: "policy" }
|
8
8
|
let(:downloader) { FactoryGirl.build(:role, :downloader, :public) }
|
9
9
|
|
10
10
|
before do
|
@@ -12,11 +12,11 @@ module Ddr::Auth
|
|
12
12
|
let(:contributor_group) { "Contributors" }
|
13
13
|
let(:downloader_group) { "Downloaders" }
|
14
14
|
let(:viewer_group) { "Viewers" }
|
15
|
-
let(:contributor_role) { Role.
|
16
|
-
let(:downloader_role) { Role.
|
17
|
-
let(:editor_role) { Role.
|
18
|
-
let(:curator_role) { Role.
|
19
|
-
let(:viewer_role) { Role.
|
15
|
+
let(:contributor_role) { Role.new(role_type: "Contributor", agent: contributor_group, scope: "resource") }
|
16
|
+
let(:downloader_role) { Role.new(role_type: "Downloader", agent: downloader_group, scope: "resource") }
|
17
|
+
let(:editor_role) { Role.new(role_type: "Editor", agent: editor, scope: "resource") }
|
18
|
+
let(:curator_role) { Role.new(role_type: "Curator", agent: curator, scope: "policy") }
|
19
|
+
let(:viewer_role) { Role.new(role_type: "Viewer", agent: viewer_group, scope: "policy") }
|
20
20
|
let(:policy_roles) { [curator_role, viewer_role] }
|
21
21
|
let(:resource_roles) { [contributor_role, downloader_role, editor_role] }
|
22
22
|
|
@@ -2,7 +2,7 @@ FactoryGirl.define do
|
|
2
2
|
|
3
3
|
factory :role, class: Ddr::Auth::Roles::Role do
|
4
4
|
|
5
|
-
initialize_with { Ddr::Auth::Roles::Role.
|
5
|
+
initialize_with { Ddr::Auth::Roles::Role.new(attributes) }
|
6
6
|
|
7
7
|
Ddr::Auth::Roles.role_types.each do |rt|
|
8
8
|
trait rt.to_s.downcase.to_sym do
|
data/spec/index/query_spec.rb
CHANGED
@@ -44,5 +44,27 @@ module Ddr::Index
|
|
44
44
|
}
|
45
45
|
end
|
46
46
|
|
47
|
+
describe "equality" do
|
48
|
+
subject {
|
49
|
+
described_class.new do
|
50
|
+
q "foo:bar"
|
51
|
+
where "spam"=>"eggs"
|
52
|
+
fields :id, "foo", "spam"
|
53
|
+
asc "foo"
|
54
|
+
limit 50
|
55
|
+
end
|
56
|
+
}
|
57
|
+
let(:other) do
|
58
|
+
described_class.new do
|
59
|
+
q "foo:bar"
|
60
|
+
where "spam"=>"eggs"
|
61
|
+
fields :id, "foo", "spam"
|
62
|
+
asc "foo"
|
63
|
+
limit 50
|
64
|
+
end
|
65
|
+
end
|
66
|
+
it { is_expected.to eq other }
|
67
|
+
end
|
68
|
+
|
47
69
|
end
|
48
70
|
end
|
@@ -14,7 +14,7 @@ module ActiveFedora
|
|
14
14
|
before do
|
15
15
|
subject.content = file.read
|
16
16
|
subject.mime_type = file.content_type
|
17
|
-
allow(subject).to receive(:
|
17
|
+
allow(subject).to receive(:id) { "test-1" }
|
18
18
|
end
|
19
19
|
describe "the yielded file" do
|
20
20
|
it "should by default have an extension for the datastream media type" do
|
@@ -43,6 +43,7 @@ module ActiveFedora
|
|
43
43
|
end
|
44
44
|
describe "when the file has no id" do
|
45
45
|
it "should be NEW" do
|
46
|
+
allow(subject).to receive(:id) { nil }
|
46
47
|
subject.tempfile do |f|
|
47
48
|
expect(::File.basename(f.path).start_with?("NEW--")).to be true
|
48
49
|
end
|
@@ -78,7 +79,7 @@ module ActiveFedora
|
|
78
79
|
context "with persisted content" do
|
79
80
|
before do
|
80
81
|
allow(subject).to receive(:new_record?) { false }
|
81
|
-
allow(subject).to receive(:
|
82
|
+
allow(subject).to receive(:id) { "foobar-1" }
|
82
83
|
allow(subject).to receive(:checksum) { checksum }
|
83
84
|
end
|
84
85
|
context "and the repository internal checksum in invalid" do
|
@@ -35,7 +35,7 @@ RSpec.describe Collection, type: :model do
|
|
35
35
|
let(:user) { FactoryGirl.build(:user) }
|
36
36
|
before { subject.grant_roles_to_creator(user) }
|
37
37
|
it "should include Curator roles in both resource abd policy scopes" do
|
38
|
-
expect(subject.roles.to_a).to eq([Ddr::Auth::Roles::Role.
|
38
|
+
expect(subject.roles.to_a).to eq([Ddr::Auth::Roles::Role.new(role_type: "Curator", agent: user.agent, scope: "resource"), Ddr::Auth::Roles::Role.new(role_type: "Curator", agent: user.agent, scope: "policy")])
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -7,9 +7,9 @@ module Ddr::Models
|
|
7
7
|
|
8
8
|
let(:license) { License.new(url: url) }
|
9
9
|
|
10
|
-
let(:obj) { Component.new(
|
11
|
-
let(:parent) { Item.new(
|
12
|
-
let(:admin_policy) { Collection.new(
|
10
|
+
let(:obj) { Component.new(id: "test-1") }
|
11
|
+
let(:parent) { Item.new(id: "test-2") }
|
12
|
+
let(:admin_policy) { Collection.new(id: "test-3") }
|
13
13
|
|
14
14
|
describe "when the object has a license" do
|
15
15
|
before do
|
data/spec/models/events_spec.rb
CHANGED
@@ -1,73 +1,76 @@
|
|
1
|
-
require 'spec_helper'
|
2
1
|
require 'support/shared_examples_for_events'
|
3
2
|
|
4
|
-
module Ddr
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
end
|
3
|
+
module Ddr::Events
|
4
|
+
RSpec.describe Event, type: :model, events: true do
|
5
|
+
it_behaves_like "an event"
|
6
|
+
end
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
8
|
+
RSpec.describe UpdateEvent, type: :model, events: true do
|
9
|
+
it_behaves_like "an event"
|
10
|
+
it "should have a display type" do
|
11
|
+
expect(subject.display_type).to eq "Update"
|
15
12
|
end
|
13
|
+
end
|
16
14
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
15
|
+
RSpec.describe CreationEvent, type: :model, events: true do
|
16
|
+
it_behaves_like "an event"
|
17
|
+
it_behaves_like "a preservation-related event"
|
18
|
+
it "should have a display type" do
|
19
|
+
expect(subject.display_type).to eq "Creation"
|
23
20
|
end
|
21
|
+
end
|
24
22
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
23
|
+
RSpec.describe FixityCheckEvent, type: :model, events: true do
|
24
|
+
it_behaves_like "an event"
|
25
|
+
it_behaves_like "a preservation-related event"
|
26
|
+
it_behaves_like "an event that reindexes its object after save"
|
27
|
+
it "should have a display type" do
|
28
|
+
expect(subject.display_type).to eq "Fixity Check"
|
29
|
+
end
|
30
|
+
describe "defaults" do
|
31
|
+
it "should set software to the Fedora repository version" do
|
32
|
+
pending "Fedora 4 API for getting repository version"
|
33
|
+
expect(subject.software).to match /^Fedora Repository \d\.\d\.\d$/
|
37
34
|
end
|
38
35
|
end
|
36
|
+
end
|
39
37
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
end
|
38
|
+
RSpec.describe VirusCheckEvent, type: :model, events: true do
|
39
|
+
it_behaves_like "an event"
|
40
|
+
it_behaves_like "a preservation-related event"
|
41
|
+
it_behaves_like "an event that reindexes its object after save"
|
42
|
+
it "should have a display type" do
|
43
|
+
expect(subject.display_type).to eq "Virus Check"
|
47
44
|
end
|
45
|
+
end
|
48
46
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
47
|
+
RSpec.describe IngestionEvent, type: :model, events: true do
|
48
|
+
it_behaves_like "an event"
|
49
|
+
it_behaves_like "a preservation-related event"
|
50
|
+
it "should have a display type" do
|
51
|
+
expect(subject.display_type).to eq "Ingestion"
|
55
52
|
end
|
53
|
+
end
|
56
54
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
55
|
+
RSpec.describe ValidationEvent, type: :model, events: true do
|
56
|
+
it_behaves_like "an event"
|
57
|
+
it_behaves_like "a preservation-related event"
|
58
|
+
it "should have a display type" do
|
59
|
+
expect(subject.display_type).to eq "Validation"
|
63
60
|
end
|
61
|
+
end
|
64
62
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
end
|
63
|
+
RSpec.describe DeletionEvent, type: :model, events: true do
|
64
|
+
it_behaves_like "an event"
|
65
|
+
it_behaves_like "a preservation-related event"
|
66
|
+
it "should have a display type" do
|
67
|
+
expect(subject.display_type).to eq "Deletion"
|
71
68
|
end
|
72
69
|
end
|
70
|
+
|
71
|
+
RSpec.describe MigrationEvent, type: :model, events: true do
|
72
|
+
it_behaves_like "an event"
|
73
|
+
it_behaves_like "a preservation-related event"
|
74
|
+
its(:display_type) { is_expected.to eq "Migration" }
|
75
|
+
end
|
73
76
|
end
|
@@ -163,7 +163,7 @@ module Ddr::Models
|
|
163
163
|
describe "#grant_roles_to_creator" do
|
164
164
|
let(:user) { FactoryGirl.build(:user) }
|
165
165
|
before { subject.grant_roles_to_creator(user) }
|
166
|
-
its(:roles) { should include(Ddr::Auth::Roles::Role.
|
166
|
+
its(:roles) { should include(Ddr::Auth::Roles::Role.new(role_type: "Editor", agent: user.agent, scope: "resource")) }
|
167
167
|
end
|
168
168
|
|
169
169
|
describe "persistence" do
|
@@ -1,37 +1,50 @@
|
|
1
1
|
module Ddr::Models
|
2
2
|
RSpec.describe Indexing do
|
3
3
|
|
4
|
-
|
4
|
+
subject { obj.index_fields }
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
let(:role3) { FactoryGirl.build(:role, :editor, :group, :policy) }
|
9
|
-
let(:role4) { FactoryGirl.build(:role, :editor, :person, :policy) }
|
6
|
+
describe "general indexing" do
|
7
|
+
let(:obj) { FactoryGirl.build(:item) }
|
10
8
|
|
11
|
-
|
9
|
+
let(:role1) { FactoryGirl.build(:role, :curator, :person, :resource) }
|
10
|
+
let(:role2) { FactoryGirl.build(:role, :curator, :person, :policy) }
|
11
|
+
let(:role3) { FactoryGirl.build(:role, :editor, :group, :policy) }
|
12
|
+
let(:role4) { FactoryGirl.build(:role, :editor, :person, :policy) }
|
13
|
+
|
14
|
+
before do
|
15
|
+
obj.license = "cc-by-nc-nd-40"
|
16
|
+
obj.local_id = "foo"
|
17
|
+
obj.doi << "http://doi.org/10.1000/182"
|
18
|
+
obj.permanent_id = "ark:/99999/fk4zzz"
|
19
|
+
obj.permanent_url = "http://id.library.duke.edu/ark:/99999/fk4zzz"
|
20
|
+
obj.display_format = "Image"
|
21
|
+
obj.roles.grant role1, role2, role3, role4
|
22
|
+
obj.aspace_id = "aspace_dccea43034e1b8261e14cf999e86449d"
|
23
|
+
obj.fcrepo3_pid = "duke:1"
|
24
|
+
end
|
25
|
+
|
26
|
+
its([Indexing::LICENSE]) { is_expected.to eq("cc-by-nc-nd-40") }
|
27
|
+
its([Indexing::LOCAL_ID]) { is_expected.to eq("foo") }
|
28
|
+
its([Indexing::DOI]) { is_expected.to eq(["http://doi.org/10.1000/182"]) }
|
29
|
+
its([Indexing::PERMANENT_ID]) { is_expected.to eq("ark:/99999/fk4zzz") }
|
30
|
+
its([Indexing::PERMANENT_URL]) { is_expected.to eq("http://id.library.duke.edu/ark:/99999/fk4zzz") }
|
31
|
+
its([Indexing::DISPLAY_FORMAT]) { is_expected.to eq("Image") }
|
32
|
+
its([Indexing::ACCESS_ROLE]) { is_expected.to eq(obj.roles.to_json) }
|
33
|
+
its([Indexing::ASPACE_ID]) { is_expected.to eq("aspace_dccea43034e1b8261e14cf999e86449d") }
|
34
|
+
its([Indexing::POLICY_ROLE]) { is_expected.to contain_exactly(role2.agent, role3.agent, role4.agent) }
|
35
|
+
its([Indexing::RESOURCE_ROLE]) { is_expected.to contain_exactly(role1.agent) }
|
36
|
+
its([Indexing::FCREPO3_PID]) { is_expected.to eq("duke:1") }
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "content-bearing object indexing" do
|
40
|
+
let(:obj) { FactoryGirl.create(:component) }
|
41
|
+
let!(:create_date) { DateTime.parse("2016-01-22T21:50:33Z") }
|
42
|
+
before {
|
43
|
+
allow(obj.content).to receive(:create_date) { create_date }
|
44
|
+
}
|
12
45
|
|
13
|
-
|
14
|
-
obj.license = "cc-by-nc-nd-40"
|
15
|
-
obj.local_id = "foo"
|
16
|
-
obj.doi << "http://doi.org/10.1000/182"
|
17
|
-
obj.permanent_id = "ark:/99999/fk4zzz"
|
18
|
-
obj.permanent_url = "http://id.library.duke.edu/ark:/99999/fk4zzz"
|
19
|
-
obj.display_format = "Image"
|
20
|
-
obj.roles.grant role1, role2, role3, role4
|
21
|
-
obj.aspace_id = "aspace_dccea43034e1b8261e14cf999e86449d"
|
22
|
-
obj.fcrepo3_pid = "duke:1"
|
46
|
+
its([Indexing::CONTENT_CREATE_DATE]) { is_expected.to eq "2016-01-22T21:50:33Z" }
|
23
47
|
end
|
24
48
|
|
25
|
-
its([Indexing::LICENSE]) { is_expected.to eq("cc-by-nc-nd-40") }
|
26
|
-
its([Indexing::LOCAL_ID]) { is_expected.to eq("foo") }
|
27
|
-
its([Indexing::DOI]) { is_expected.to eq(["http://doi.org/10.1000/182"]) }
|
28
|
-
its([Indexing::PERMANENT_ID]) { is_expected.to eq("ark:/99999/fk4zzz") }
|
29
|
-
its([Indexing::PERMANENT_URL]) { is_expected.to eq("http://id.library.duke.edu/ark:/99999/fk4zzz") }
|
30
|
-
its([Indexing::DISPLAY_FORMAT]) { is_expected.to eq("Image") }
|
31
|
-
its([Indexing::ACCESS_ROLE]) { is_expected.to eq(obj.roles.to_json) }
|
32
|
-
its([Indexing::ASPACE_ID]) { is_expected.to eq("aspace_dccea43034e1b8261e14cf999e86449d") }
|
33
|
-
its([Indexing::POLICY_ROLE]) { is_expected.to contain_exactly(role2.agent, role3.agent, role4.agent) }
|
34
|
-
its([Indexing::RESOURCE_ROLE]) { is_expected.to contain_exactly(role1.agent) }
|
35
|
-
its([Indexing::FCREPO3_PID]) { is_expected.to eq("duke:1") }
|
36
49
|
end
|
37
50
|
end
|
@@ -86,8 +86,8 @@ RSpec.describe SolrDocument, type: :model, contacts: true do
|
|
86
86
|
before { subject[Ddr::Index::Fields::ACCESS_ROLE] = json }
|
87
87
|
it "should deserialize the roles from JSON" do
|
88
88
|
expect(subject.roles.to_a)
|
89
|
-
.to eq([Ddr::Auth::Roles::Role.
|
90
|
-
Ddr::Auth::Roles::Role.
|
89
|
+
.to eq([Ddr::Auth::Roles::Role.new(role_type: "Editor", agent: "Editors", scope: "policy"),
|
90
|
+
Ddr::Auth::Roles::Role.new(role_type: "Contributor", agent: "bob@example.com", scope: "resource")])
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
data/spec/spec_helper.rb
CHANGED
@@ -26,10 +26,6 @@ Dir[File.join(File.dirname(__FILE__), "support", "*.rb")].each { |f| require f }
|
|
26
26
|
require "database_cleaner"
|
27
27
|
DatabaseCleaner.strategy = :truncation
|
28
28
|
|
29
|
-
# Silence deprecation warnings
|
30
|
-
warn "WARNING: Default deprecation behavior set to :silence!"
|
31
|
-
Deprecation.default_deprecation_behavior = :silence
|
32
|
-
|
33
29
|
RSpec.configure do |config|
|
34
30
|
|
35
31
|
config.include ActionDispatch::TestProcess
|
@@ -2,16 +2,6 @@ RSpec.shared_examples "a describable object" do
|
|
2
2
|
|
3
3
|
let(:object) { described_class.new }
|
4
4
|
|
5
|
-
describe "having an identifier" do
|
6
|
-
before do
|
7
|
-
object.descMetadata.identifier = ["id001"]
|
8
|
-
object.save(validate: false)
|
9
|
-
end
|
10
|
-
it "should be findable by identifier" do
|
11
|
-
expect(described_class.find_by_identifier('id001')).to include object
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
5
|
describe "#desc_metadata_terms" do
|
16
6
|
it "should have a default value" do
|
17
7
|
expect(object.desc_metadata_terms).to match_array(Ddr::Models::DescriptiveMetadata.unqualified_names)
|
@@ -28,9 +18,9 @@ RSpec.shared_examples "a describable object" do
|
|
28
18
|
end
|
29
19
|
context "with variable results" do
|
30
20
|
before do
|
31
|
-
object.
|
32
|
-
object.
|
33
|
-
object.
|
21
|
+
object.desc_metadata.title = ["Object Title"]
|
22
|
+
object.desc_metadata.creator = ["Duke University Libraries"]
|
23
|
+
object.desc_metadata.identifier = ["id001"]
|
34
24
|
object.save
|
35
25
|
end
|
36
26
|
it "should accept an :empty argument" do
|
@@ -44,9 +34,9 @@ RSpec.shared_examples "a describable object" do
|
|
44
34
|
end
|
45
35
|
describe "#set_desc_metadata" do
|
46
36
|
let(:term_values_hash) { object.desc_metadata_terms.each_with_object({}) {|t, memo| memo[t] = ["Value"]} }
|
47
|
-
it "should set the
|
37
|
+
it "should set the desc_metadata terms to the values of the matching keys in the hash" do
|
48
38
|
object.desc_metadata_terms.each do |t|
|
49
|
-
expect(object).to receive(:
|
39
|
+
expect(object.desc_metadata).to receive(:set_values).with(t, ["Value"])
|
50
40
|
end
|
51
41
|
object.set_desc_metadata(term_values_hash)
|
52
42
|
end
|
@@ -55,13 +45,13 @@ RSpec.shared_examples "a describable object" do
|
|
55
45
|
context "when values == nil" do
|
56
46
|
it "should set the term to an empty value" do
|
57
47
|
object.set_desc_metadata_values(:title, nil)
|
58
|
-
expect(object.
|
48
|
+
expect(object.desc_metadata.title).to be_empty
|
59
49
|
end
|
60
50
|
end
|
61
51
|
context "when values is an array" do
|
62
52
|
it "should reject empty values from the array" do
|
63
53
|
object.set_desc_metadata_values(:title, ["Object Title", nil, "Alternative Title", ""])
|
64
|
-
expect(object.
|
54
|
+
expect(object.desc_metadata.title).to eq ["Object Title", "Alternative Title"]
|
65
55
|
end
|
66
56
|
end
|
67
57
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
RSpec.shared_examples "a governable object" do
|
2
2
|
let(:object) do
|
3
3
|
described_class.new.tap do |obj|
|
4
|
-
obj.
|
5
|
-
obj.
|
4
|
+
obj.desc_metadata.title = [ 'Describable' ]
|
5
|
+
obj.desc_metadata.identifier = [ 'id001' ]
|
6
6
|
obj.save(validate: false)
|
7
7
|
end
|
8
8
|
end
|
@@ -56,22 +56,6 @@ RSpec.shared_examples "an object that can have content" do
|
|
56
56
|
expect(subject.derivatives).to receive(:update_derivatives)
|
57
57
|
subject.save
|
58
58
|
end
|
59
|
-
describe "file characterization" do
|
60
|
-
context "characterize files is false" do
|
61
|
-
before { allow(Ddr::Models).to receive(:characterize_files?) { false } }
|
62
|
-
it "should not enqueue a FITS file characterization job" do
|
63
|
-
expect(Resque).to_not receive(:enqueue).with(Ddr::Jobs::FitsFileCharacterization, instance_of(String))
|
64
|
-
subject.save
|
65
|
-
end
|
66
|
-
end
|
67
|
-
context "characterize files is true" do
|
68
|
-
before { allow(Ddr::Models).to receive(:characterize_files?) { true } }
|
69
|
-
it "should enqueue a FITS file characterization job" do
|
70
|
-
expect(Resque).to receive(:enqueue).with(Ddr::Jobs::FitsFileCharacterization, instance_of(String))
|
71
|
-
subject.save
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
59
|
end
|
76
60
|
|
77
61
|
context "and it's an existing object with content" do
|
@@ -81,20 +65,29 @@ RSpec.shared_examples "an object that can have content" do
|
|
81
65
|
expect(subject.derivatives).to receive(:update_derivatives)
|
82
66
|
subject.upload! file
|
83
67
|
end
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
expect(Resque).to_not receive(:enqueue).with(Ddr::Jobs::FitsFileCharacterization, instance_of(String))
|
89
|
-
subject.upload! file
|
90
|
-
end
|
68
|
+
context "and the file has not previously been characterized" do
|
69
|
+
it "does not try to delete the existing characterization data" do
|
70
|
+
expect(subject.fits).not_to receive(:delete)
|
71
|
+
subject.upload! file
|
91
72
|
end
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
73
|
+
end
|
74
|
+
context "and the file has new characterization data" do
|
75
|
+
before {
|
76
|
+
subject.fits.content = fixture_file_upload("fits/document.xml")
|
77
|
+
}
|
78
|
+
it "preserves the characterization data" do
|
79
|
+
subject.upload! file
|
80
|
+
expect(subject.reload.fits).to have_content
|
81
|
+
end
|
82
|
+
end
|
83
|
+
context "and the file has previously been characterized" do
|
84
|
+
before {
|
85
|
+
subject.fits.content = fixture_file_upload("fits/document.xml")
|
86
|
+
subject.save!
|
87
|
+
}
|
88
|
+
it "deletes the existing characterization data" do
|
89
|
+
subject.upload! file
|
90
|
+
expect(subject.reload.fits).to_not have_content
|
98
91
|
end
|
99
92
|
end
|
100
93
|
end
|
@@ -3,13 +3,13 @@ RSpec.shared_examples "an object that has a display title" do
|
|
3
3
|
let(:object) { described_class.new }
|
4
4
|
subject { object.title_display }
|
5
5
|
context "has title" do
|
6
|
-
before { object.
|
6
|
+
before { object.desc_metadata.title = [ 'Title' ] }
|
7
7
|
it "should return the first title" do
|
8
8
|
expect(subject).to eq('Title')
|
9
9
|
end
|
10
10
|
end
|
11
11
|
context "has no title, has identifier" do
|
12
|
-
before { object.
|
12
|
+
before { object.desc_metadata.identifier = [ 'id001' ] }
|
13
13
|
it "should return the first identifier" do
|
14
14
|
expect(subject).to eq('id001')
|
15
15
|
end
|
@@ -27,8 +27,8 @@ RSpec.shared_examples "an object that has a display title" do
|
|
27
27
|
# end
|
28
28
|
# end
|
29
29
|
context "has no title, no identifier, no original_filename" do
|
30
|
-
let(:object) { described_class.new(:
|
31
|
-
it "should return the
|
30
|
+
let(:object) { described_class.new(id: 'duke-test') }
|
31
|
+
it "should return the id in square brackets" do
|
32
32
|
expect(subject).to eq "[duke-test]"
|
33
33
|
end
|
34
34
|
end
|
@@ -37,22 +37,22 @@ end
|
|
37
37
|
|
38
38
|
RSpec.shared_examples "an object that has identifiers" do
|
39
39
|
describe "#all_identifiers" do
|
40
|
-
let(:object) { described_class.new(
|
40
|
+
let(:object) { described_class.new(id: 'test-3') }
|
41
41
|
subject { object.all_identifiers }
|
42
|
-
context "has descriptive identifiers, local ID, permanent ID, and
|
42
|
+
context "has descriptive identifiers, local ID, permanent ID, and id" do
|
43
43
|
before do
|
44
|
-
object.
|
44
|
+
object.desc_metadata.identifier = [ 'ID001', 'ID002' ]
|
45
45
|
object.local_id = 'LOCAL_ID_A'
|
46
46
|
object.permanent_id = 'ark:/999999/cd3'
|
47
47
|
end
|
48
48
|
it "should return all the identifiers" do
|
49
|
-
expect(subject).to match_array([ 'ID001', 'ID002', 'LOCAL_ID_A', 'ark:/999999/cd3', 'test
|
49
|
+
expect(subject).to match_array([ 'ID001', 'ID002', 'LOCAL_ID_A', 'ark:/999999/cd3', 'test-3' ])
|
50
50
|
end
|
51
51
|
end
|
52
52
|
context "no descriptive identifiers or local ID" do
|
53
53
|
before { object.permanent_id = 'ark:/999999/cd3' }
|
54
54
|
it "should return the permanent ID and PID" do
|
55
|
-
expect(subject).to match_array([ 'ark:/999999/cd3', 'test
|
55
|
+
expect(subject).to match_array([ 'ark:/999999/cd3', 'test-3' ])
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
@@ -4,7 +4,7 @@ RSpec.shared_examples "a non-collection model" do
|
|
4
4
|
let(:user) { FactoryGirl.build(:user) }
|
5
5
|
before { subject.grant_roles_to_creator(user) }
|
6
6
|
it "should include the Editor role in resource scope" do
|
7
|
-
expect(subject.roles.to_a).to eq([Ddr::Auth::Roles::Role.
|
7
|
+
expect(subject.roles.to_a).to eq([Ddr::Auth::Roles::Role.new(role_type: "Editor", agent: user.agent, scope: "resource")])
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddr-models
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.beta.
|
4
|
+
version: 3.0.0.beta.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Coble
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-01
|
12
|
+
date: 2016-02-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -487,6 +487,7 @@ files:
|
|
487
487
|
- lib/ddr/events/event.rb
|
488
488
|
- lib/ddr/events/fixity_check_event.rb
|
489
489
|
- lib/ddr/events/ingestion_event.rb
|
490
|
+
- lib/ddr/events/migration_event.rb
|
490
491
|
- lib/ddr/events/preservation_event_behavior.rb
|
491
492
|
- lib/ddr/events/reindex_object_after_save.rb
|
492
493
|
- lib/ddr/events/update_event.rb
|
@@ -502,7 +503,6 @@ files:
|
|
502
503
|
- lib/ddr/index/field_attribute.rb
|
503
504
|
- lib/ddr/index/fields.rb
|
504
505
|
- lib/ddr/index/filter.rb
|
505
|
-
- lib/ddr/index/filters.rb
|
506
506
|
- lib/ddr/index/query.rb
|
507
507
|
- lib/ddr/index/query_builder.rb
|
508
508
|
- lib/ddr/index/query_clause.rb
|
data/lib/ddr/index/filters.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
module Ddr::Index
|
2
|
-
module Filters
|
3
|
-
extend Deprecation
|
4
|
-
|
5
|
-
def self.is_governed_by(pid)
|
6
|
-
Deprecation.warn(self,
|
7
|
-
"`Ddr::Index:Filters.is_governed_by` is deprecated and will be removed in ddr-models 3.0." \
|
8
|
-
" Use `Ddr::Index::Filter.is_governed_by` instead.")
|
9
|
-
Filter.is_governed_by(pid)
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.const_missing(name)
|
13
|
-
if name == :HAS_CONTENT
|
14
|
-
Deprecation.warn(self,
|
15
|
-
"`Ddr::Index::Filters::#{name}` is deprecated and will be removed in ddr-models 3.0." \
|
16
|
-
" Use `Ddr::Index::Filter.has_content` instead.")
|
17
|
-
Filter.has_content
|
18
|
-
else
|
19
|
-
super
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|