active-fedora 3.1.0 → 3.1.1
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.
- data/Gemfile.lock +1 -1
- data/lib/active_fedora/base.rb +40 -18
- data/lib/active_fedora/content_model.rb +14 -3
- data/lib/active_fedora/digital_object.rb +0 -19
- data/lib/active_fedora/rels_ext_datastream.rb +1 -1
- data/lib/active_fedora/semantic_node.rb +23 -47
- data/lib/active_fedora/version.rb +1 -1
- data/spec/support/mock_fedora.rb +6 -3
- data/spec/unit/base_spec.rb +123 -30
- data/spec/unit/qualified_dublin_core_datastream_spec.rb +2 -2
- data/spec/unit/rels_ext_datastream_spec.rb +9 -19
- data/spec/unit/semantic_node_spec.rb +6 -30
- metadata +4 -4
data/Gemfile.lock
CHANGED
data/lib/active_fedora/base.rb
CHANGED
@@ -34,7 +34,9 @@ module ActiveFedora
|
|
34
34
|
include SemanticNode
|
35
35
|
class_inheritable_accessor :ds_specs, :class_named_datastreams_desc
|
36
36
|
self.class_named_datastreams_desc = {}
|
37
|
-
|
37
|
+
|
38
|
+
self.ds_specs = {'RELS-EXT'=> {:type=> ActiveFedora::RelsExtDatastream, :label=>"", :block=>nil}}
|
39
|
+
|
38
40
|
attr_accessor :named_datastreams_desc
|
39
41
|
|
40
42
|
|
@@ -97,7 +99,7 @@ module ActiveFedora
|
|
97
99
|
end
|
98
100
|
|
99
101
|
def self.datastream_class_for_name(dsid)
|
100
|
-
ds_specs[dsid] ? ds_specs[dsid]
|
102
|
+
ds_specs[dsid] ? ds_specs[dsid][:type] : ActiveFedora::Datastream
|
101
103
|
end
|
102
104
|
|
103
105
|
#This method is used to specify the details of a datastream.
|
@@ -105,8 +107,7 @@ module ActiveFedora
|
|
105
107
|
#execute the block, but stores it at the class level, to be executed
|
106
108
|
#by any future instantiations.
|
107
109
|
def self.has_metadata(args, &block)
|
108
|
-
|
109
|
-
ds_specs[args[:name]]= [args[:type], args.fetch(:label,""), block]
|
110
|
+
ds_specs[args[:name]]= {:type => args[:type], :label => args.fetch(:label,""), :control_group => args.fetch(:control_group,"X"), :disseminator => args.fetch(:disseminator,""), :url => args.fetch(:url,""),:block => block}
|
110
111
|
end
|
111
112
|
|
112
113
|
def method_missing(name, *args)
|
@@ -127,6 +128,7 @@ module ActiveFedora
|
|
127
128
|
#Saves a Base object, and any dirty datastreams, then updates
|
128
129
|
#the Solr index for this object.
|
129
130
|
def save
|
131
|
+
|
130
132
|
# If it's a new object, set the conformsTo relationship for Fedora CMA
|
131
133
|
if new_object?
|
132
134
|
result = create
|
@@ -199,20 +201,17 @@ module ActiveFedora
|
|
199
201
|
ds_spec = self.class.ds_specs[dsid]
|
200
202
|
datastreams[dsid] = datastream
|
201
203
|
if (ds_spec)
|
202
|
-
klass = ds_spec
|
204
|
+
klass = ds_spec[:type]
|
203
205
|
datastreams[dsid].model = self if klass == RelsExtDatastream
|
204
206
|
|
205
|
-
if ds_spec.
|
206
|
-
ds_spec.
|
207
|
+
if ds_spec[:block].class == Proc
|
208
|
+
ds_spec[:block].call(datastreams[dsid])
|
207
209
|
end
|
208
|
-
# if klass.respond_to? :from_xml
|
209
|
-
# ### TODO, this is loading eagerly, we could load it as needed
|
210
|
-
# klass.from_xml(datastreams[dsid].content, datastreams[dsid])
|
211
|
-
# end
|
212
210
|
end
|
213
211
|
end
|
214
212
|
end
|
215
213
|
|
214
|
+
|
216
215
|
# Adds datastream to the object. Saves the datastream to fedora upon adding.
|
217
216
|
# If datastream does not have a DSID, a unique DSID is generated
|
218
217
|
# :prefix option will set the prefix on auto-generated DSID
|
@@ -994,23 +993,46 @@ module ActiveFedora
|
|
994
993
|
private
|
995
994
|
def configure_defined_datastreams
|
996
995
|
if self.class.ds_specs
|
997
|
-
self.class.ds_specs.each do |name,
|
996
|
+
self.class.ds_specs.each do |name,ds_config|
|
998
997
|
if self.datastreams.has_key?(name)
|
999
998
|
#attributes = self.datastreams[name].attributes
|
1000
999
|
else
|
1001
|
-
ds =
|
1002
|
-
ds.model = self if
|
1003
|
-
ds.dsLabel =
|
1000
|
+
ds = ds_config[:type].new(inner_object, name)
|
1001
|
+
ds.model = self if ds_config[:type] == RelsExtDatastream
|
1002
|
+
ds.dsLabel = ds_config[:label] if ds_config[:label].present?
|
1003
|
+
ds.controlGroup = ds_config[:control_group]
|
1004
1004
|
# If you called has_metadata with a block, pass the block into the Datastream class
|
1005
|
-
if
|
1006
|
-
|
1005
|
+
if ds_config[:block].class == Proc
|
1006
|
+
ds_config[:block].call(ds)
|
1007
1007
|
end
|
1008
|
-
|
1008
|
+
additional_attributes_for_external_and_redirect_control_groups(ds, ds_config)
|
1009
1009
|
self.add_datastream(ds)
|
1010
1010
|
end
|
1011
1011
|
end
|
1012
1012
|
end
|
1013
1013
|
end
|
1014
|
+
|
1015
|
+
|
1016
|
+
# This method provides validation of proper options for control_group 'E' and 'R' and builds an attribute hash to be merged back into ds.attributes prior to saving
|
1017
|
+
#
|
1018
|
+
# @param [Object] ds The datastream
|
1019
|
+
# @param [Object] ds_config hash of options which may contain :disseminator and :url
|
1020
|
+
def additional_attributes_for_external_and_redirect_control_groups(ds,ds_config)
|
1021
|
+
if ds.controlGroup=='E'
|
1022
|
+
raise "Must supply either :disseminator or :url if you specify :control_group => 'E'" if (ds_config[:disseminator].empty? && ds_config[:url].empty?)
|
1023
|
+
if !ds_config[:disseminator].empty?
|
1024
|
+
ds.dsLocation= "#{RubydoraConnection.instance.options[:url]}/objects/#{pid}/methods/#{ds_config[:disseminator]}"
|
1025
|
+
elsif !ds_config[:url].empty?
|
1026
|
+
ds.dsLocation= ds_config[:url]
|
1027
|
+
end
|
1028
|
+
elsif ds.controlGroup=='R'
|
1029
|
+
raise "Must supply a :url if you specify :control_group => 'R'" if (ds_config[:url].empty?)
|
1030
|
+
ds.dsLocation= ds_config[:url]
|
1031
|
+
end
|
1032
|
+
end
|
1033
|
+
|
1034
|
+
|
1035
|
+
|
1014
1036
|
|
1015
1037
|
# Deals with preparing new object to be saved to Fedora, then pushes it and its datastreams into Fedora.
|
1016
1038
|
def create
|
@@ -13,7 +13,7 @@ module ActiveFedora
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.pid_from_ruby_class(klass,attrs={})
|
16
|
-
|
16
|
+
|
17
17
|
unless klass.respond_to? :pid_suffix
|
18
18
|
pid_suffix = attrs.has_key?(:pid_suffix) ? attrs[:pid_suffix] : CMODEL_PID_SUFFIX
|
19
19
|
else
|
@@ -24,7 +24,12 @@ module ActiveFedora
|
|
24
24
|
else
|
25
25
|
namespace = klass.pid_namespace
|
26
26
|
end
|
27
|
-
return "info:fedora/#{namespace}:#{sanitized_class_name}#{pid_suffix}"
|
27
|
+
return "info:fedora/#{namespace}:#{sanitized_class_name(klass)}#{pid_suffix}"
|
28
|
+
end
|
29
|
+
|
30
|
+
###Override this, if you prefer your class names serialized some other way
|
31
|
+
def self.sanitized_class_name(klass)
|
32
|
+
klass.name.gsub(/(::)/, '_')
|
28
33
|
end
|
29
34
|
|
30
35
|
def self.models_asserted_by(obj)
|
@@ -41,11 +46,17 @@ module ActiveFedora
|
|
41
46
|
end
|
42
47
|
|
43
48
|
if models_array.empty?
|
44
|
-
models_array = [
|
49
|
+
models_array = [default_model(obj)]
|
45
50
|
end
|
46
51
|
|
47
52
|
return models_array
|
48
53
|
end
|
54
|
+
|
55
|
+
### Returns a ruby class to use if no other class could be find to instantiate
|
56
|
+
### Override this method if you need something other than the default strategy
|
57
|
+
def self.default_model(obj)
|
58
|
+
ActiveFedora::Base
|
59
|
+
end
|
49
60
|
|
50
61
|
# Returns a ruby class corresponding to the given uri if one can be found.
|
51
62
|
# Returns false if no corresponding class can be found.
|
@@ -9,25 +9,6 @@ module ActiveFedora
|
|
9
9
|
obj
|
10
10
|
end
|
11
11
|
|
12
|
-
# def datastreams
|
13
|
-
# @datastreams ||= begin
|
14
|
-
# h = Hash.new { |h,k| h[k] = datastream_object_for(k) }
|
15
|
-
|
16
|
-
# begin
|
17
|
-
# datastreams_xml = repository.datastreams(:pid => pid)
|
18
|
-
# datastreams_xml.gsub! '<objectDatastreams', '<objectDatastreams xmlns="http://www.fedora.info/definitions/1/0/access/"' unless datastreams_xml =~ /xmlns=/
|
19
|
-
# doc = Nokogiri::XML(datastreams_xml)
|
20
|
-
# doc.xpath('//access:datastream', {'access' => "http://www.fedora.info/definitions/1/0/access/"}).each do |ds|
|
21
|
-
# h[ds['dsid']] = datastream_object_for ds['dsid']
|
22
|
-
# end
|
23
|
-
# rescue RestClient::ResourceNotFound
|
24
|
-
# end
|
25
|
-
|
26
|
-
# h
|
27
|
-
# end
|
28
|
-
# end
|
29
|
-
|
30
|
-
|
31
12
|
def datastream_object_for dsid
|
32
13
|
klass = original_class.datastream_class_for_name(dsid)
|
33
14
|
klass.new self, dsid
|
@@ -33,7 +33,7 @@ module ActiveFedora
|
|
33
33
|
literal = statement.object.kind_of?(RDF::Literal)
|
34
34
|
predicate = self.short_predicate(statement.predicate)
|
35
35
|
object = literal ? statement.object.value : statement.object.to_str
|
36
|
-
tmpl.model.add_relationship(predicate, object)
|
36
|
+
tmpl.model.add_relationship(predicate, object, literal)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
tmpl.model.relationships_are_dirty = false
|
@@ -19,40 +19,29 @@ module ActiveFedora
|
|
19
19
|
# Add a relationship to the Object.
|
20
20
|
# @param predicate
|
21
21
|
# @param object Either a string URI or an object that is a kind of ActiveFedora::Base
|
22
|
-
def add_relationship(predicate,
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
def add_relationship(predicate, target, literal=false)
|
23
|
+
stmt = build_statement(internal_uri, predicate, target, literal)
|
24
|
+
unless relationships.has_statement? stmt
|
25
|
+
relationships.insert stmt
|
26
26
|
@relationships_are_dirty = true
|
27
27
|
rels_ext.dirty = true
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
# Add a RDF triple to the relationship graph
|
32
|
-
# @param pid a string represending the pid of the subject
|
33
|
-
# @param predicate a predicate symbol
|
34
|
-
# @param target an object to store
|
35
|
-
def register_triple(pid, predicate, target)
|
36
|
-
self.relationships_are_dirty = true
|
37
|
-
relationships.insert build_statement(pid, predicate, target)
|
38
|
-
|
39
|
-
# register_subject(subject)
|
40
|
-
# register_predicate(subject, predicate)
|
41
|
-
# relationships[subject][predicate] << object
|
42
|
-
end
|
43
|
-
|
44
31
|
# Create an RDF statement
|
45
32
|
# @param uri a string represending the subject
|
46
33
|
# @param predicate a predicate symbol
|
47
34
|
# @param target an object to store
|
48
|
-
def build_statement(uri, predicate, target)
|
35
|
+
def build_statement(uri, predicate, target, literal=nil)
|
49
36
|
raise "Not allowed anymore" if uri == :self
|
50
37
|
target = target.internal_uri if target.respond_to? :internal_uri
|
51
38
|
subject = RDF::URI.new(uri) #TODO cache
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
39
|
+
if literal.nil?
|
40
|
+
begin
|
41
|
+
literal = URI.parse(target).scheme.nil?
|
42
|
+
rescue URI::InvalidURIError
|
43
|
+
literal = false
|
44
|
+
end
|
56
45
|
end
|
57
46
|
raise ArgumentError, "Invalid target \"#{target}\". Must have namespace." unless literal || /^info/.match(target)
|
58
47
|
object = literal ? RDF::Literal.new(target) : RDF::URI.new(target)
|
@@ -88,18 +77,6 @@ module ActiveFedora
|
|
88
77
|
self.class.vocabularies[xmlns][rel_predicate]
|
89
78
|
end
|
90
79
|
|
91
|
-
# def register_subject(subject)
|
92
|
-
# if !relationships.has_key?(subject)
|
93
|
-
# relationships[subject] = {}
|
94
|
-
# end
|
95
|
-
# end
|
96
|
-
|
97
|
-
# def register_predicate(subject, predicate)
|
98
|
-
# register_subject(subject)
|
99
|
-
# if !relationships[subject].has_key?(predicate)
|
100
|
-
# relationships[subject][predicate] = []
|
101
|
-
# end
|
102
|
-
# end
|
103
80
|
|
104
81
|
# ** EXPERIMENTAL **
|
105
82
|
#
|
@@ -112,15 +89,6 @@ module ActiveFedora
|
|
112
89
|
rels_ext.dirty = true
|
113
90
|
end
|
114
91
|
|
115
|
-
|
116
|
-
|
117
|
-
# ** EXPERIMENTAL **
|
118
|
-
#
|
119
|
-
# Returns true if a relationship exists for the given subject, predicate, and object triple
|
120
|
-
def relationship_exists?(subject, predicate, object)
|
121
|
-
relationships.has_statement? build_statement(subject, predicate, object)
|
122
|
-
end
|
123
|
-
|
124
92
|
def inbound_relationships(response_format=:uri)
|
125
93
|
rel_values = {}
|
126
94
|
inbound_relationship_predicates.each_pair do |name,predicate|
|
@@ -147,14 +115,22 @@ module ActiveFedora
|
|
147
115
|
relationships.statements
|
148
116
|
end
|
149
117
|
|
150
|
-
|
118
|
+
# If no arguments are supplied, return the whole RDF::Graph.
|
119
|
+
# if a predicate is supplied as a parameter, then it returns the result of quering the graph with that predicate
|
120
|
+
def relationships(*args)
|
151
121
|
unless @subject
|
152
122
|
raise "Must have internal_uri" unless internal_uri
|
153
123
|
@subject = RDF::URI.new(internal_uri)
|
154
124
|
end
|
155
125
|
@relationships ||= RDF::Graph.new
|
156
126
|
load_relationships if !relationships_loaded
|
157
|
-
|
127
|
+
|
128
|
+
return @relationships if args.empty?
|
129
|
+
rels = @relationships.query(:predicate => find_graph_predicate(args.first))
|
130
|
+
results = []
|
131
|
+
rels.each_object {|o| results << o.to_s }
|
132
|
+
results
|
133
|
+
|
158
134
|
end
|
159
135
|
|
160
136
|
def load_relationships
|
@@ -201,8 +177,8 @@ module ActiveFedora
|
|
201
177
|
def ids_for_outbound(predicate)
|
202
178
|
id_array = []
|
203
179
|
res = relationships.query(:predicate => find_graph_predicate(predicate))
|
204
|
-
|
205
|
-
id_array << o.
|
180
|
+
relationships(predicate).each do |o|
|
181
|
+
id_array << o.gsub("info:fedora/", "")
|
206
182
|
end
|
207
183
|
id_array
|
208
184
|
end
|
data/spec/support/mock_fedora.rb
CHANGED
@@ -6,20 +6,23 @@ def mock_client
|
|
6
6
|
@mock_client
|
7
7
|
end
|
8
8
|
|
9
|
-
def stub_get(pid, record_exists=false)
|
9
|
+
def stub_get(pid, datastreams=nil, record_exists=false)
|
10
10
|
pid.gsub!(/:/, '%3A')
|
11
11
|
mock_client.stubs(:[]).with("objects/#{pid}?format=xml").returns(stub('get getter', :get=>'foobar')) if record_exists
|
12
12
|
# @mock_client.expects(:[]).with("objects/#{pid}?format=xml").raises(RestClient::ResourceNotFound) unless record_exists
|
13
13
|
mock_client.stubs(:[]).with("objects/#{pid}/datastreams?format=xml").returns(@getter)
|
14
|
-
['someData', 'withText', 'withText2', 'RELS-EXT']
|
14
|
+
datastreams ||= ['someData', 'withText', 'withText2', 'RELS-EXT']
|
15
|
+
datastreams.each do |dsid|
|
15
16
|
mock_client.stubs(:[]).with("objects/#{pid}/datastreams/#{dsid}?format=xml").returns(@getter)
|
16
17
|
end
|
17
18
|
end
|
18
19
|
def stub_ingest(pid)
|
19
|
-
|
20
|
+
n = pid.gsub(/:/, '%3A')
|
21
|
+
mock_client.stubs(:[]).with("objects/#{n || 'new'}").returns(stub("ingester", :post=>pid))
|
20
22
|
end
|
21
23
|
|
22
24
|
def stub_add_ds(pid, dsids)
|
25
|
+
pid.gsub!(/:/, '%3A')
|
23
26
|
dsids.each do |dsid|
|
24
27
|
client = mock_client.stubs(:[]).with do |params|
|
25
28
|
/objects\/#{pid}\/datastreams\/#{dsid}/.match(params)
|
data/spec/unit/base_spec.rb
CHANGED
@@ -106,30 +106,132 @@ describe ActiveFedora::Base do
|
|
106
106
|
end
|
107
107
|
|
108
108
|
describe "has_metadata" do
|
109
|
-
|
110
|
-
|
111
|
-
|
109
|
+
describe "creates datastreams" do
|
110
|
+
before :each do
|
111
|
+
@mock_client.stubs(:[]).with("objects/monkey%3A99/datastreams?format=xml").returns(@getter)
|
112
|
+
@mock_client.stubs(:[]).with("objects/monkey%3A99/datastreams/RELS-EXT/content").returns(@getter)
|
113
|
+
|
114
|
+
#Update record
|
115
|
+
@mock_client.stubs(:[]).with("objects/monkey%3A99").returns(stub('post', :post=>'monkey:99'))
|
116
|
+
#Update datastream
|
117
|
+
['someData', 'withText', 'withText2', 'RELS-EXT'].each do |dsid|
|
118
|
+
@mock_client.stubs(:[]).with {|params| /objects\/monkey%3A99\/datastreams\/#{dsid}/.match(params)}.returns(stub('post', :post=>'monkey:99', :get=>''))
|
119
|
+
end
|
120
|
+
|
121
|
+
@n = FooHistory.new(:pid=>"monkey:99")
|
122
|
+
@n.datastreams['RELS-EXT'].expects(:changed?).returns(true).at_least_once
|
123
|
+
@n.expects(:update_index)
|
124
|
+
@n.save
|
125
|
+
end
|
112
126
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
@
|
127
|
+
it "should create specified datastreams with specified fields" do
|
128
|
+
@n.datastreams["someData"].should_not be_nil
|
129
|
+
@n.datastreams["someData"].fubar_values='bar'
|
130
|
+
@n.datastreams["someData"].fubar_values.should == ['bar']
|
131
|
+
@n.datastreams["withText2"].dsLabel.should == "withLabel"
|
118
132
|
end
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
it "should create specified datastreams with appropriate control group" do
|
137
|
+
stub_ingest('monkey:99')
|
138
|
+
stub_add_ds('monkey:99', ['RELS-EXT', 'DC', 'rightsMetadata', 'properties', 'descMetadata', 'UKETD_DC'])
|
139
|
+
stub_get('monkey:99', ['RELS-EXT', 'DC', 'rightsMetadata', 'properties', 'descMetadata', 'UKETD_DC'])
|
140
|
+
class UketdObject < ActiveFedora::Base
|
141
|
+
has_metadata :name => "rightsMetadata", :label=>"Rights metadata", :type => ActiveFedora::NokogiriDatastream
|
142
|
+
|
143
|
+
# Uses the Hydra MODS Article profile for tracking most of the descriptive metadata
|
144
|
+
# TODO: define terminology for ETD
|
145
|
+
has_metadata :name => "descMetadata", :label=>"MODS metadata", :control_group=>"M", :type => ActiveFedora::NokogiriDatastream
|
146
|
+
|
147
|
+
has_metadata :name => "UKETD_DC", :label=>"UKETD_DC metadata", :control_group => "E", :disseminator=>"hull-sDef:uketdObject/getUKETDMetadata", :type => ActiveFedora::NokogiriDatastream
|
119
148
|
|
120
|
-
|
121
|
-
|
122
|
-
|
149
|
+
has_metadata :name => "DC", :type => ActiveFedora::NokogiriDatastream, :label=>"DC admin metadata"
|
150
|
+
|
151
|
+
# A place to put extra metadata values
|
152
|
+
has_metadata :name => "properties", :label=>"Workflow properties", :type => ActiveFedora::MetadataDatastream do |m|
|
153
|
+
m.field 'collection', :string
|
154
|
+
m.field 'depositor', :string
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
@n = UketdObject.new(:pid=>"monkey:99")
|
123
159
|
@n.save
|
160
|
+
@n.datastreams["DC"].controlGroup.should eql("X")
|
161
|
+
@n.datastreams["rightsMetadata"].controlGroup.should eql("X")
|
162
|
+
@n.datastreams["properties"].controlGroup.should eql("X")
|
163
|
+
@n.datastreams["descMetadata"].controlGroup.should eql("M")
|
164
|
+
@n.datastreams["UKETD_DC"].controlGroup.should eql("E")
|
124
165
|
end
|
125
166
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
167
|
+
context ":control_group => 'E'" do
|
168
|
+
before do
|
169
|
+
stub_ingest(@this_pid)
|
170
|
+
stub_add_ds(@this_pid, ['RELS-EXT', 'externalDisseminator', 'externalUrl'])
|
171
|
+
end
|
172
|
+
it "should raise an error without :disseminator or :url option" do
|
173
|
+
class MoreFooHistory < ActiveFedora::Base
|
174
|
+
has_metadata :type=>ActiveFedora::NokogiriDatastream, :name=>"externalDisseminator", :control_group => "E"
|
175
|
+
end
|
176
|
+
lambda { @n = MoreFooHistory.new }.should raise_exception
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should allow :control_group => 'E' with a :url option" do
|
180
|
+
class MoreFooHistory < ActiveFedora::Base
|
181
|
+
has_metadata :type=>ActiveFedora::MetadataDatastream, :name=>"externalDisseminator",:control_group => "E", :url => "http://exampl.com/mypic.jpg"
|
182
|
+
end
|
183
|
+
@n = MoreFooHistory.new
|
184
|
+
@n.save
|
185
|
+
end
|
186
|
+
it "should raise an error if :url is malformed" do
|
187
|
+
class MoreFooHistory < ActiveFedora::Base
|
188
|
+
has_metadata :type => ActiveFedora::NokogiriDatastream, :name=>"externalUrl", :url=>"my_rul", :control_group => "E"
|
189
|
+
end
|
190
|
+
client = mock_client.stubs(:[]).with do |params|
|
191
|
+
/objects\/#{@this_pid}\/datastreams\/externalUrl/.match(params)
|
192
|
+
end
|
193
|
+
client.raises(RuntimeError, "Error adding datastream externalUrl for object changeme:4020. See logger for details")
|
194
|
+
@n = MoreFooHistory.new
|
195
|
+
lambda {@n.save }.should raise_exception
|
196
|
+
end
|
131
197
|
end
|
132
198
|
|
199
|
+
context ":control_group => 'R'" do
|
200
|
+
before do
|
201
|
+
stub_ingest(@this_pid)
|
202
|
+
stub_add_ds(@this_pid, ['RELS-EXT', 'externalDisseminator' ])
|
203
|
+
end
|
204
|
+
it "should raise an error without :url option" do
|
205
|
+
class MoreFooHistory < ActiveFedora::Base
|
206
|
+
has_metadata :type=>ActiveFedora::NokogiriDatastream, :name=>"externalDisseminator", :control_group => "R"
|
207
|
+
end
|
208
|
+
lambda { @n = MoreFooHistory.new }.should raise_exception
|
209
|
+
end
|
210
|
+
|
211
|
+
it "should work with a valid :url option" do
|
212
|
+
class MoreFooHistory < ActiveFedora::Base
|
213
|
+
has_metadata :type=>ActiveFedora::MetadataDatastream, :name=>"externalDisseminator",:control_group => "R", :url => "http://exampl.com/mypic.jpg"
|
214
|
+
end
|
215
|
+
@n = MoreFooHistory.new
|
216
|
+
@n.save
|
217
|
+
end
|
218
|
+
it "should not take a :disseminator option without a :url option" do
|
219
|
+
class MoreFooHistory < ActiveFedora::Base
|
220
|
+
has_metadata :type=>ActiveFedora::NokogiriDatastream, :name=>"externalDisseminator", :control_group => "R", :disseminator => "foo:s-def/hull-cModel:Foo"
|
221
|
+
end
|
222
|
+
lambda { @n = MoreFooHistory.new }.should raise_exception
|
223
|
+
end
|
224
|
+
it "should raise an error if :url is malformed" do
|
225
|
+
class MoreFooHistory < ActiveFedora::Base
|
226
|
+
has_metadata :type => ActiveFedora::NokogiriDatastream, :name=>"externalUrl", :url=>"my_rul", :control_group => "R"
|
227
|
+
end
|
228
|
+
client = mock_client.stubs(:[]).with do |params|
|
229
|
+
/objects\/#{@this_pid}\/datastreams\/externalUrl/.match(params)
|
230
|
+
end
|
231
|
+
client.raises(RuntimeError, "Error adding datastream externalUrl for object changeme:4020. See logger for details")
|
232
|
+
lambda {MoreFooHistory.new }.should raise_exception
|
233
|
+
end
|
234
|
+
end
|
133
235
|
end
|
134
236
|
|
135
237
|
|
@@ -195,11 +297,9 @@ describe ActiveFedora::Base do
|
|
195
297
|
|
196
298
|
describe '#add_relationship' do
|
197
299
|
it 'should call #add_relationship on the rels_ext datastream' do
|
198
|
-
|
199
|
-
|
200
|
-
@test_object.
|
201
|
-
@test_object.expects(:rels_ext).returns(mock_rels_ext).at_least_once
|
202
|
-
@test_object.add_relationship("predicate", "object")
|
300
|
+
@test_object.add_relationship("predicate", "info:fedora/object")
|
301
|
+
pred = @test_object.class.vocabularies["info:fedora/fedora-system:def/relations-external#"]["predicate"]
|
302
|
+
@test_object.relationships.should have_statement(RDF::Statement.new(RDF::URI.new(@test_object.internal_uri), pred, RDF::URI.new("info:fedora/object")))
|
203
303
|
end
|
204
304
|
|
205
305
|
it "should update the RELS-EXT datastream and set the datastream as dirty when relationships are added" do
|
@@ -279,7 +379,7 @@ describe ActiveFedora::Base do
|
|
279
379
|
stub_add_ds(@this_pid, ['RELS-EXT'])
|
280
380
|
@test_object.persisted?.should be false
|
281
381
|
@test_object.expects(:update_index)
|
282
|
-
stub_get(@this_pid, true)
|
382
|
+
stub_get(@this_pid, nil, true)
|
283
383
|
@test_object.save.should == true
|
284
384
|
@test_object.persisted?.should be true
|
285
385
|
end
|
@@ -418,12 +518,6 @@ describe ActiveFedora::Base do
|
|
418
518
|
end
|
419
519
|
|
420
520
|
describe ".to_solr" do
|
421
|
-
|
422
|
-
# before(:all) do
|
423
|
-
# # Revert to default mappings after running tests
|
424
|
-
# ActiveFedora::SolrService.load_mappings
|
425
|
-
# end
|
426
|
-
|
427
521
|
after(:all) do
|
428
522
|
# Revert to default mappings after running tests
|
429
523
|
ActiveFedora::SolrService.load_mappings
|
@@ -443,8 +537,7 @@ describe ActiveFedora::Base do
|
|
443
537
|
end
|
444
538
|
|
445
539
|
it "should omit base metadata and RELS-EXT if :model_only==true" do
|
446
|
-
@test_object.add_relationship(:has_part, "foo")
|
447
|
-
# @test_object.expects(:modified_date).returns("mDate")
|
540
|
+
@test_object.add_relationship(:has_part, "foo", true)
|
448
541
|
solr_doc = @test_object.to_solr(Hash.new, :model_only => true)
|
449
542
|
solr_doc["system_create_dt"].should be_nil
|
450
543
|
solr_doc["system_modified_dt"].should be_nil
|
@@ -14,7 +14,7 @@ describe ActiveFedora::QualifiedDublinCoreDatastream do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
before(:each) do
|
17
|
-
stub_get("_nextid_")
|
17
|
+
stub_get("_nextid_", ['RELS-EXT', 'sensitive_passages', 'significant_passages', 'dublin_core', 'properties'])
|
18
18
|
Rubydora::Repository.any_instance.stubs(:client).returns(@mock_client)
|
19
19
|
ActiveFedora::RubydoraConnection.instance.stubs(:nextid).returns("_nextid_")
|
20
20
|
@test_ds = ActiveFedora::QualifiedDublinCoreDatastream.new(nil, nil)
|
@@ -23,7 +23,7 @@ describe ActiveFedora::QualifiedDublinCoreDatastream do
|
|
23
23
|
end
|
24
24
|
it "from_xml should parse everything correctly" do
|
25
25
|
#originally just tested that lcsh encoding and stuff worked, but the other stuff is worth testing
|
26
|
-
stub_get("meh:leh")
|
26
|
+
stub_get("meh:leh", ['RELS-EXT', 'sensitive_passages', 'significant_passages', 'dublin_core', 'properties'])
|
27
27
|
stub_get_content("meh:leh", ['dublin_core'])
|
28
28
|
ActiveFedora::RubydoraConnection.instance.expects(:nextid).returns("meh:leh")
|
29
29
|
tmpl = OralHistorySampleModel.new.datastreams['dublin_core']
|
@@ -91,32 +91,22 @@ describe ActiveFedora::RelsExtDatastream do
|
|
91
91
|
@test_obj.ids_for_outbound("foo").should == ["foo:bar"]
|
92
92
|
end
|
93
93
|
it "should handle un-mapped literals" do
|
94
|
-
pending
|
95
94
|
xml = "
|
96
|
-
|
97
|
-
<foxml:datastreamVersion ID=\"RELS-EXT.0\" LABEL=\"\" CREATED=\"2011-09-20T19:48:43.714Z\" MIMETYPE=\"text/xml\" SIZE=\"622\">
|
98
|
-
<foxml:xmlContent>
|
99
|
-
<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">
|
95
|
+
<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:oai=\"http://www.openarchives.org/OAI/2.0/\">
|
100
96
|
<rdf:Description rdf:about=\"info:fedora/changeme:3489\">
|
101
97
|
<hasModel xmlns=\"info:fedora/fedora-system:def/model#\" rdf:resource=\"info:fedora/afmodel:ActiveFedora_Base\"/>
|
102
98
|
<isPartOf xmlns=\"info:fedora/fedora-system:def/relations-external#\" rdf:resource=\"info:fedora/demo:11\"/>
|
103
99
|
<isMemberOf xmlns=\"info:fedora/fedora-system:def/relations-external#\" rdf:resource=\"info:fedora/demo:10\"/>
|
104
|
-
<
|
100
|
+
<oai:itemID>oai:hull.ac.uk:hull:2708</oai:itemID>
|
105
101
|
</rdf:Description>
|
106
|
-
</rdf:RDF>
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
new_ext
|
113
|
-
new_ext.should match "<hasMetadata xmlns=\"info:fedora/fedora-system:def/relations-external#\">oai:hull.ac.uk:hull:2708</hasMetadata>"
|
102
|
+
</rdf:RDF>"
|
103
|
+
model = ActiveFedora::Base.new
|
104
|
+
new_ds = ActiveFedora::RelsExtDatastream.new(nil, nil)
|
105
|
+
new_ds.model = model
|
106
|
+
ActiveFedora::RelsExtDatastream.from_xml(xml, new_ds)
|
107
|
+
new_ext = new_ds.to_rels_ext()
|
108
|
+
new_ext.should match "<ns0:itemID>oai:hull.ac.uk:hull:2708</ns0:itemID>"
|
114
109
|
|
115
110
|
end
|
116
111
|
end
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
it "should treat :self and self.pid as equivalent subjects"
|
121
|
-
|
122
112
|
end
|
@@ -316,8 +316,6 @@ describe ActiveFedora::SemanticNode do
|
|
316
316
|
local_node.expects(:relationship_query).with("parts")
|
317
317
|
local_node.parts_query
|
318
318
|
end
|
319
|
-
|
320
|
-
it "resulting finder should provide option of filtering results by :type"
|
321
319
|
end
|
322
320
|
|
323
321
|
describe '#create_outbound_relationship_finders' do
|
@@ -383,7 +381,6 @@ describe ActiveFedora::SemanticNode do
|
|
383
381
|
result.should include("demo:10")
|
384
382
|
end
|
385
383
|
|
386
|
-
it "should provide option of filtering results by :type"
|
387
384
|
end
|
388
385
|
|
389
386
|
describe " resulting _ids finder" do
|
@@ -489,10 +486,15 @@ describe ActiveFedora::SemanticNode do
|
|
489
486
|
end
|
490
487
|
|
491
488
|
describe ".add_relationship" do
|
492
|
-
it "should add relationship to the relationships
|
489
|
+
it "should add relationship to the relationships graph" do
|
493
490
|
@node.add_relationship(@test_relationship.predicate, @test_relationship.object)
|
494
491
|
@node.ids_for_outbound("isMemberOf").should == ['demo:9']
|
495
492
|
end
|
493
|
+
|
494
|
+
it "should add a literal relationship to the relationships graph" do
|
495
|
+
@node.add_relationship(@test_relationship.predicate, @test_relationship.object, true)
|
496
|
+
@node.ids_for_outbound("isMemberOf").should == ['demo:9']
|
497
|
+
end
|
496
498
|
|
497
499
|
it "adding relationship to an instance should not affect class-level relationships hash" do
|
498
500
|
local_test_node1 = SpecNode.new
|
@@ -516,20 +518,6 @@ describe ActiveFedora::SemanticNode do
|
|
516
518
|
end
|
517
519
|
|
518
520
|
|
519
|
-
it "should provide a relationship setter"
|
520
|
-
it "should provide a relationship getter"
|
521
|
-
it "should provide a relationship deleter"
|
522
|
-
|
523
|
-
describe '.register_triple' do
|
524
|
-
it 'should add triples to the relationships hash' do
|
525
|
-
@node.register_triple(@node.internal_uri, :is_part_of, "info:fedora/demo:10")
|
526
|
-
@node.register_triple(@node.internal_uri, :is_member_of, "info:fedora/demo:11")
|
527
|
-
@node.ids_for_outbound(:is_part_of).should == ['demo:10']
|
528
|
-
@node.ids_for_outbound(:is_member_of).should == ['demo:11']
|
529
|
-
end
|
530
|
-
|
531
|
-
it "should not be a class level method"
|
532
|
-
end
|
533
521
|
|
534
522
|
it 'should provide #predicate_lookup that maps symbols to common RELS-EXT predicates' do
|
535
523
|
SpecNode.should respond_to(:predicate_lookup)
|
@@ -570,18 +558,6 @@ describe ActiveFedora::SemanticNode do
|
|
570
558
|
|
571
559
|
end
|
572
560
|
end
|
573
|
-
|
574
|
-
describe '#relationship_exists?' do
|
575
|
-
it 'should return true if a relationship does exist' do
|
576
|
-
@test_object3 = SpecNode2.new
|
577
|
-
@test_object3.pid = increment_pid
|
578
|
-
r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_member,:object=>@test_object3})
|
579
|
-
@test_object.relationship_exists?(@test_object.internal_uri,r.predicate,r.object).should == false
|
580
|
-
@test_object.expects(:rels_ext).returns(stub("rels_ext", :dirty= => true))
|
581
|
-
@test_object.add_relationship(r.predicate, r.object)
|
582
|
-
@test_object.relationship_exists?(@test_object.internal_uri,r.predicate,r.object).should == true
|
583
|
-
end
|
584
|
-
end
|
585
561
|
|
586
562
|
describe '#assert_kind_of' do
|
587
563
|
it 'should raise an exception if object supplied is not the correct type' do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active-fedora
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 1
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 3.1.
|
9
|
+
- 1
|
10
|
+
version: 3.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Matt Zumwalt
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-11-
|
19
|
+
date: 2011-11-08 00:00:00 -06:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|