active-fedora 11.0.0.rc6 → 11.0.0.rc7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/active-fedora.gemspec +0 -3
- data/lib/active_fedora.rb +0 -10
- data/lib/active_fedora/associations/has_many_association.rb +1 -1
- data/lib/active_fedora/attributes.rb +1 -1
- data/lib/active_fedora/base.rb +3 -7
- data/lib/active_fedora/querying.rb +1 -1
- data/lib/active_fedora/rdf.rb +0 -1
- data/lib/active_fedora/version.rb +1 -1
- data/spec/integration/attached_files_spec.rb +14 -4
- data/spec/integration/file_spec.rb +22 -23
- data/spec/integration/versionable_spec.rb +0 -254
- data/spec/spec_helper.rb +0 -7
- data/spec/unit/attached_files_spec.rb +10 -7
- data/spec/unit/base_spec.rb +3 -1
- data/spec/unit/has_many_association_spec.rb +23 -8
- data/spec/unit/inheritance_spec.rb +11 -7
- data/spec/unit/model_classifier_spec.rb +1 -1
- data/spec/unit/rdf/indexing_service_spec.rb +9 -9
- data/spec/unit/solr_config_options_spec.rb +12 -15
- metadata +2 -67
- data/lib/active_fedora/datastreams.rb +0 -6
- data/lib/active_fedora/datastreams/nokogiri_datastreams.rb +0 -119
- data/lib/active_fedora/nom_datastream.rb +0 -73
- data/lib/active_fedora/om_datastream.rb +0 -118
- data/lib/active_fedora/qualified_dublin_core_datastream.rb +0 -158
- data/lib/active_fedora/rdf/datastream_indexing.rb +0 -49
- data/lib/active_fedora/rdf/ntriples_rdf_datastream.rb +0 -13
- data/lib/active_fedora/rdf/rdf_datastream.rb +0 -173
- data/lib/active_fedora/rdf/rdfxml_datastream.rb +0 -13
- data/spec/integration/complex_rdf_datastream_spec.rb +0 -227
- data/spec/integration/datastream_rdf_nested_attributes_spec.rb +0 -180
- data/spec/integration/ntriples_datastream_spec.rb +0 -215
- data/spec/integration/om_datastream_spec.rb +0 -78
- data/spec/samples/hydra-mods_article_datastream.rb +0 -515
- data/spec/samples/models/mods_article.rb +0 -9
- data/spec/samples/samples.rb +0 -2
- data/spec/unit/nom_datastream_spec.rb +0 -60
- data/spec/unit/ntriples_datastream_spec.rb +0 -167
- data/spec/unit/om_datastream_spec.rb +0 -294
- data/spec/unit/qualified_dublin_core_datastream_spec.rb +0 -119
- data/spec/unit/rdf_datastream_spec.rb +0 -84
- data/spec/unit/rdf_resource_datastream_spec.rb +0 -208
- data/spec/unit/rdfxml_datastream_spec.rb +0 -106
@@ -1,227 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "Nested Rdf Objects" do
|
4
|
-
describe "without type" do
|
5
|
-
before do
|
6
|
-
class SpecDatastream < ActiveFedora::NtriplesRDFDatastream
|
7
|
-
property :parts, predicate: ::RDF::Vocab::DC.hasPart, class_name: 'Component'
|
8
|
-
|
9
|
-
class Component < ActiveTriples::Resource
|
10
|
-
property :label, predicate: ::RDF::Vocab::DC.title
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
after do
|
16
|
-
Object.send(:remove_const, :SpecDatastream)
|
17
|
-
end
|
18
|
-
|
19
|
-
let(:ds) do
|
20
|
-
SpecDatastream.new("#{ActiveFedora.fedora.host}/test/test:124/descMd")
|
21
|
-
end
|
22
|
-
|
23
|
-
describe "#new_record?" do
|
24
|
-
it "is true when its built" do
|
25
|
-
v = ds.parts.build(label: 'Alternator')
|
26
|
-
expect(v).to be_new_record
|
27
|
-
end
|
28
|
-
|
29
|
-
it "does not be new when it's loaded from fedora" do
|
30
|
-
ds.content = "_:g70324142325120 <http://purl.org/dc/terms/title> \"Alternator\" .
|
31
|
-
<#{ActiveFedora.fedora.host}/test/test:124> <http://purl.org/dc/terms/hasPart> _:g70324142325120 ."
|
32
|
-
ds.resource.persist!
|
33
|
-
expect(ds.parts.first).to_not be_new_record
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
it "is able to nest a complex object" do
|
38
|
-
comp = SpecDatastream::Component.new(nil, ds.graph)
|
39
|
-
comp.label = ["Alternator"]
|
40
|
-
ds.parts = comp
|
41
|
-
expect(ds.parts.first.label).to eq ["Alternator"]
|
42
|
-
end
|
43
|
-
|
44
|
-
it "is able to replace attributes" do
|
45
|
-
ds.parts.build(label: 'Alternator')
|
46
|
-
expect(ds.parts.first.label).to eq ['Alternator']
|
47
|
-
ds.parts.first.label = ['Distributor']
|
48
|
-
expect(ds.parts.first.label).to eq ['Distributor']
|
49
|
-
end
|
50
|
-
|
51
|
-
it "is able to replace objects" do
|
52
|
-
ds.parts.build(label: 'Alternator')
|
53
|
-
ds.parts.build(label: 'Distributor')
|
54
|
-
expect(ds.parts.size).to eq 2
|
55
|
-
comp = SpecDatastream::Component.new(nil, ds.graph)
|
56
|
-
comp.label = "Injector port"
|
57
|
-
ds.parts = [comp]
|
58
|
-
expect(ds.parts.size).to eq 1
|
59
|
-
end
|
60
|
-
|
61
|
-
it "is able to nest many complex objects" do
|
62
|
-
comp1 = SpecDatastream::Component.new nil, ds.graph
|
63
|
-
comp1.label = ["Alternator"]
|
64
|
-
comp2 = SpecDatastream::Component.new nil, ds.graph
|
65
|
-
comp2.label = ["Crankshaft"]
|
66
|
-
ds.parts = [comp1, comp2]
|
67
|
-
expect(ds.parts.map(&:label)).to contain_exactly ["Alternator"], ["Crankshaft"]
|
68
|
-
end
|
69
|
-
|
70
|
-
it "is able to clear complex objects" do
|
71
|
-
comp1 = SpecDatastream::Component.new nil, ds.graph
|
72
|
-
comp1.label = ["Alternator"]
|
73
|
-
comp2 = SpecDatastream::Component.new nil, ds.graph
|
74
|
-
comp2.label = ["Crankshaft"]
|
75
|
-
ds.parts = [comp1, comp2]
|
76
|
-
ds.parts = []
|
77
|
-
expect(ds.parts).to eq []
|
78
|
-
end
|
79
|
-
|
80
|
-
it "loads complex objects" do
|
81
|
-
ds.content = <<END
|
82
|
-
_:g70350851837440 <http://purl.org/dc/terms/title> "Alternator" .
|
83
|
-
<#{ActiveFedora.fedora.host}/test/test:124> <http://purl.org/dc/terms/hasPart> _:g70350851837440 .
|
84
|
-
<#{ActiveFedora.fedora.host}/test/test:124> <http://purl.org/dc/terms/hasPart> _:g70350851833380 .
|
85
|
-
_:g70350851833380 <http://purl.org/dc/terms/title> "Crankshaft" .
|
86
|
-
END
|
87
|
-
expect(ds.parts.map(&:label)).to contain_exactly ["Alternator"], ["Crankshaft"]
|
88
|
-
end
|
89
|
-
|
90
|
-
it "builds complex objects when a parent node doesn't exist" do
|
91
|
-
part = ds.parts.build
|
92
|
-
expect(part).to be_kind_of SpecDatastream::Component
|
93
|
-
part.label = "Wheel bearing"
|
94
|
-
expect(ds.parts.first.label).to eq ['Wheel bearing']
|
95
|
-
end
|
96
|
-
|
97
|
-
it "does not create a child node when hitting the accessor" do
|
98
|
-
ds.parts
|
99
|
-
expect(ds.parts.first).to be_nil
|
100
|
-
expect(ds.serialize).to eq ''
|
101
|
-
end
|
102
|
-
|
103
|
-
it "builds complex objects when a parent node exists" do
|
104
|
-
part = ds.parts.build
|
105
|
-
expect(part).to be_kind_of SpecDatastream::Component
|
106
|
-
part.label = "Wheel bearing"
|
107
|
-
expect(ds.parts.first.label).to eq ['Wheel bearing']
|
108
|
-
end
|
109
|
-
|
110
|
-
describe "#first_or_create" do
|
111
|
-
it "returns a result if the predicate exists" do
|
112
|
-
part1 = ds.parts.build
|
113
|
-
expect(ds.parts.first_or_create).to eq part1
|
114
|
-
end
|
115
|
-
|
116
|
-
it "creates a new result if the predicate doesn't exist" do
|
117
|
-
expect(ds.parts).to eq []
|
118
|
-
part = ds.parts.first_or_create(label: 'Front control arm bushing')
|
119
|
-
expect(part.label).to eq ['Front control arm bushing']
|
120
|
-
expect(ds.parts).to eq [part]
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
describe "with type" do
|
126
|
-
describe "one class per assertion" do
|
127
|
-
before(:each) do
|
128
|
-
class SpecDatastream < ActiveFedora::NtriplesRDFDatastream
|
129
|
-
property :mediator, predicate: ::RDF::Vocab::DC.mediator, class_name: 'MediatorUser'
|
130
|
-
|
131
|
-
class MediatorUser < ActiveTriples::Resource
|
132
|
-
configure type: ::RDF::Vocab::DC.AgentClass
|
133
|
-
property :title, predicate: ::RDF::Vocab::DC.title
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
after(:each) do
|
139
|
-
Object.send(:remove_const, :SpecDatastream)
|
140
|
-
end
|
141
|
-
let(:ds) { SpecDatastream.new("#{ActiveFedora.fedora.host}/test/test:124/descMd") }
|
142
|
-
|
143
|
-
it "stores the type of complex objects when type is specified" do
|
144
|
-
comp = SpecDatastream::MediatorUser.new nil, ds.graph
|
145
|
-
comp.title = ["Doctor"]
|
146
|
-
ds.mediator = comp
|
147
|
-
expect(ds.mediator.first.type.first).to be_instance_of ::RDF::URI
|
148
|
-
expect(ds.mediator.first.type.first.to_s).to eq "http://purl.org/dc/terms/AgentClass"
|
149
|
-
expect(ds.mediator.first.title.first).to eq 'Doctor'
|
150
|
-
end
|
151
|
-
|
152
|
-
it "adds the type of complex object when it is not provided" do
|
153
|
-
ds.content = <<END
|
154
|
-
_:g70350851837440 <http://purl.org/dc/terms/title> "Mediation Person" .
|
155
|
-
<#{ActiveFedora.fedora.host}/test/test:124> <http://purl.org/dc/terms/mediator> _:g70350851837440 .
|
156
|
-
END
|
157
|
-
expect(ds.mediator.first.type.first.to_s).to eq "http://purl.org/dc/terms/AgentClass"
|
158
|
-
end
|
159
|
-
|
160
|
-
it "adds load the type of complex objects when provided (superceeding what is specified by the class)" do
|
161
|
-
ds.content = <<END
|
162
|
-
_:g70350851837440 <http://purl.org/dc/terms/title> "Mediation Orgainzation" .
|
163
|
-
_:g70350851837440 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.ebu.ch/metadata/ontologies/ebucore#Organisation> .
|
164
|
-
<#{ActiveFedora.fedora.host}/test/test:124> <http://purl.org/dc/terms/mediator> _:g70350851837440 .
|
165
|
-
END
|
166
|
-
expect(ds.mediator.first.type.map(&:to_s)).to include "http://www.ebu.ch/metadata/ontologies/ebucore#Organisation"
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
describe "shared assertion to different classes" do
|
171
|
-
before(:each) do
|
172
|
-
class EbuCore < RDF::Vocabulary("http://www.ebu.ch/metadata/ontologies/ebucore#")
|
173
|
-
property :isEpisodeOf
|
174
|
-
property :title
|
175
|
-
end
|
176
|
-
|
177
|
-
class SpecContainer < ActiveFedora::Base
|
178
|
-
has_subresource :info, class_name: 'SpecDatastream'
|
179
|
-
end
|
180
|
-
|
181
|
-
class SpecDatastream < ActiveFedora::NtriplesRDFDatastream
|
182
|
-
property :series, predicate: EbuCore.isEpisodeOf, class_name: 'Series'
|
183
|
-
property :program, predicate: EbuCore.isEpisodeOf, class_name: 'Program'
|
184
|
-
|
185
|
-
class Series < ActiveTriples::Resource
|
186
|
-
configure type: 'http://www.ebu.ch/metadata/ontologies/ebucore#Series'
|
187
|
-
property :title, predicate: EbuCore.title
|
188
|
-
end
|
189
|
-
|
190
|
-
class Program < ActiveTriples::Resource
|
191
|
-
configure type: 'http://www.ebu.ch/metadata/ontologies/ebucore#Programme'
|
192
|
-
property :title, predicate: EbuCore.title
|
193
|
-
end
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
after(:each) do
|
198
|
-
Object.send(:remove_const, :SpecDatastream)
|
199
|
-
Object.send(:remove_const, :SpecContainer)
|
200
|
-
end
|
201
|
-
|
202
|
-
let(:parent) { SpecContainer.new id: '124' }
|
203
|
-
let(:file) { parent.info }
|
204
|
-
|
205
|
-
it "stores the type of complex objects when type is specified" do
|
206
|
-
pending "This is no longer supported by ActiveTriples - can we deprecate this altogether?"
|
207
|
-
series = SpecDatastream::Series.new nil, file.graph
|
208
|
-
series.title = ["renovating bathrooms"]
|
209
|
-
file.series = series
|
210
|
-
|
211
|
-
program = SpecDatastream::Program.new nil, file.graph
|
212
|
-
program.title = ["This old House"]
|
213
|
-
file.program = program
|
214
|
-
|
215
|
-
expect(file.program.first.type.size).to eq 1
|
216
|
-
expect(file.program.first.type.first.to_s).to eq 'http://www.ebu.ch/metadata/ontologies/ebucore#Programme'
|
217
|
-
expect(file.series.first.type.size).to eq 1
|
218
|
-
expect(file.series.first.type.first.to_s).to eq 'http://www.ebu.ch/metadata/ontologies/ebucore#Series'
|
219
|
-
end
|
220
|
-
|
221
|
-
it "creates an object of the correct type" do
|
222
|
-
expect(file.program.build).to be_kind_of SpecDatastream::Program
|
223
|
-
expect(file.series.build).to be_kind_of SpecDatastream::Series
|
224
|
-
end
|
225
|
-
end
|
226
|
-
end
|
227
|
-
end
|
@@ -1,180 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "Nesting attribute behavior of RDFDatastream" do
|
4
|
-
describe ".attributes=" do
|
5
|
-
context "complex properties in a datastream" do
|
6
|
-
before do
|
7
|
-
class DummyMADS < RDF::Vocabulary("http://www.loc.gov/mads/rdf/v1#")
|
8
|
-
# TODO: this test is order dependent. It expects to use the object created in the previous test
|
9
|
-
# componentList and Types of components
|
10
|
-
property :componentList
|
11
|
-
property :Topic
|
12
|
-
property :Temporal
|
13
|
-
property :PersonalName
|
14
|
-
property :CorporateName
|
15
|
-
property :ComplexSubject
|
16
|
-
|
17
|
-
# elementList and elementList values
|
18
|
-
property :elementList
|
19
|
-
property :elementValue
|
20
|
-
property :TopicElement
|
21
|
-
property :TemporalElement
|
22
|
-
property :NameElement
|
23
|
-
property :FullNameElement
|
24
|
-
property :DateNameElement
|
25
|
-
end
|
26
|
-
|
27
|
-
class ComplexRDFDatastream < ActiveFedora::NtriplesRDFDatastream
|
28
|
-
property :topic, predicate: DummyMADS.Topic, class_name: "Topic"
|
29
|
-
property :personalName, predicate: DummyMADS.PersonalName, class_name: "PersonalName"
|
30
|
-
property :title, predicate: ::RDF::Vocab::DC.title
|
31
|
-
|
32
|
-
accepts_nested_attributes_for :topic, :personalName
|
33
|
-
|
34
|
-
class Topic < ActiveTriples::Resource
|
35
|
-
property :elementList, predicate: DummyMADS.elementList, class_name: "ComplexRDFDatastream::ElementList"
|
36
|
-
accepts_nested_attributes_for :elementList
|
37
|
-
end
|
38
|
-
class PersonalName < ActiveTriples::Resource
|
39
|
-
property :elementList, predicate: DummyMADS.elementList, class_name: "ComplexRDFDatastream::ElementList"
|
40
|
-
property :extraProperty, predicate: DummyMADS.elementValue, class_name: "ComplexRDFDatastream::Topic"
|
41
|
-
accepts_nested_attributes_for :elementList, :extraProperty
|
42
|
-
end
|
43
|
-
class ElementList < ActiveTriples::List
|
44
|
-
configure type: DummyMADS.elementList
|
45
|
-
property :topicElement, predicate: DummyMADS.TopicElement, class_name: "ComplexRDFDatastream::MadsTopicElement"
|
46
|
-
property :temporalElement, predicate: DummyMADS.TemporalElement
|
47
|
-
property :fullNameElement, predicate: DummyMADS.FullNameElement
|
48
|
-
property :dateNameElement, predicate: DummyMADS.DateNameElement
|
49
|
-
property :nameElement, predicate: DummyMADS.NameElement
|
50
|
-
property :elementValue, predicate: DummyMADS.elementValue
|
51
|
-
accepts_nested_attributes_for :topicElement
|
52
|
-
end
|
53
|
-
class MadsTopicElement < ActiveTriples::Resource
|
54
|
-
configure type: DummyMADS.TopicElement
|
55
|
-
property :elementValue, predicate: DummyMADS.elementValue
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
after do
|
60
|
-
Object.send(:remove_const, :ComplexRDFDatastream)
|
61
|
-
Object.send(:remove_const, :DummyMADS)
|
62
|
-
end
|
63
|
-
subject(:complex_datastream) { ComplexRDFDatastream.new }
|
64
|
-
let(:params) do
|
65
|
-
{ myResource:
|
66
|
-
{
|
67
|
-
topic_attributes: {
|
68
|
-
'0' =>
|
69
|
-
{
|
70
|
-
elementList_attributes: [{
|
71
|
-
topicElement_attributes: [{
|
72
|
-
id: 'http://library.ucsd.edu/ark:/20775/bb3333333x',
|
73
|
-
elementValue: "Cosmology"
|
74
|
-
}]
|
75
|
-
}]
|
76
|
-
},
|
77
|
-
'1' =>
|
78
|
-
{
|
79
|
-
elementList_attributes: [{
|
80
|
-
topicElement_attributes: { '0' => { elementValue: "Quantum Behavior" } }
|
81
|
-
}]
|
82
|
-
}
|
83
|
-
},
|
84
|
-
personalName_attributes: [
|
85
|
-
{
|
86
|
-
id: 'http://library.ucsd.edu/ark:20775/jefferson',
|
87
|
-
elementList_attributes: [{
|
88
|
-
fullNameElement: "Jefferson, Thomas",
|
89
|
-
dateNameElement: "1743-1826"
|
90
|
-
}]
|
91
|
-
}
|
92
|
-
# , "Hemings, Sally"
|
93
|
-
]
|
94
|
-
} }
|
95
|
-
end
|
96
|
-
|
97
|
-
describe "on lists" do
|
98
|
-
subject(:personal_name) { ComplexRDFDatastream::PersonalName.new(nil) }
|
99
|
-
it "accepts a hash" do
|
100
|
-
personal_name.elementList_attributes = [{ topicElement_attributes: { '0' => { elementValue: "Quantum Behavior" }, '1' => { elementValue: "Wave Function" } } }]
|
101
|
-
expect(personal_name.elementList.first[0].elementValue).to eq ["Quantum Behavior"]
|
102
|
-
expect(personal_name.elementList.first[1].elementValue).to eq ["Wave Function"]
|
103
|
-
end
|
104
|
-
it "accepts an array" do
|
105
|
-
personal_name.elementList_attributes = [{ topicElement_attributes: [{ elementValue: "Quantum Behavior" }, { elementValue: "Wave Function" }] }]
|
106
|
-
element_values = personal_name.elementList.first.map(&:elementValue)
|
107
|
-
expect(element_values).to contain_exactly ["Quantum Behavior"], ["Wave Function"]
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
context "from nested objects" do
|
112
|
-
before do
|
113
|
-
# Replace the graph's contents with the Hash
|
114
|
-
complex_datastream.attributes = params[:myResource]
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'has attributes' do
|
118
|
-
element_values = complex_datastream.topic.map { |x| x.elementList.first[0].elementValue }
|
119
|
-
expect(element_values).to contain_exactly ["Cosmology"], ["Quantum Behavior"]
|
120
|
-
expect(complex_datastream.personalName.first.elementList.first.fullNameElement).to contain_exactly "Jefferson, Thomas"
|
121
|
-
expect(complex_datastream.personalName.first.elementList.first.dateNameElement).to contain_exactly "1743-1826"
|
122
|
-
end
|
123
|
-
|
124
|
-
it 'builds nodes with ids' do
|
125
|
-
element_list_elements = complex_datastream.topic.flat_map { |y| y.elementList.first[0].rdf_subject }
|
126
|
-
expect(element_list_elements).to include 'http://library.ucsd.edu/ark:/20775/bb3333333x'
|
127
|
-
expect(complex_datastream.personalName.first.rdf_subject).to eq 'http://library.ucsd.edu/ark:20775/jefferson'
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'fails when writing to a non-predicate' do
|
131
|
-
attributes = { topic_attributes: { '0' => { elementList_attributes: [{ topicElement_attributes: [{ fake_predicate: "Cosmology" }] }] } } }
|
132
|
-
expect { complex_datastream.attributes = attributes }.to raise_error ArgumentError
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'fails when writing to a non-predicate with a setter method' do
|
136
|
-
attributes = { topic_attributes: { '0' => { elementList_attributes: [{ topicElement_attributes: [{ name: "Cosmology" }] }] } } }
|
137
|
-
expect { complex_datastream.attributes = attributes }.to raise_error ArgumentError
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
describe "with an existing object" do
|
143
|
-
before(:each) do
|
144
|
-
class SpecDatastream < ActiveFedora::NtriplesRDFDatastream
|
145
|
-
property :parts, predicate: ::RDF::Vocab::DC.hasPart, class_name: 'Component'
|
146
|
-
accepts_nested_attributes_for :parts, allow_destroy: true
|
147
|
-
|
148
|
-
class Component < ActiveTriples::Resource
|
149
|
-
property :label, predicate: ::RDF::Vocab::DC.title
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
after(:each) do
|
155
|
-
Object.send(:remove_const, :SpecDatastream)
|
156
|
-
end
|
157
|
-
subject(:spec_datastream) { SpecDatastream.new }
|
158
|
-
before do
|
159
|
-
spec_datastream.attributes = { parts_attributes: [
|
160
|
-
{ label: 'Alternator' },
|
161
|
-
{ label: 'Distributor' },
|
162
|
-
{ label: 'Transmission' },
|
163
|
-
{ label: 'Fuel Filter' }
|
164
|
-
] }
|
165
|
-
end
|
166
|
-
let(:replace_object_id) { spec_datastream.parts.find { |x| x.label == ['Distributor'] }.rdf_subject.to_s }
|
167
|
-
let(:remove_object_id) { spec_datastream.parts.find { |x| x.label == ['Fuel Filter'] }.rdf_subject.to_s }
|
168
|
-
|
169
|
-
it "updates nested objects" do
|
170
|
-
spec_datastream.parts_attributes = [{ id: replace_object_id, label: "Universal Joint" }, { label: "Oil Pump" }, { id: remove_object_id, _destroy: '1', label: "bar1 uno" }]
|
171
|
-
|
172
|
-
expect(spec_datastream.parts.map { |p| p.label.first }).to contain_exactly 'Alternator', 'Universal Joint', 'Transmission', 'Oil Pump'
|
173
|
-
end
|
174
|
-
it "create a new object when the id is provided" do
|
175
|
-
spec_datastream.parts_attributes = [{ id: 'http://example.com/part#1', label: "Universal Joint" }]
|
176
|
-
expect(spec_datastream.parts.map(&:rdf_subject)).to include RDF::URI('http://example.com/part#1')
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
@@ -1,215 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ActiveFedora::NtriplesRDFDatastream do
|
4
|
-
before do
|
5
|
-
class FileVocabulary < RDF::Vocabulary("http://downlode.org/Code/RDF/File_Properties/schema#")
|
6
|
-
property :size
|
7
|
-
end
|
8
|
-
|
9
|
-
Deprecation.silence(ActiveFedora::RDFDatastream) do
|
10
|
-
class MyDatastream < ActiveFedora::NtriplesRDFDatastream
|
11
|
-
property :title, predicate: ::RDF::Vocab::DC.title do |index|
|
12
|
-
index.as :stored_searchable, :facetable
|
13
|
-
end
|
14
|
-
property :date_uploaded, predicate: ::RDF::Vocab::DC.dateSubmitted do |index|
|
15
|
-
index.type :date
|
16
|
-
index.as :stored_searchable, :sortable
|
17
|
-
end
|
18
|
-
property :filesize, predicate: FileVocabulary.size do |index|
|
19
|
-
index.type :integer
|
20
|
-
index.as :stored_sortable
|
21
|
-
end
|
22
|
-
property :part, predicate: ::RDF::Vocab::DC.hasPart
|
23
|
-
property :based_near, predicate: ::RDF::Vocab::FOAF.based_near
|
24
|
-
property :related_url, predicate: ::RDF::RDFS.seeAlso
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
class RdfTest < ActiveFedora::Base
|
29
|
-
has_subresource 'rdf', class_name: 'MyDatastream'
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
subject(:my_datastream) { MyDatastream.new(described_class.id_to_uri('test:1')) }
|
34
|
-
|
35
|
-
after do
|
36
|
-
Object.send(:remove_const, :RdfTest)
|
37
|
-
Object.send(:remove_const, :MyDatastream)
|
38
|
-
Object.send(:remove_const, :FileVocabulary)
|
39
|
-
end
|
40
|
-
|
41
|
-
let(:remote_content) do
|
42
|
-
<<EOF
|
43
|
-
<#{ActiveFedora.fedora.host}/test/test:1> <http://purl.org/dc/terms/created> "2010-12-31"^^<http://www.w3.org/2001/XMLSchema#date> .
|
44
|
-
<#{ActiveFedora.fedora.host}/test/test:1> <http://purl.org/dc/terms/title> "Title of work" .
|
45
|
-
<#{ActiveFedora.fedora.host}/test/test:1> <http://purl.org/dc/terms/publisher> "Penn State" .
|
46
|
-
<#{ActiveFedora.fedora.host}/test/test:1> <http://xmlns.com/foaf/0.1/based_near> "New York, NY, US" .
|
47
|
-
<#{ActiveFedora.fedora.host}/test/test:1> <http://www.w3.org/2000/01/rdf-schema#seeAlso> <http://google.com/> .
|
48
|
-
<#{ActiveFedora.fedora.host}/test/test:1/content> <http://purl.org/dc/terms/title> "Title of datastream" .
|
49
|
-
EOF
|
50
|
-
end
|
51
|
-
|
52
|
-
it "delegates as_json to the fields" do
|
53
|
-
my_datastream.title = "Title of work"
|
54
|
-
expect(my_datastream.title.as_json).to eq ["Title of work"]
|
55
|
-
expect(my_datastream.title.to_json).to eq "\[\"Title of work\"\]"
|
56
|
-
end
|
57
|
-
|
58
|
-
describe "serializing" do
|
59
|
-
it "handles dates" do
|
60
|
-
my_datastream.date_uploaded = [Date.parse('2012-11-02')]
|
61
|
-
expect(my_datastream.date_uploaded.first).to be_kind_of Date
|
62
|
-
end
|
63
|
-
it "handles integers" do
|
64
|
-
my_datastream.filesize = 12_345
|
65
|
-
expect(my_datastream.filesize).to eq [12_345]
|
66
|
-
expect(my_datastream.filesize.first).to be_kind_of Fixnum
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
it "sets and recall values" do
|
71
|
-
my_datastream.title = 'War and Peace'
|
72
|
-
expect(my_datastream).to be_changed
|
73
|
-
my_datastream.based_near = ["Moscow, Russia"]
|
74
|
-
my_datastream.related_url = ["http://en.wikipedia.org/wiki/War_and_Peace"]
|
75
|
-
my_datastream.part = ["this is a part"]
|
76
|
-
my_datastream.save
|
77
|
-
expect(my_datastream.title).to eq ['War and Peace']
|
78
|
-
expect(my_datastream.based_near).to eq ["Moscow, Russia"]
|
79
|
-
expect(my_datastream.related_url).to eq ["http://en.wikipedia.org/wiki/War_and_Peace"]
|
80
|
-
expect(my_datastream.part).to eq ["this is a part"]
|
81
|
-
end
|
82
|
-
|
83
|
-
it "set, persist, and recall values" do
|
84
|
-
my_datastream.title = 'War and Peace'
|
85
|
-
my_datastream.based_near = ["Moscow, Russia"]
|
86
|
-
my_datastream.related_url = ["http://en.wikipedia.org/wiki/War_and_Peace"]
|
87
|
-
my_datastream.part = ["this is a part"]
|
88
|
-
my_datastream.save
|
89
|
-
|
90
|
-
loaded = MyDatastream.new(my_datastream.uri)
|
91
|
-
expect(loaded.title).to eq ['War and Peace']
|
92
|
-
expect(loaded.based_near).to eq ['Moscow, Russia']
|
93
|
-
expect(loaded.related_url).to eq ['http://en.wikipedia.org/wiki/War_and_Peace']
|
94
|
-
expect(loaded.part).to eq ['this is a part']
|
95
|
-
end
|
96
|
-
|
97
|
-
it "sets multiple values" do
|
98
|
-
my_datastream.part = ["part 1", "part 2"]
|
99
|
-
my_datastream.save
|
100
|
-
|
101
|
-
loaded = MyDatastream.new(my_datastream.uri)
|
102
|
-
expect(loaded.part).to contain_exactly 'part 1', 'part 2'
|
103
|
-
end
|
104
|
-
|
105
|
-
it "appends values" do
|
106
|
-
my_datastream.part = ["thing 1"]
|
107
|
-
my_datastream.save
|
108
|
-
|
109
|
-
my_datastream.part << "thing 2"
|
110
|
-
expect(my_datastream.part).to contain_exactly "thing 1", "thing 2"
|
111
|
-
end
|
112
|
-
|
113
|
-
it "is able to save a blank document" do
|
114
|
-
my_datastream.title = ""
|
115
|
-
my_datastream.save
|
116
|
-
end
|
117
|
-
|
118
|
-
it "loads n-triples into the graph" do
|
119
|
-
ntrip = '<http://oregondigital.org/ns/62> <http://purl.org/dc/terms/type> "Image" .
|
120
|
-
<http://oregondigital.org/ns/62> <http://purl.org/dc/terms/spatial> "Benton County (Ore.)" .
|
121
|
-
'
|
122
|
-
my_datastream.content = ntrip
|
123
|
-
expect(my_datastream.graph.statements.to_a).to contain_exactly(*RDF::NTriples::Reader.new(ntrip).statements.to_a)
|
124
|
-
end
|
125
|
-
|
126
|
-
describe "using rdf_subject" do
|
127
|
-
before do
|
128
|
-
# reopening existing class
|
129
|
-
class MyDatastream < ActiveFedora::NtriplesRDFDatastream
|
130
|
-
rdf_subject { |ds| RDF::URI.new("http://oregondigital.org/ns/#{parent_uri(ds).split('/')[-1].split(':')[1]}") }
|
131
|
-
property :dctype, predicate: ::RDF::Vocab::DC.type
|
132
|
-
end
|
133
|
-
rdf_test.rdf.dctype = "Frog"
|
134
|
-
rdf_test.save!
|
135
|
-
end
|
136
|
-
|
137
|
-
after do
|
138
|
-
rdf_test.destroy
|
139
|
-
end
|
140
|
-
|
141
|
-
subject(:rdf_test) { RdfTest.new(id: '/test:99') }
|
142
|
-
|
143
|
-
it "writes rdf with proper subjects" do
|
144
|
-
rdf_test.reload
|
145
|
-
expect(rdf_test.rdf.graph.dump(:ntriples)).to eq "<http://oregondigital.org/ns/99> <http://purl.org/dc/terms/type> \"Frog\" .\n"
|
146
|
-
rdf_test.rdf.dctype == ['Frog']
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
it "deletes values" do
|
151
|
-
my_datastream.title = "Hamlet"
|
152
|
-
my_datastream.related_url = ["http://psu.edu/"]
|
153
|
-
my_datastream.related_url << "http://projecthydra.org/"
|
154
|
-
|
155
|
-
expect(my_datastream.title).to eq ["Hamlet"]
|
156
|
-
expect(my_datastream.related_url).to include("http://psu.edu/")
|
157
|
-
expect(my_datastream.related_url).to include("http://projecthydra.org/")
|
158
|
-
|
159
|
-
my_datastream.title = "" # empty string can be meaningful, don't assume delete.
|
160
|
-
expect(my_datastream.title).to eq ['']
|
161
|
-
|
162
|
-
my_datastream.title = nil
|
163
|
-
my_datastream.related_url.delete("http://projecthydra.org/")
|
164
|
-
|
165
|
-
expect(my_datastream.title).to eq []
|
166
|
-
expect(my_datastream.related_url).to eq ["http://psu.edu/"]
|
167
|
-
end
|
168
|
-
|
169
|
-
it "deletes multiple values at once" do
|
170
|
-
my_datastream.part = ["MacBeth"]
|
171
|
-
my_datastream.part << "Hamlet"
|
172
|
-
my_datastream.part << "Romeo & Juliet"
|
173
|
-
expect(my_datastream.part).to include "MacBeth"
|
174
|
-
my_datastream.part.subtract(["MacBeth", "Romeo & Juliet"])
|
175
|
-
expect(my_datastream.part).to eq ["Hamlet"]
|
176
|
-
expect(my_datastream.part.first).to eq "Hamlet"
|
177
|
-
end
|
178
|
-
it "ignores values to be deleted that do not exist" do
|
179
|
-
my_datastream.part = ["title1", "title2", "title3"]
|
180
|
-
my_datastream.part.subtract(["title2", "title4", "title6"])
|
181
|
-
expect(my_datastream.part).to contain_exactly "title1", "title3"
|
182
|
-
end
|
183
|
-
|
184
|
-
describe "term proxy methods" do
|
185
|
-
before(:each) do
|
186
|
-
class TitleDatastream < ActiveFedora::NtriplesRDFDatastream
|
187
|
-
property :title, predicate: ::RDF::Vocab::DC.title
|
188
|
-
end
|
189
|
-
end
|
190
|
-
subject(:title_datastream) { TitleDatastream.new }
|
191
|
-
before { title_datastream.title = ["title1", "title2", "title3"] }
|
192
|
-
|
193
|
-
after(:each) do
|
194
|
-
Object.send(:remove_const, :TitleDatastream)
|
195
|
-
end
|
196
|
-
|
197
|
-
it "supports the count method to determine # of values" do
|
198
|
-
expect(title_datastream.title.count).to eq 3
|
199
|
-
end
|
200
|
-
it "iterates over multiple values" do
|
201
|
-
expect(title_datastream.title).to respond_to(:each)
|
202
|
-
end
|
203
|
-
it "evaluates equality predictably" do
|
204
|
-
expect(title_datastream.title).to contain_exactly "title1", "title2", "title3"
|
205
|
-
end
|
206
|
-
it "supports the empty? method" do
|
207
|
-
expect(title_datastream.title).to_not be_empty
|
208
|
-
title_datastream.title.subtract(["title1", "title2", "title3"])
|
209
|
-
expect(title_datastream.title).to be_empty
|
210
|
-
end
|
211
|
-
it "supports the each method" do
|
212
|
-
expect(title_datastream.title.respond_to?(:each)).to eq true
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|