hydra-pcdm 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|