hydra-pcdm 0.2.0 → 0.3.0
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/Gemfile +2 -0
- data/hydra-pcdm.gemspec +1 -2
- data/lib/hydra/pcdm/collection_indexer.rb +4 -2
- data/lib/hydra/pcdm/models/concerns/collection_behavior.rb +18 -9
- data/lib/hydra/pcdm/models/concerns/object_behavior.rb +1 -1
- data/lib/hydra/pcdm/models/concerns/pcdm_behavior.rb +34 -14
- data/lib/hydra/pcdm/object_indexer.rb +4 -1
- data/lib/hydra/pcdm/version.rb +1 -1
- data/spec/hydra/pcdm/collection_indexer_spec.rb +2 -2
- data/spec/hydra/pcdm/models/collection_spec.rb +159 -342
- data/spec/hydra/pcdm/models/object_spec.rb +60 -276
- data/spec/hydra/pcdm/object_indexer_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -6
- metadata +6 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ddcd3f1a0e883fa81ac51d63cee4a16359b54c7
|
4
|
+
data.tar.gz: f569047389d44e967676fcc9fd6447536a3abbe7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d409cb3d8f26a222cb90691d892bd24aed2451a323f238ad205d2843740b7023d461f539a8c44b20fd156d3a83e372b0e41e0fc705a28f88a6cb0ee2b1697153
|
7
|
+
data.tar.gz: 4dd1dcaf0e9cec180f14b35ebedc1bd10132ca1586eca54af825870c3333d3c7fc200ccd1e9d78c4392bec8b45c26c2c819ca1b0dbad2c34ba3975eadb6335b4
|
data/Gemfile
CHANGED
data/hydra-pcdm.gemspec
CHANGED
@@ -19,8 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.add_dependency '
|
23
|
-
spec.add_dependency 'activefedora-aggregation', '~> 0.4'
|
22
|
+
spec.add_dependency 'activefedora-aggregation', '~> 0.5'
|
24
23
|
spec.add_dependency 'mime-types', '>= 1'
|
25
24
|
|
26
25
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
@@ -2,8 +2,10 @@ module Hydra::PCDM
|
|
2
2
|
class CollectionIndexer < ObjectIndexer
|
3
3
|
def generate_solr_document
|
4
4
|
super.tap do |solr_doc|
|
5
|
-
solr_doc['member_ids_ssim']
|
6
|
-
solr_doc['
|
5
|
+
solr_doc['member_ids_ssim'] ||= []
|
6
|
+
solr_doc['member_ids_ssim'] += object.member_ids
|
7
|
+
solr_doc['member_ids_ssim'].uniq!
|
8
|
+
solr_doc['collection_ids_ssim'] = object.ordered_collection_ids
|
7
9
|
end
|
8
10
|
end
|
9
11
|
end
|
@@ -16,8 +16,6 @@ module Hydra::PCDM
|
|
16
16
|
included do
|
17
17
|
type Vocab::PCDMTerms.Collection
|
18
18
|
include ::Hydra::PCDM::PcdmBehavior
|
19
|
-
|
20
|
-
filters_association :members, as: :collections, condition: :pcdm_collection?
|
21
19
|
end
|
22
20
|
|
23
21
|
module ClassMethods
|
@@ -29,6 +27,22 @@ module Hydra::PCDM
|
|
29
27
|
end
|
30
28
|
end
|
31
29
|
|
30
|
+
def collections
|
31
|
+
members.select(&:pcdm_collection?)
|
32
|
+
end
|
33
|
+
|
34
|
+
def collection_ids
|
35
|
+
members.select(&:pcdm_collection?).map(&:id)
|
36
|
+
end
|
37
|
+
|
38
|
+
def ordered_collections
|
39
|
+
ordered_members.to_a.select(&:pcdm_collection?)
|
40
|
+
end
|
41
|
+
|
42
|
+
def ordered_collection_ids
|
43
|
+
ordered_collections.map(&:id)
|
44
|
+
end
|
45
|
+
|
32
46
|
def pcdm_object?
|
33
47
|
false
|
34
48
|
end
|
@@ -39,17 +53,12 @@ module Hydra::PCDM
|
|
39
53
|
|
40
54
|
def child_collections
|
41
55
|
warn '[DEPRECATION] `child_collections` is deprecated in Hydra::PCDM. Please use `collections` instead. This has a target date for removal of 10-31-2015'
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
def child_collections=(new_collections)
|
46
|
-
warn '[DEPRECATION] `child_collections=` is deprecated in Hydra::PCDM. Please use `collections=` instead. This has a target date for removal of 10-31-2015'
|
47
|
-
self.collections = new_collections
|
56
|
+
ordered_collections
|
48
57
|
end
|
49
58
|
|
50
59
|
def child_collection_ids
|
51
60
|
warn '[DEPRECATION] `child_collection_ids` is deprecated in Hydra::PCDM. Please use `collection_ids` instead. This has a target date for removal of 10-31-2015'
|
52
|
-
|
61
|
+
ordered_collection_ids
|
53
62
|
end
|
54
63
|
end
|
55
64
|
end
|
@@ -2,10 +2,11 @@ module Hydra::PCDM
|
|
2
2
|
module PcdmBehavior
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
included do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
ordered_aggregation :members,
|
6
|
+
has_member_relation: Vocab::PCDMTerms.hasMember,
|
7
|
+
class_name: 'ActiveFedora::Base',
|
8
|
+
type_validator: type_validator,
|
9
|
+
through: :list_source
|
9
10
|
indirectly_contains :related_objects, has_member_relation: RDF::Vocab::ORE.aggregates,
|
10
11
|
inserted_content_relation: RDF::Vocab::ORE.proxyFor, class_name: 'ActiveFedora::Base',
|
11
12
|
through: 'ActiveFedora::Aggregation::Proxy', foreign_key: :target,
|
@@ -23,16 +24,40 @@ module Hydra::PCDM
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def member_of
|
26
|
-
|
27
|
+
ActiveFedora::Base.where(member_ids_ssim: id)
|
28
|
+
end
|
29
|
+
|
30
|
+
def member_ids
|
31
|
+
members.map(&:id)
|
32
|
+
end
|
33
|
+
|
34
|
+
def ordered_member_ids
|
35
|
+
ordered_member_proxies.map(&:target_id)
|
36
|
+
end
|
37
|
+
|
38
|
+
def objects
|
39
|
+
members.select(&:pcdm_object?)
|
40
|
+
end
|
41
|
+
|
42
|
+
def object_ids
|
43
|
+
members.select(&:pcdm_object?).map(&:id)
|
44
|
+
end
|
45
|
+
|
46
|
+
def ordered_objects
|
47
|
+
ordered_members.to_a.select(&:pcdm_object?)
|
48
|
+
end
|
49
|
+
|
50
|
+
def ordered_object_ids
|
51
|
+
ordered_objects.map(&:id)
|
27
52
|
end
|
28
53
|
|
29
54
|
def parents
|
30
|
-
warn '[DEPRECATION] `parents` is deprecated in Hydra::PCDM. Please use `
|
31
|
-
|
55
|
+
warn '[DEPRECATION] `parents` is deprecated in Hydra::PCDM. Please use `ordered_by` instead. This has a target date for removal of 10-31-2015'
|
56
|
+
ordered_by.to_a
|
32
57
|
end
|
33
58
|
|
34
59
|
def in_collections
|
35
|
-
|
60
|
+
member_of.select(&:pcdm_collection?).to_a
|
36
61
|
end
|
37
62
|
|
38
63
|
def parent_collections
|
@@ -59,12 +84,7 @@ module Hydra::PCDM
|
|
59
84
|
|
60
85
|
def child_objects
|
61
86
|
warn '[DEPRECATION] `child_objects` is deprecated in Hydra::PCDM. Please use `objects` instead. This has a target date for removal of 10-31-2015'
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
def child_objects=(new_objects)
|
66
|
-
warn '[DEPRECATION] `child_objects=` is deprecated in Hydra::PCDM. Please use `objects=` instead. This has a target date for removal of 10-31-2015'
|
67
|
-
self.objects = new_objects
|
87
|
+
ordered_objects
|
68
88
|
end
|
69
89
|
|
70
90
|
def child_object_ids
|
@@ -2,7 +2,10 @@ module Hydra::PCDM
|
|
2
2
|
class ObjectIndexer < ActiveFedora::IndexingService
|
3
3
|
def generate_solr_document
|
4
4
|
super.tap do |solr_doc|
|
5
|
-
solr_doc['
|
5
|
+
solr_doc['member_ids_ssim'] ||= []
|
6
|
+
solr_doc['member_ids_ssim'] += object.member_ids
|
7
|
+
solr_doc['member_ids_ssim'].uniq!
|
8
|
+
solr_doc['object_ids_ssim'] = object.ordered_object_ids
|
6
9
|
end
|
7
10
|
end
|
8
11
|
end
|
data/lib/hydra/pcdm/version.rb
CHANGED
@@ -8,8 +8,8 @@ describe Hydra::PCDM::CollectionIndexer do
|
|
8
8
|
let(:indexer) { described_class.new(collection) }
|
9
9
|
|
10
10
|
before do
|
11
|
-
allow(collection).to receive(:
|
12
|
-
allow(collection).to receive(:
|
11
|
+
allow(collection).to receive(:ordered_collection_ids).and_return(collection_ids)
|
12
|
+
allow(collection).to receive(:ordered_object_ids).and_return(object_ids)
|
13
13
|
allow(collection).to receive(:member_ids).and_return(member_ids)
|
14
14
|
end
|
15
15
|
|
@@ -10,33 +10,63 @@ describe Hydra::PCDM::Collection do
|
|
10
10
|
let(:object2) { Hydra::PCDM::Object.new }
|
11
11
|
let(:object3) { Hydra::PCDM::Object.new }
|
12
12
|
|
13
|
+
describe '#collections' do
|
14
|
+
it 'returns non-ordered collections' do
|
15
|
+
collection1.members += [collection2, collection3]
|
16
|
+
collection1.ordered_members << collection4
|
17
|
+
|
18
|
+
expect(collection1.collections).to eq [collection2, collection3, collection4]
|
19
|
+
expect(collection1.ordered_collections).to eq [collection4]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#collection_ids' do
|
24
|
+
it 'returns IDs of non-ordered collections' do
|
25
|
+
collection1.members += [collection2, collection3]
|
26
|
+
collection1.ordered_members << collection4
|
27
|
+
|
28
|
+
expect(collection1.collection_ids).to eq [collection2.id, collection3.id, collection4.id]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#objects' do
|
33
|
+
it 'returns non-ordered objects' do
|
34
|
+
collection1.members += [object1, object2]
|
35
|
+
collection1.ordered_members << object3
|
36
|
+
|
37
|
+
expect(collection1.objects).to eq [object1, object2, object3]
|
38
|
+
expect(collection1.ordered_objects).to eq [object3]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#object_ids' do
|
43
|
+
it 'returns IDs of non-ordered objects' do
|
44
|
+
collection1.members += [object1, object2]
|
45
|
+
collection1.ordered_members << object3
|
46
|
+
|
47
|
+
expect(collection1.object_ids).to eq [object1.id, object2.id, object3.id]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
13
51
|
describe 'adding collections' do
|
14
52
|
describe 'with acceptable inputs' do
|
15
53
|
subject { described_class.new }
|
16
|
-
it 'adds collections, sub-collections, and repeating collections' do
|
17
|
-
subject.collections << collection1 # first add
|
18
|
-
subject.collections << collection2 # second add to same collection
|
19
|
-
subject.collections << collection1 # repeat a collection
|
20
|
-
collection1.collections << collection3 # add sub-collection
|
21
|
-
expect(subject.collections).to eq [collection1, collection2, collection1]
|
22
|
-
expect(collection1.collections).to eq [collection3]
|
23
|
-
end
|
24
54
|
it 'adds an object to collection with collections and objects' do
|
25
|
-
subject.
|
26
|
-
subject.
|
27
|
-
subject.
|
28
|
-
subject.
|
29
|
-
subject.
|
30
|
-
expect(subject.
|
31
|
-
expect(subject.
|
32
|
-
expect(subject.
|
55
|
+
subject.ordered_members << collection1
|
56
|
+
subject.ordered_members << collection2
|
57
|
+
subject.ordered_members << object1
|
58
|
+
subject.ordered_members << object2
|
59
|
+
subject.ordered_members << collection3
|
60
|
+
expect(subject.ordered_members).to eq [collection1, collection2, object1, object2, collection3]
|
61
|
+
expect(subject.ordered_collections).to eq [collection1, collection2, collection3]
|
62
|
+
expect(subject.ordered_objects).to eq [object1, object2]
|
33
63
|
end
|
34
64
|
end
|
35
65
|
|
36
66
|
describe '#in_collection_ids' do
|
37
67
|
it 'returns the IDs of the parent' do
|
38
|
-
subject.
|
39
|
-
subject.
|
68
|
+
subject.ordered_members << object1
|
69
|
+
subject.ordered_members << collection1
|
40
70
|
subject.save
|
41
71
|
expect(object1.in_collection_ids).to eq [subject.id]
|
42
72
|
expect(collection1.in_collection_ids).to eq [subject.id]
|
@@ -53,13 +83,13 @@ describe Hydra::PCDM::Collection do
|
|
53
83
|
let(:kollection1) { Kollection.new }
|
54
84
|
|
55
85
|
it 'accepts implementing collection as a child' do
|
56
|
-
subject.
|
57
|
-
expect(subject.
|
86
|
+
subject.ordered_members << kollection1
|
87
|
+
expect(subject.ordered_collections).to eq [kollection1]
|
58
88
|
end
|
59
89
|
|
60
90
|
it 'accepts implementing collection as a parent' do
|
61
|
-
kollection1.
|
62
|
-
expect(kollection1.
|
91
|
+
kollection1.ordered_members << collection1
|
92
|
+
expect(kollection1.ordered_collections).to eq [collection1]
|
63
93
|
end
|
64
94
|
end
|
65
95
|
|
@@ -72,13 +102,13 @@ describe Hydra::PCDM::Collection do
|
|
72
102
|
let(:cullection1) { Cullection.new }
|
73
103
|
|
74
104
|
it 'accepts extending collection as a child' do
|
75
|
-
subject.
|
76
|
-
expect(subject.
|
105
|
+
subject.ordered_members << cullection1
|
106
|
+
expect(subject.ordered_collections).to eq [cullection1]
|
77
107
|
end
|
78
108
|
|
79
109
|
it 'accepts extending collection as a parent' do
|
80
|
-
cullection1.
|
81
|
-
expect(cullection1.
|
110
|
+
cullection1.ordered_members << collection1
|
111
|
+
expect(cullection1.ordered_collections).to eq [collection1]
|
82
112
|
end
|
83
113
|
end
|
84
114
|
|
@@ -91,25 +121,23 @@ describe Hydra::PCDM::Collection do
|
|
91
121
|
end
|
92
122
|
|
93
123
|
context 'that are unacceptable child collections' do
|
94
|
-
let(:error_type1) {
|
95
|
-
let(:error_message1) {
|
96
|
-
let(:error_type2) {
|
97
|
-
let(:error_message2) { /
|
124
|
+
let(:error_type1) { ActiveFedora::AssociationTypeMismatch }
|
125
|
+
let(:error_message1) { /ActiveFedora::Base\(#\d+\) expected, got String\(#[\d]+\)/ }
|
126
|
+
let(:error_type2) { ActiveFedora::AssociationTypeMismatch }
|
127
|
+
let(:error_message2) { /(<ActiveFedora::Base:[\d\s\w]{16}>|\s*) is not a PCDM object or collection./ }
|
128
|
+
let(:error_type3) { ActiveFedora::AssociationTypeMismatch }
|
129
|
+
let(:error_message3) { /ActiveFedora::Base\(#\d+\) expected, got Hydra::PCDM::File\(#[\d]+\)/ }
|
98
130
|
|
99
|
-
it 'raises an error when trying to aggregate Hydra::PCDM::
|
100
|
-
expect { collection1.
|
131
|
+
it 'raises an error when trying to aggregate Hydra::PCDM::Files in members aggregation' do
|
132
|
+
expect { collection1.ordered_members << @file101 }.to raise_error(error_type3, error_message3)
|
101
133
|
end
|
102
134
|
|
103
|
-
it 'raises an error when trying to aggregate
|
104
|
-
expect { collection1.
|
135
|
+
it 'raises an error when trying to aggregate non-PCDM objects in members aggregation' do
|
136
|
+
expect { collection1.ordered_members << @non_pcdm_object }.to raise_error(error_type1, error_message1)
|
105
137
|
end
|
106
138
|
|
107
|
-
it 'raises an error when trying to aggregate
|
108
|
-
expect { collection1.
|
109
|
-
end
|
110
|
-
|
111
|
-
it 'raises an error when trying to aggregate AF::Base objects in collections aggregation' do
|
112
|
-
expect { collection1.collections << @af_base_object }.to raise_error(error_type2, error_message2)
|
139
|
+
it 'raises an error when trying to aggregate AF::Base objects in members aggregation' do
|
140
|
+
expect { collection1.ordered_members << @af_base_object }.to raise_error(error_type2, error_message2)
|
113
141
|
end
|
114
142
|
end
|
115
143
|
end
|
@@ -120,35 +148,35 @@ describe Hydra::PCDM::Collection do
|
|
120
148
|
|
121
149
|
context 'when the source collection is the same' do
|
122
150
|
it 'raises an error' do
|
123
|
-
expect { subject.
|
151
|
+
expect { subject.ordered_members << subject }.to raise_error(error_type, error_message)
|
124
152
|
end
|
125
153
|
end
|
126
154
|
|
127
155
|
before do
|
128
|
-
subject.
|
156
|
+
subject.ordered_members << collection1
|
129
157
|
end
|
130
158
|
|
131
159
|
it 'raises and error' do
|
132
|
-
expect { collection1.
|
160
|
+
expect { collection1.ordered_members << subject }.to raise_error(error_type, error_message)
|
133
161
|
end
|
134
162
|
|
135
163
|
context 'with more ancestors' do
|
136
164
|
before do
|
137
|
-
collection1.
|
165
|
+
collection1.ordered_members << collection2
|
138
166
|
end
|
139
167
|
|
140
168
|
it 'raises an error' do
|
141
|
-
expect { collection2.
|
169
|
+
expect { collection2.ordered_members << subject }.to raise_error(error_type, error_message)
|
142
170
|
end
|
143
171
|
|
144
172
|
context 'with a more complicated example' do
|
145
173
|
before do
|
146
|
-
collection2.
|
174
|
+
collection2.ordered_members << collection3
|
147
175
|
end
|
148
176
|
|
149
177
|
it 'raises errors' do
|
150
|
-
expect { collection3.
|
151
|
-
expect { collection3.
|
178
|
+
expect { collection3.ordered_members << subject }.to raise_error(error_type, error_message)
|
179
|
+
expect { collection3.ordered_members << collection1 }.to raise_error(error_type, error_message)
|
152
180
|
end
|
153
181
|
end
|
154
182
|
end
|
@@ -160,52 +188,52 @@ describe Hydra::PCDM::Collection do
|
|
160
188
|
|
161
189
|
context 'when it is the only collection' do
|
162
190
|
before do
|
163
|
-
subject.
|
164
|
-
expect(subject.
|
191
|
+
subject.ordered_members << collection1
|
192
|
+
expect(subject.ordered_collections).to eq [collection1]
|
165
193
|
end
|
166
194
|
|
167
195
|
it 'removes collection while changes are in memory' do
|
168
|
-
|
169
|
-
expect(subject.
|
196
|
+
subject.ordered_member_proxies.delete_at(0)
|
197
|
+
expect(subject.ordered_collections).to eq []
|
170
198
|
end
|
171
199
|
|
172
200
|
it 'removes collection only when objects and all changes are in memory' do
|
173
|
-
subject.
|
174
|
-
subject.
|
175
|
-
|
176
|
-
expect(subject.
|
177
|
-
expect(subject.
|
201
|
+
subject.ordered_members << object1
|
202
|
+
subject.ordered_members << object2
|
203
|
+
subject.ordered_member_proxies.delete_at(0)
|
204
|
+
expect(subject.ordered_collections).to eq []
|
205
|
+
expect(subject.ordered_objects).to eq [object1, object2]
|
178
206
|
end
|
179
207
|
end
|
180
208
|
|
181
209
|
context 'when multiple collections' do
|
182
210
|
before do
|
183
|
-
subject.
|
184
|
-
subject.
|
185
|
-
subject.
|
186
|
-
expect(subject.
|
211
|
+
subject.ordered_members << collection1
|
212
|
+
subject.ordered_members << collection2
|
213
|
+
subject.ordered_members << collection3
|
214
|
+
expect(subject.ordered_collections).to eq [collection1, collection2, collection3]
|
187
215
|
end
|
188
216
|
|
189
217
|
it 'removes first collection when changes are in memory' do
|
190
|
-
|
191
|
-
expect(subject.
|
218
|
+
subject.ordered_member_proxies.delete_at(0)
|
219
|
+
expect(subject.ordered_collections).to eq [collection2, collection3]
|
192
220
|
end
|
193
221
|
|
194
222
|
it 'removes last collection when changes are in memory' do
|
195
|
-
|
196
|
-
expect(subject.
|
223
|
+
subject.ordered_member_proxies.delete_at(2)
|
224
|
+
expect(subject.ordered_collections).to eq [collection1, collection2]
|
197
225
|
end
|
198
226
|
|
199
227
|
it 'removes middle collection when changes are in memory' do
|
200
|
-
|
201
|
-
expect(subject.
|
228
|
+
subject.ordered_member_proxies.delete_at(1)
|
229
|
+
expect(subject.ordered_collections).to eq [collection1, collection3]
|
202
230
|
end
|
203
231
|
|
204
232
|
it 'removes middle collection when changes are saved' do
|
205
|
-
expect(subject.
|
233
|
+
expect(subject.ordered_collections).to eq [collection1, collection2, collection3]
|
206
234
|
subject.save
|
207
|
-
|
208
|
-
expect(subject.
|
235
|
+
subject.ordered_member_proxies.delete_at(1)
|
236
|
+
expect(subject.ordered_collections).to eq [collection1, collection3]
|
209
237
|
end
|
210
238
|
end
|
211
239
|
context 'when collection is missing' do
|
@@ -214,14 +242,14 @@ describe Hydra::PCDM::Collection do
|
|
214
242
|
end
|
215
243
|
|
216
244
|
it 'and multiple sub-collections should return empty array when changes are in memory' do
|
217
|
-
subject.
|
218
|
-
subject.
|
245
|
+
subject.ordered_members << collection1
|
246
|
+
subject.ordered_members << collection3
|
219
247
|
expect(subject.members.delete collection2).to eq []
|
220
248
|
end
|
221
249
|
|
222
250
|
it 'returns empty array when changes are saved' do
|
223
|
-
subject.
|
224
|
-
subject.
|
251
|
+
subject.ordered_members << collection1
|
252
|
+
subject.ordered_members << collection3
|
225
253
|
subject.save
|
226
254
|
expect(subject.members.delete collection2).to eq []
|
227
255
|
end
|
@@ -231,19 +259,19 @@ describe Hydra::PCDM::Collection do
|
|
231
259
|
describe 'adding objects' do
|
232
260
|
context 'with acceptable inputs' do
|
233
261
|
it 'adds objects, sub-collections, and repeating collections' do
|
234
|
-
subject.
|
235
|
-
subject.
|
236
|
-
subject.
|
237
|
-
expect(subject.
|
262
|
+
subject.ordered_members << object1 # first add
|
263
|
+
subject.ordered_members << object2 # second add to same collection
|
264
|
+
subject.ordered_members << object1 # repeat an object
|
265
|
+
expect(subject.ordered_members).to eq [object1, object2, object1]
|
238
266
|
end
|
239
267
|
|
240
268
|
context 'with collections and objects' do
|
241
269
|
it 'adds an object to collection with collections and objects' do
|
242
|
-
subject.
|
243
|
-
subject.
|
244
|
-
subject.
|
245
|
-
subject.
|
246
|
-
expect(subject.
|
270
|
+
subject.ordered_members << object1
|
271
|
+
subject.ordered_members << collection1
|
272
|
+
subject.ordered_members << collection2
|
273
|
+
subject.ordered_members << object2
|
274
|
+
expect(subject.ordered_objects).to eq [object1, object2]
|
247
275
|
end
|
248
276
|
end
|
249
277
|
|
@@ -257,8 +285,8 @@ describe Hydra::PCDM::Collection do
|
|
257
285
|
let(:ahbject1) { Ahbject.new }
|
258
286
|
|
259
287
|
it 'accepts implementing object as a child' do
|
260
|
-
subject.
|
261
|
-
expect(subject.
|
288
|
+
subject.ordered_members << ahbject1
|
289
|
+
expect(subject.ordered_objects).to eq [ahbject1]
|
262
290
|
end
|
263
291
|
end
|
264
292
|
|
@@ -271,168 +299,13 @@ describe Hydra::PCDM::Collection do
|
|
271
299
|
let(:awbject1) { Awbject.new }
|
272
300
|
|
273
301
|
it 'accepts extending object as a child' do
|
274
|
-
subject.
|
275
|
-
expect(subject.
|
276
|
-
end
|
277
|
-
end
|
278
|
-
end
|
279
|
-
|
280
|
-
context 'with unacceptable inputs' do
|
281
|
-
before(:all) do
|
282
|
-
@file101 = Hydra::PCDM::File.new
|
283
|
-
@non_pcdm_object = "I'm not a PCDM object"
|
284
|
-
@af_base_object = ActiveFedora::Base.new
|
285
|
-
end
|
286
|
-
|
287
|
-
context 'with unacceptable objects' do
|
288
|
-
let(:error_type1) { ArgumentError }
|
289
|
-
let(:error_message1) { 'Hydra::PCDM::Collection with ID: was expected to pcdm_object?, but it was false' }
|
290
|
-
let(:error_type2) { NoMethodError }
|
291
|
-
let(:error_message2) { /undefined method `pcdm_object\?' for .*/ }
|
292
|
-
|
293
|
-
it 'raises an error when trying to aggregate Hydra::PCDM::Collection in objects aggregation' do
|
294
|
-
expect { collection1.objects << collection2 }.to raise_error(error_type1, error_message1)
|
295
|
-
end
|
296
|
-
|
297
|
-
it 'raises an error when trying to aggregate Hydra::PCDM::Files in objects aggregation' do
|
298
|
-
expect { collection1.objects << @file101 }.to raise_error(error_type2, error_message2)
|
299
|
-
end
|
300
|
-
|
301
|
-
it 'raises an error when trying to aggregate non-PCDM objects in objects aggregation' do
|
302
|
-
expect { collection1.objects << @non_pcdm_object }.to raise_error(error_type2, error_message2)
|
303
|
-
end
|
304
|
-
|
305
|
-
it 'raises an error when trying to aggregate AF::Base objects in objects aggregation' do
|
306
|
-
expect { collection1.objects << @af_base_object }.to raise_error(error_type2, error_message2)
|
302
|
+
subject.ordered_members << awbject1
|
303
|
+
expect(subject.ordered_objects).to eq [awbject1]
|
307
304
|
end
|
308
305
|
end
|
309
306
|
end
|
310
307
|
end
|
311
308
|
|
312
|
-
describe 'removing objects' do
|
313
|
-
context 'when it is the only object' do
|
314
|
-
before do
|
315
|
-
subject.objects << object1
|
316
|
-
expect(subject.objects).to eq [object1]
|
317
|
-
end
|
318
|
-
|
319
|
-
it 'removes object while changes are in memory' do
|
320
|
-
expect(subject.objects.delete object1).to eq [object1]
|
321
|
-
expect(subject.objects).to eq []
|
322
|
-
end
|
323
|
-
|
324
|
-
it 'removes object only when collections and all changes are in memory' do
|
325
|
-
subject.collections << collection1
|
326
|
-
subject.collections << collection2
|
327
|
-
expect(subject.objects.delete object1).to eq [object1]
|
328
|
-
expect(subject.objects).to eq []
|
329
|
-
expect(subject.collections).to eq [collection1, collection2]
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
context 'when multiple objects' do
|
334
|
-
let(:object3) { Hydra::PCDM::Object.new }
|
335
|
-
|
336
|
-
before do
|
337
|
-
subject.objects << object1
|
338
|
-
subject.objects << object2
|
339
|
-
subject.objects << object3
|
340
|
-
expect(subject.objects).to eq [object1, object2, object3]
|
341
|
-
end
|
342
|
-
|
343
|
-
it 'removes first object when changes are in memory' do
|
344
|
-
expect(subject.objects.delete object1).to eq [object1]
|
345
|
-
expect(subject.objects).to eq [object2, object3]
|
346
|
-
end
|
347
|
-
|
348
|
-
it 'removes middle object when changes are in memory' do
|
349
|
-
expect(subject.objects.delete object2).to eq [object2]
|
350
|
-
expect(subject.objects).to eq [object1, object3]
|
351
|
-
end
|
352
|
-
|
353
|
-
it 'removes last object when changes are in memory' do
|
354
|
-
expect(subject.objects.delete object3).to eq [object3]
|
355
|
-
expect(subject.objects).to eq [object1, object2]
|
356
|
-
end
|
357
|
-
it 'removes middle object when changes are saved' do
|
358
|
-
expect(subject.objects.delete object2).to eq [object2]
|
359
|
-
expect(subject.objects).to eq [object1, object3]
|
360
|
-
subject.save
|
361
|
-
expect(subject.reload.objects).to eq [object1, object3]
|
362
|
-
end
|
363
|
-
end
|
364
|
-
|
365
|
-
context 'when object repeats' do
|
366
|
-
let(:object3) { Hydra::PCDM::Object.new }
|
367
|
-
let(:object4) { Hydra::PCDM::Object.new }
|
368
|
-
let(:object5) { Hydra::PCDM::Object.new }
|
369
|
-
|
370
|
-
before do
|
371
|
-
subject.objects << object1
|
372
|
-
subject.objects << object2
|
373
|
-
subject.objects << object3
|
374
|
-
subject.objects << object2
|
375
|
-
subject.objects << object4
|
376
|
-
subject.objects << object2
|
377
|
-
subject.objects << object5
|
378
|
-
expect(subject.objects).to eq [object1, object2, object3, object2, object4, object2, object5]
|
379
|
-
end
|
380
|
-
|
381
|
-
# TODO: pending implementation of multiple objects
|
382
|
-
|
383
|
-
it 'removes first occurrence when changes in memory' do
|
384
|
-
expect(subject.objects.delete object2).to eq [object2]
|
385
|
-
expect(subject.objects).to eq [object1, object3, object4, object5]
|
386
|
-
end
|
387
|
-
|
388
|
-
it 'removes last occurrence when changes in memory' do
|
389
|
-
skip('pending resolution of AF-agg 46 and PCDM 102') do
|
390
|
-
expect(subject.objects.delete object2, -1).to eq object2
|
391
|
-
expect(subject.objects).to eq [object1, object2, object3, object2, object4, object5]
|
392
|
-
end
|
393
|
-
end
|
394
|
-
|
395
|
-
it 'removes nth occurrence when changes in memory' do
|
396
|
-
skip('pending resolution of AF-agg 46 and PCDM 102') do
|
397
|
-
expect(subject.objects.delete object2, 2).to eq object2
|
398
|
-
expect(subject.objects).to eq [object1, object2, object3, object4, object2, object5]
|
399
|
-
end
|
400
|
-
end
|
401
|
-
it 'removes nth occurrence when changes are saved' do
|
402
|
-
skip('pending resolution of AF-agg 46 and PCDM 102') do
|
403
|
-
expect(subject.objects).to eq [object1, object2, object3, object2, object4, object2, object5]
|
404
|
-
subject.save
|
405
|
-
expect(subject.reload.objects).to eq [object1, object2, object3, object2, object4, object2, object5]
|
406
|
-
|
407
|
-
expect(subject.objects.delete object2, 2).to eq object2
|
408
|
-
subject.save
|
409
|
-
expect(subject.reload.objects).to eq [object1, object2, object3, object4, object2, object5]
|
410
|
-
end
|
411
|
-
end
|
412
|
-
end
|
413
|
-
|
414
|
-
context 'when object is missing' do
|
415
|
-
let(:object3) { Hydra::PCDM::Object.new }
|
416
|
-
|
417
|
-
it 'and 0 objects in collection should return empty array' do
|
418
|
-
expect(subject.objects.delete object1).to eq []
|
419
|
-
end
|
420
|
-
|
421
|
-
it 'and multiple objects in collection should return empty array when changes are in memory' do
|
422
|
-
subject.objects << object1
|
423
|
-
subject.objects << object2
|
424
|
-
expect(subject.objects.delete object3).to eq []
|
425
|
-
end
|
426
|
-
|
427
|
-
it 'returns empty array when changes are saved' do
|
428
|
-
subject.objects << object1
|
429
|
-
subject.objects << object2
|
430
|
-
subject.save
|
431
|
-
expect(subject.reload.objects.delete object3).to eq []
|
432
|
-
end
|
433
|
-
end
|
434
|
-
end
|
435
|
-
|
436
309
|
describe 'add related objects' do
|
437
310
|
context 'with acceptable collections' do
|
438
311
|
it 'adds objects to the related object set' do
|
@@ -529,14 +402,14 @@ describe Hydra::PCDM::Collection do
|
|
529
402
|
end
|
530
403
|
|
531
404
|
it 'removes related object only when objects & collections and all changes are in memory' do
|
532
|
-
subject.
|
533
|
-
subject.
|
534
|
-
subject.
|
535
|
-
subject.
|
405
|
+
subject.ordered_members << collection1
|
406
|
+
subject.ordered_members << collection2
|
407
|
+
subject.ordered_members << object3
|
408
|
+
subject.ordered_members << object2
|
536
409
|
expect(subject.related_objects.delete object1).to eq [object1]
|
537
410
|
expect(subject.related_objects).to eq []
|
538
|
-
expect(subject.
|
539
|
-
expect(subject.
|
411
|
+
expect(subject.ordered_collections).to eq [collection1, collection2]
|
412
|
+
expect(subject.ordered_objects).to eq [object3, object2]
|
540
413
|
end
|
541
414
|
end
|
542
415
|
|
@@ -581,10 +454,10 @@ describe Hydra::PCDM::Collection do
|
|
581
454
|
end
|
582
455
|
|
583
456
|
it 'returns empty array when 0 related objects, but has collections and objects and changes in memory' do
|
584
|
-
subject.
|
585
|
-
subject.
|
586
|
-
subject.
|
587
|
-
subject.
|
457
|
+
subject.ordered_members << collection1
|
458
|
+
subject.ordered_members << collection2
|
459
|
+
subject.ordered_members << object1
|
460
|
+
subject.ordered_members << object2
|
588
461
|
expect(subject.related_objects.delete object1).to eq []
|
589
462
|
end
|
590
463
|
|
@@ -625,67 +498,13 @@ describe Hydra::PCDM::Collection do
|
|
625
498
|
end
|
626
499
|
end
|
627
500
|
|
628
|
-
describe '#
|
629
|
-
it 'aggregates collections' do
|
630
|
-
collection1.collections = [collection2, collection3]
|
631
|
-
expect(collection1.collections).to eq [collection2, collection3]
|
632
|
-
end
|
633
|
-
end
|
634
|
-
|
635
|
-
describe '#collections<<' do
|
636
|
-
before do
|
637
|
-
collection1.collections = [collection2]
|
638
|
-
end
|
639
|
-
it 'aggregates collections' do
|
640
|
-
collection1.collections << collection3
|
641
|
-
expect(collection1.collections).to eq [collection2, collection3]
|
642
|
-
end
|
643
|
-
end
|
644
|
-
|
645
|
-
describe '#collections+=' do
|
646
|
-
before do
|
647
|
-
collection1.collections = [collection2]
|
648
|
-
end
|
649
|
-
it 'aggregates collections' do
|
650
|
-
collection1.collections += [collection3, collection4]
|
651
|
-
expect(collection1.collections).to eq [collection2, collection3, collection4]
|
652
|
-
end
|
653
|
-
end
|
654
|
-
|
655
|
-
describe '#objects=' do
|
656
|
-
it 'aggregates objects' do
|
657
|
-
collection1.objects = [object1, object2]
|
658
|
-
expect(collection1.objects).to eq [object1, object2]
|
659
|
-
end
|
660
|
-
end
|
661
|
-
|
662
|
-
describe '#objects<<' do
|
663
|
-
before do
|
664
|
-
collection1.objects = [object1]
|
665
|
-
end
|
666
|
-
it 'appends object to aggregated objects' do
|
667
|
-
collection1.objects << object2
|
668
|
-
expect(collection1.objects).to eq [object1, object2]
|
669
|
-
end
|
670
|
-
end
|
671
|
-
|
672
|
-
describe '#objects+=' do
|
673
|
-
before do
|
674
|
-
collection1.objects = [object1]
|
675
|
-
end
|
676
|
-
it 'appends object to aggregated objects' do
|
677
|
-
collection1.objects += [object2, object3]
|
678
|
-
expect(collection1.objects).to eq [object1, object2, object3]
|
679
|
-
end
|
680
|
-
end
|
681
|
-
|
682
|
-
describe '#collection_ids' do
|
501
|
+
describe '#ordered_collection_ids' do
|
683
502
|
let(:child1) { described_class.new(id: '1') }
|
684
503
|
let(:child2) { described_class.new(id: '2') }
|
685
504
|
let(:object) { described_class.new }
|
686
|
-
before { object.
|
505
|
+
before { object.ordered_members = [child1, child2] }
|
687
506
|
|
688
|
-
subject { object.
|
507
|
+
subject { object.ordered_collection_ids }
|
689
508
|
|
690
509
|
it { is_expected.to eq %w(1 2) }
|
691
510
|
end
|
@@ -694,31 +513,31 @@ describe Hydra::PCDM::Collection do
|
|
694
513
|
subject { described_class.new }
|
695
514
|
|
696
515
|
it 'returns empty array when no members' do
|
697
|
-
expect(subject.
|
698
|
-
expect(subject.
|
516
|
+
expect(subject.ordered_collections).to eq []
|
517
|
+
expect(subject.ordered_objects).to eq []
|
699
518
|
end
|
700
519
|
|
701
520
|
it 'collections should return empty array when only objects are aggregated' do
|
702
|
-
subject.
|
703
|
-
subject.
|
704
|
-
expect(subject.
|
521
|
+
subject.ordered_members << object1
|
522
|
+
subject.ordered_members << object2
|
523
|
+
expect(subject.ordered_collections).to eq []
|
705
524
|
end
|
706
525
|
|
707
526
|
it 'objects should return empty array when only collections are aggregated' do
|
708
|
-
subject.
|
709
|
-
subject.
|
710
|
-
expect(subject.
|
527
|
+
subject.ordered_members << collection1
|
528
|
+
subject.ordered_members << collection2
|
529
|
+
expect(subject.ordered_objects).to eq []
|
711
530
|
end
|
712
531
|
|
713
532
|
context 'should only contain members of the correct type' do
|
714
533
|
it 'returns only collections' do
|
715
|
-
subject.
|
716
|
-
subject.
|
717
|
-
subject.
|
718
|
-
subject.
|
719
|
-
expect(subject.
|
720
|
-
expect(subject.
|
721
|
-
expect(subject.
|
534
|
+
subject.ordered_members << collection1
|
535
|
+
subject.ordered_members << collection2
|
536
|
+
subject.ordered_members << object1
|
537
|
+
subject.ordered_members << object2
|
538
|
+
expect(subject.ordered_collections).to eq [collection1, collection2]
|
539
|
+
expect(subject.ordered_objects).to eq [object1, object2]
|
540
|
+
expect(subject.ordered_members).to eq [collection1, collection2, object1, object2]
|
722
541
|
end
|
723
542
|
end
|
724
543
|
end
|
@@ -730,20 +549,17 @@ describe Hydra::PCDM::Collection do
|
|
730
549
|
@collection1 = described_class.new
|
731
550
|
@collection2 = described_class.new
|
732
551
|
@collection = described_class.new
|
733
|
-
@collection1.
|
734
|
-
@collection2.
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
build_proxy(container: @collection2)
|
739
|
-
]
|
740
|
-
allow(ActiveFedora::Aggregation::Proxy).to receive(:where).with(proxyFor_ssim: @collection.id).and_return(proxies)
|
552
|
+
@collection1.members << @collection
|
553
|
+
@collection2.members << @collection
|
554
|
+
@collection.save
|
555
|
+
@collection1.save!
|
556
|
+
@collection2.save!
|
741
557
|
end
|
742
558
|
|
743
559
|
describe 'member_of' do
|
744
560
|
subject { @collection.member_of }
|
745
561
|
it 'finds all nodes that aggregate the object with hasMember' do
|
746
|
-
expect(subject).to include(@collection1, @collection2)
|
562
|
+
expect(subject.to_a).to include(@collection1, @collection2)
|
747
563
|
expect(subject.count).to eq 2
|
748
564
|
end
|
749
565
|
end
|
@@ -755,9 +571,6 @@ describe Hydra::PCDM::Collection do
|
|
755
571
|
expect(subject.count).to eq 2
|
756
572
|
end
|
757
573
|
end
|
758
|
-
def build_proxy(container:)
|
759
|
-
instance_double(ActiveFedora::Aggregation::Proxy, container: container)
|
760
|
-
end
|
761
574
|
end
|
762
575
|
|
763
576
|
describe '.indexer' do
|
@@ -803,16 +616,20 @@ describe Hydra::PCDM::Collection do
|
|
803
616
|
|
804
617
|
describe 'make sure deprecated methods still work' do
|
805
618
|
it 'deprecated methods should pass' do
|
806
|
-
expect(collection1.
|
807
|
-
expect(collection1.
|
808
|
-
expect(collection1.
|
809
|
-
expect(collection1.
|
810
|
-
expect(collection1.
|
811
|
-
expect(collection1.
|
619
|
+
expect(collection1.ordered_members = [collection2]).to eq [collection2]
|
620
|
+
expect(collection1.ordered_members << collection3).to eq [collection2, collection3]
|
621
|
+
expect(collection1.ordered_members += [collection4]).to eq [collection2, collection3, collection4]
|
622
|
+
expect(collection1.ordered_members << object1).to eq [collection2, collection3, collection4, object1]
|
623
|
+
expect(collection1.ordered_members << object2).to eq [collection2, collection3, collection4, object1, object2]
|
624
|
+
expect(collection1.ordered_members += [object3]).to eq [collection2, collection3, collection4, object1, object2, object3]
|
812
625
|
collection1.save # required until issue AF-Agg-75 is fixed
|
813
626
|
expect(collection2.parent_collections).to eq [collection1]
|
814
627
|
expect(collection2.parents).to eq [collection1]
|
815
628
|
expect(collection2.parent_collection_ids).to eq [collection1.id]
|
629
|
+
expect(collection1.child_objects).to eq [object1, object2, object3]
|
630
|
+
expect(collection1.child_object_ids).to eq [object1.id, object2.id, object3.id]
|
631
|
+
expect(collection1.child_collections).to eq [collection2, collection3, collection4]
|
632
|
+
expect(collection1.child_collection_ids).to eq [collection2.id, collection3.id, collection4.id]
|
816
633
|
end
|
817
634
|
end
|
818
635
|
end
|