active-fedora 4.0.0.rc9 → 4.0.0.rc10
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/History.txt +5 -1
- data/lib/active_fedora/base.rb +1 -1
- data/lib/active_fedora/datastreams.rb +4 -2
- data/lib/active_fedora/model.rb +7 -0
- data/lib/active_fedora/rdf_datastream.rb +79 -31
- data/lib/active_fedora/solr_digital_object.rb +20 -5
- data/lib/active_fedora/solr_service.rb +0 -1
- data/lib/active_fedora/version.rb +1 -1
- data/spec/integration/base_spec.rb +9 -2
- data/spec/integration/bug_spec.rb +0 -6
- data/spec/integration/model_spec.rb +1 -1
- data/spec/integration/solr_service_spec.rb +5 -0
- data/spec/samples/models/hydrangea_article.rb +2 -2
- data/spec/samples/samples.rb +1 -1
- data/spec/unit/base_file_management_spec.rb +0 -1
- data/spec/unit/base_spec.rb +4 -1
- data/spec/unit/datastreams_spec.rb +38 -5
- data/spec/unit/metadata_datastream_spec.rb +0 -16
- data/spec/unit/ntriples_datastream_spec.rb +63 -32
- data/spec/unit/property_spec.rb +0 -15
- data/spec/unit/service_definitions_spec.rb +8 -1
- metadata +4 -4
data/Gemfile.lock
CHANGED
data/History.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
4.0.0.
|
1
|
+
4.0.0.rc10
|
2
2
|
Removed deprecations
|
3
3
|
* allowing :fedora level in fedora.yml
|
4
4
|
* automatic includes of Relationships and FileMethods is removed
|
@@ -14,6 +14,10 @@ Find raises ObjectNotFoundError when the object isn't found
|
|
14
14
|
Removed dependency on solrizer-fedora
|
15
15
|
Avoid unnecessary reload of RELS-EXT when typecasting
|
16
16
|
HYDRA-754 Delegate discovery of config parameters to a separate module to allow for non-file-based configuration
|
17
|
+
HYDRA-753 has_metadata should accept :versionable as part of the spec.
|
18
|
+
HYDRA-755 Instantiate un-spec'ed datastreams in SolrDigitalObject
|
19
|
+
HYDRA-758 Added ActiveFedora::Base.exists?
|
20
|
+
Fixes for Ruby 1.9 compatibility
|
17
21
|
|
18
22
|
3.3.2
|
19
23
|
HYDRA-745 No need to require :url be present on external datastreams
|
data/lib/active_fedora/base.rb
CHANGED
@@ -370,7 +370,7 @@ module ActiveFedora
|
|
370
370
|
raise "Solr document record id and pid do not match" unless pid == solr_doc[SOLR_DOCUMENT_ID]
|
371
371
|
end
|
372
372
|
|
373
|
-
obj = self.allocate.init_with(SolrDigitalObject.new(solr_doc))
|
373
|
+
obj = self.allocate.init_with(SolrDigitalObject.new(solr_doc, self))
|
374
374
|
#set by default to load any dependent relationship objects from solr as well
|
375
375
|
#need to call rels_ext once so it exists when iterating over datastreams
|
376
376
|
obj.rels_ext
|
@@ -78,7 +78,7 @@ module ActiveFedora
|
|
78
78
|
ds = ds_spec[:type].new(inner_object, name)
|
79
79
|
ds.dsLabel = ds_spec[:label] if ds_spec[:label].present?
|
80
80
|
ds.controlGroup = ds_spec[:control_group]
|
81
|
-
ds.versionable = ds_spec[:versionable]
|
81
|
+
ds.versionable = ds_spec[:versionable] unless ds_spec[:versionable].nil?
|
82
82
|
additional_attributes_for_external_and_redirect_control_groups(ds, ds_spec)
|
83
83
|
ds
|
84
84
|
end
|
@@ -252,7 +252,9 @@ module ActiveFedora
|
|
252
252
|
# @option args [Boolean] :versionable (true) Should versioned datastreams be stored
|
253
253
|
# @yield block executed by some kinds of datastreams
|
254
254
|
def has_metadata(args, &block)
|
255
|
-
|
255
|
+
spec = {:type => args[:type], :label => args.fetch(:label,""), :control_group => args.fetch(:control_group,"X"), :disseminator => args.fetch(:disseminator,""), :url => args.fetch(:url,""),:block => block}
|
256
|
+
spec[:versionable] = args[:versionable] if args.has_key? :versionable
|
257
|
+
ds_specs[args[:name]]= spec
|
256
258
|
end
|
257
259
|
|
258
260
|
# Specify the attributes of a file bearing datastream
|
data/lib/active_fedora/model.rb
CHANGED
@@ -114,6 +114,13 @@ module ActiveFedora
|
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
|
+
# Returns true if the pid exists in the repository
|
118
|
+
# @param[String] pid
|
119
|
+
# @return[boolean]
|
120
|
+
def exists?(pid)
|
121
|
+
inner = DigitalObject.find(self, pid)
|
122
|
+
!inner.new?
|
123
|
+
end
|
117
124
|
|
118
125
|
def find_model(pid)
|
119
126
|
ActiveSupport::Deprecation.warn("find_model is deprecated. Use find instead")
|
@@ -2,6 +2,24 @@ require 'rdf'
|
|
2
2
|
|
3
3
|
module ActiveFedora
|
4
4
|
class RDFDatastream < Datastream
|
5
|
+
# this enables a cleaner API for solr integration
|
6
|
+
class IndexObject
|
7
|
+
attr_accessor :data_type, :behaviors
|
8
|
+
def initialize
|
9
|
+
@behaviors = [:searchable]
|
10
|
+
@data_type = :string
|
11
|
+
end
|
12
|
+
def as(*args)
|
13
|
+
@behaviors = args
|
14
|
+
end
|
15
|
+
def type(sym)
|
16
|
+
@data_type = sym
|
17
|
+
end
|
18
|
+
def defaults
|
19
|
+
:noop
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
5
23
|
module ModelMethods
|
6
24
|
extend ActiveSupport::Concern
|
7
25
|
module ClassMethods
|
@@ -24,57 +42,64 @@ module ActiveFedora
|
|
24
42
|
def map_predicates(&block)
|
25
43
|
yield self
|
26
44
|
end
|
27
|
-
def method_missing(name, *args)
|
45
|
+
def method_missing(name, *args, &block)
|
28
46
|
args = args.first if args.respond_to? :first
|
29
47
|
raise "mapping must specify RDF vocabulary as :in argument" unless args.has_key? :in
|
30
48
|
vocab = args[:in]
|
31
49
|
predicate = args.fetch(:to, name)
|
32
|
-
data_type = args.fetch(:type, :string)
|
33
50
|
raise "Vocabulary '#{vocab.inspect}' does not define property '#{predicate.inspect}'" unless vocab.respond_to? predicate
|
51
|
+
indexing = false
|
52
|
+
if block_given?
|
53
|
+
# needed for solrizer integration
|
54
|
+
indexing = true
|
55
|
+
iobj = IndexObject.new
|
56
|
+
yield iobj
|
57
|
+
data_type = iobj.data_type
|
58
|
+
behaviors = iobj.behaviors
|
59
|
+
end
|
60
|
+
# needed for AF::Predicates integration & drives all other
|
61
|
+
# functionality below
|
34
62
|
vocab = vocab.to_s
|
35
|
-
|
36
|
-
# stuff data_type in there too for to_solr support
|
37
|
-
if config
|
63
|
+
if config
|
38
64
|
if config[:predicate_mapping].has_key? vocab
|
39
65
|
config[:predicate_mapping][vocab][name] = predicate
|
40
|
-
config[:predicate_mapping][vocab]["#{name}type".to_sym] = data_type
|
41
66
|
else
|
42
|
-
config[:predicate_mapping][vocab] = { name => predicate
|
43
|
-
|
67
|
+
config[:predicate_mapping][vocab] = { name => predicate }
|
68
|
+
end
|
69
|
+
# stuff data_type and behaviors in there for to_solr support
|
70
|
+
config[:predicate_mapping][vocab]["#{name}type".to_sym] = data_type if indexing
|
71
|
+
config[:predicate_mapping][vocab]["#{name}behaviors".to_sym] = behaviors if indexing
|
44
72
|
else
|
45
73
|
config = {
|
46
74
|
:default_namespace => vocab,
|
47
75
|
:predicate_mapping => {
|
48
|
-
vocab => { name => predicate
|
76
|
+
vocab => { name => predicate }
|
49
77
|
}
|
50
78
|
}
|
79
|
+
# stuff data_type and behaviors in there for to_solr support
|
80
|
+
config[:predicate_mapping][vocab]["#{name}type".to_sym] = data_type if indexing
|
81
|
+
config[:predicate_mapping][vocab]["#{name}behaviors".to_sym] = behaviors if indexing
|
51
82
|
end
|
52
83
|
end
|
53
84
|
end
|
54
85
|
end
|
55
|
-
|
56
86
|
class TermProxy
|
57
87
|
# @param [Symbol, RDF::URI] predicate the predicate to insert into the graph
|
58
88
|
# @param [ActiveFedora::RelationshipGraph] graph the graph
|
59
89
|
# @param [Array] values an array of object values
|
60
|
-
|
90
|
+
instance_methods.each { |m| undef_method m unless m.to_s =~ /^(?:nil\?|send|object_id|to_a)$|^__|^respond_to|proxy_/ }
|
91
|
+
|
61
92
|
def initialize(graph, predicate, values=[])
|
62
93
|
@graph = graph
|
63
94
|
@predicate = predicate
|
64
95
|
@values = values
|
65
96
|
end
|
66
|
-
def each(&block)
|
67
|
-
@values.each { |value| block.call(value) }
|
68
|
-
end
|
69
97
|
def <<(*values)
|
70
98
|
@values.concat(values)
|
71
99
|
values.each { |value| @graph.add(@predicate, value, true) }
|
72
100
|
@graph.dirty = true
|
73
101
|
@values
|
74
102
|
end
|
75
|
-
def ==(other)
|
76
|
-
other == @values
|
77
|
-
end
|
78
103
|
def delete(*values)
|
79
104
|
values.each do |value|
|
80
105
|
unless @values.delete(value).nil?
|
@@ -84,9 +109,25 @@ module ActiveFedora
|
|
84
109
|
end
|
85
110
|
@values
|
86
111
|
end
|
87
|
-
def
|
88
|
-
@values.
|
112
|
+
def method_missing(method, *args)
|
113
|
+
unless @values.respond_to?(method)
|
114
|
+
message = "undefined method `#{method.to_s}' for \"#{@values}\":#{@values.class.to_s}"
|
115
|
+
raise NoMethodError, message
|
116
|
+
end
|
117
|
+
|
118
|
+
if block_given?
|
119
|
+
@values.send(method, *args) { |*block_args| yield(*block_args) }
|
120
|
+
else
|
121
|
+
@values.send(method, *args)
|
122
|
+
end
|
123
|
+
|
89
124
|
end
|
125
|
+
# def empty?
|
126
|
+
# @values.empty?
|
127
|
+
# end
|
128
|
+
# def to_s
|
129
|
+
# @values.to_s
|
130
|
+
# end
|
90
131
|
end
|
91
132
|
|
92
133
|
include ModelMethods
|
@@ -107,29 +148,34 @@ module ActiveFedora
|
|
107
148
|
end
|
108
149
|
end
|
109
150
|
|
110
|
-
# returns a Hash, e.g.: {field => {:values =>
|
151
|
+
# returns a Hash, e.g.: {field => {:values => [], :type => :something, :behaviors => []}, ...}
|
111
152
|
def fields
|
112
153
|
field_map = {}
|
113
154
|
graph.relationships.each do |predicate, values|
|
114
155
|
vocab_sym, name = predicate.qname
|
115
156
|
vocabs_list = self.class.vocabularies.select { |ns, v| v.__prefix__ == vocab_sym }
|
116
157
|
vocab = vocabs_list.first.first.to_s
|
117
|
-
|
158
|
+
vocab_hash = self.class.config[:predicate_mapping][vocab]
|
159
|
+
mapped_names = vocab_hash.select {|k, v| v.to_s == name.to_s}
|
118
160
|
name = mapped_names.first.first.to_s
|
119
|
-
|
120
|
-
|
161
|
+
next unless vocab_hash.has_key?("#{name}type".to_sym) and vocab_hash.has_key?("#{name}behaviors".to_sym)
|
162
|
+
type = vocab_hash["#{name}type".to_sym]
|
163
|
+
behaviors = vocab_hash["#{name}behaviors".to_sym]
|
164
|
+
field_map[name.to_sym] = {:values => values.map {|v| v.to_s}, :type => type, :behaviors => behaviors}
|
121
165
|
end
|
122
166
|
field_map
|
123
167
|
end
|
124
168
|
|
125
169
|
def to_solr(solr_doc = Hash.new) # :nodoc:
|
126
170
|
fields.each do |field_key, field_info|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
171
|
+
values = field_info.fetch(:values, false)
|
172
|
+
if values
|
173
|
+
field_info[:behaviors].each do |index_type|
|
174
|
+
field_symbol = ActiveFedora::SolrService.solr_name(field_key, field_info[:type], index_type)
|
175
|
+
values = [values] unless values.respond_to? :each
|
176
|
+
values.each do |val|
|
177
|
+
::Solrizer::Extractor.insert_solr_field_value(solr_doc, field_symbol, val)
|
178
|
+
end
|
133
179
|
end
|
134
180
|
end
|
135
181
|
end
|
@@ -140,7 +186,7 @@ module ActiveFedora
|
|
140
186
|
def find_predicate(predicate)
|
141
187
|
predicate = predicate.to_sym unless predicate.kind_of? RDF::URI
|
142
188
|
result = ActiveFedora::Predicates.find_predicate(predicate)
|
143
|
-
RDF::URI(result.reverse.
|
189
|
+
RDF::URI(result.reverse.join)
|
144
190
|
end
|
145
191
|
|
146
192
|
def graph
|
@@ -166,8 +212,10 @@ module ActiveFedora
|
|
166
212
|
ensure_loaded
|
167
213
|
predicate = find_predicate(predicate) unless predicate.kind_of? RDF::URI
|
168
214
|
graph.delete(predicate)
|
215
|
+
|
216
|
+
args = [args] unless args.respond_to? :each
|
169
217
|
args.each do |arg|
|
170
|
-
graph.add(predicate, arg, true)
|
218
|
+
graph.add(predicate, arg, true) unless arg.empty?
|
171
219
|
end
|
172
220
|
graph.dirty = true
|
173
221
|
return TermProxy.new(graph, predicate, args)
|
@@ -1,25 +1,37 @@
|
|
1
1
|
module ActiveFedora
|
2
2
|
class SolrDigitalObject
|
3
|
-
attr_reader :pid, :label, :state, :ownerId, :profile, :datastreams
|
3
|
+
attr_reader :pid, :label, :state, :ownerId, :profile, :datastreams, :solr_doc
|
4
4
|
|
5
|
-
def initialize(solr_doc)
|
5
|
+
def initialize(solr_doc, klass=ActiveFedora::Base)
|
6
|
+
@solr_doc = solr_doc
|
6
7
|
@pid = solr_doc[SOLR_DOCUMENT_ID]
|
7
8
|
profile_attrs = solr_doc.keys.select { |k| k =~ /^objProfile_/ }
|
8
9
|
@profile = {}
|
9
10
|
profile_attrs.each do |key|
|
10
11
|
attr_name = key.split(/_/)[1..-2].join('_')
|
11
|
-
@profile[attr_name] = solr_doc[key].to_s
|
12
|
+
@profile[attr_name] = Array(solr_doc[key]).first.to_s
|
12
13
|
end
|
13
14
|
@profile['objCreateDate'] ||= Time.now.xmlschema
|
14
15
|
@profile['objLastModDate'] ||= @profile['objCreateDate']
|
15
|
-
|
16
|
+
|
16
17
|
@datastreams = {}
|
18
|
+
|
19
|
+
dsids = @solr_doc.keys.collect { |k| k.scan(/^(.+)_dsProfile_/).flatten.first }.compact.uniq
|
20
|
+
missing = dsids-klass.ds_specs.keys
|
21
|
+
missing.each do |dsid|
|
22
|
+
mime_key = ActiveFedora::SolrService.solr_name("#{dsid}_dsProfile_dsMIME",:symbol)
|
23
|
+
mime_type = Array(@solr_doc[mime_key]).first
|
24
|
+
ds_class = mime_type =~ /[\/\+]xml$/ ? NokogiriDatastream : Datastream
|
25
|
+
@datastreams[dsid] = ds_class.new(self, dsid)
|
26
|
+
end
|
27
|
+
|
17
28
|
@label = @profile['objLabel']
|
18
29
|
@state = @profile['objState']
|
19
30
|
@ownerId = @profile['objOwnerId']
|
20
31
|
end
|
21
|
-
|
32
|
+
|
22
33
|
def freeze
|
34
|
+
@finished = true
|
23
35
|
@profile.freeze
|
24
36
|
@datastreams.freeze
|
25
37
|
self
|
@@ -29,5 +41,8 @@ module ActiveFedora
|
|
29
41
|
false
|
30
42
|
end
|
31
43
|
|
44
|
+
def repository
|
45
|
+
@finished ? ActiveFedora::Base.connection_for_pid(self.pid) : nil
|
46
|
+
end
|
32
47
|
end
|
33
48
|
end
|
@@ -217,10 +217,8 @@ describe ActiveFedora::Base do
|
|
217
217
|
it "should expose the DC datastream" do
|
218
218
|
dc = @test_object.dc
|
219
219
|
dc.should be_a_kind_of(ActiveFedora::Datastream)
|
220
|
-
#dc["identifier"].should_not be_nil
|
221
220
|
rexml = REXML::Document.new(dc.content)
|
222
221
|
rexml.root.elements["dc:identifier"].get_text.should_not be_nil
|
223
|
-
#dc.elements["dc:identifier"].should_not be_nil
|
224
222
|
end
|
225
223
|
end
|
226
224
|
|
@@ -671,4 +669,13 @@ describe ActiveFedora::Base do
|
|
671
669
|
|
672
670
|
end
|
673
671
|
end
|
672
|
+
|
673
|
+
describe "#exists?" do
|
674
|
+
it "should return true for objects that exist" do
|
675
|
+
ActiveFedora::Base.exists?('hydrangea:fixture_mods_article1').should be_true
|
676
|
+
end
|
677
|
+
it "should return false for objects that dont exist" do
|
678
|
+
ActiveFedora::Base.exists?('nil:object').should be_false
|
679
|
+
end
|
680
|
+
end
|
674
681
|
end
|
@@ -73,6 +73,11 @@ describe ActiveFedora::SolrService do
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
+
it 'should instantiate all datastreams in the solr doc, even ones undeclared by the class' do
|
77
|
+
obj = ActiveFedora::Base.load_instance_from_solr "hydrangea:fixture_mods_article1"
|
78
|
+
obj.datastreams.keys.should include('descMetadata')
|
79
|
+
end
|
80
|
+
|
76
81
|
it 'should #reify a lightweight object as a new instance' do
|
77
82
|
query = "id\:#{ActiveFedora::SolrService.escape_uri_for_query(@foo_object.pid)}"
|
78
83
|
solr_result = ActiveFedora::SolrService.query(query)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "active-fedora"
|
2
|
-
require '
|
3
|
-
require '
|
2
|
+
require 'samples/hydra-mods_article_datastream.rb'
|
3
|
+
require 'samples/hydra-rights_metadata_datastream.rb'
|
4
4
|
|
5
5
|
# This Model is used to load & index the hydrangea:fixture_mods_article1 fixture for use in tests.
|
6
6
|
#
|
data/spec/samples/samples.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# require all of the files in the samples directory
|
2
|
-
require '
|
2
|
+
require 'samples/models/hydrangea_article'
|
data/spec/unit/base_spec.rb
CHANGED
@@ -415,7 +415,10 @@ describe ActiveFedora::Base do
|
|
415
415
|
@test_object.save
|
416
416
|
end
|
417
417
|
it "should NOT update solr index if no MetadataDatastreams have changed" do
|
418
|
-
|
418
|
+
stub_ingest(@this_pid)
|
419
|
+
stub_add_ds(@this_pid, ['ds1', 'RELS-EXT'])
|
420
|
+
@test_object.save
|
421
|
+
@test_object.expects(:new_object?).returns(false).twice
|
419
422
|
ActiveFedora::DigitalObject.any_instance.stubs(:save)
|
420
423
|
mock1 = mock("ds1")
|
421
424
|
mock1.expects( :changed?).returns(false).at_least_once
|
@@ -16,6 +16,10 @@ describe ActiveFedora::Datastreams do
|
|
16
16
|
ds = @test_object.datastream_from_spec({:type=>ActiveFedora::Datastream, :versionable=>true}, 'test')
|
17
17
|
ds.versionable.should be_true
|
18
18
|
end
|
19
|
+
it "should default versionable to true" do
|
20
|
+
ds = @test_object.datastream_from_spec({:type=>ActiveFedora::Datastream}, 'test')
|
21
|
+
ds.versionable.should be_true
|
22
|
+
end
|
19
23
|
|
20
24
|
end
|
21
25
|
|
@@ -33,6 +37,39 @@ describe ActiveFedora::Datastreams do
|
|
33
37
|
#ActiveFedora::RubydoraConnection.instance.stubs(:nextid).returns(@this_pid)
|
34
38
|
end
|
35
39
|
|
40
|
+
describe "updates the spec" do
|
41
|
+
before do
|
42
|
+
class FooHistory < ActiveFedora::Base
|
43
|
+
end
|
44
|
+
end
|
45
|
+
after do
|
46
|
+
Object.send(:remove_const, :FooHistory)
|
47
|
+
end
|
48
|
+
subject { FooHistory}
|
49
|
+
it "should update the ds_spec" do
|
50
|
+
FooHistory.ds_specs.keys.should == ['RELS-EXT']
|
51
|
+
FooHistory.has_metadata :type=>ActiveFedora::Datastream, :name=>'new_ds'
|
52
|
+
FooHistory.ds_specs.keys.should include 'new_ds'
|
53
|
+
end
|
54
|
+
it "should be able to set a type" do
|
55
|
+
FooHistory.has_metadata :type=>ActiveFedora::Datastream, :name=>'new_ds', :control_group=>'R'
|
56
|
+
FooHistory.ds_specs['new_ds'][:control_group].should == 'R'
|
57
|
+
end
|
58
|
+
it "should be able to set versionable to false" do
|
59
|
+
FooHistory.has_metadata :type=>ActiveFedora::Datastream, :name=>'new_ds', :versionable=>false
|
60
|
+
FooHistory.ds_specs['new_ds'][:versionable].should be_false
|
61
|
+
end
|
62
|
+
it "should be able to set versionable to true" do
|
63
|
+
FooHistory.has_metadata :type=>ActiveFedora::Datastream, :name=>'new_ds', :versionable=>true
|
64
|
+
FooHistory.ds_specs['new_ds'][:versionable].should be_true
|
65
|
+
end
|
66
|
+
it "should not set versionable if it's not supplied" do
|
67
|
+
FooHistory.has_metadata :type=>ActiveFedora::Datastream, :name=>'new_ds'
|
68
|
+
FooHistory.ds_specs['new_ds'].keys.should_not include :versionable
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
36
73
|
describe "creates datastreams" do
|
37
74
|
before do
|
38
75
|
class FooHistory < ActiveFedora::Base
|
@@ -40,14 +77,9 @@ describe ActiveFedora::Datastreams do
|
|
40
77
|
m.field "fubar", :string
|
41
78
|
m.field "swank", :text
|
42
79
|
end
|
43
|
-
has_metadata :type=>ActiveFedora::MetadataDatastream, :name=>"withText" do |m|
|
44
|
-
m.field "fubar", :text
|
45
|
-
end
|
46
80
|
has_metadata :type=>ActiveFedora::MetadataDatastream, :name=>"withText2", :label=>"withLabel" do |m|
|
47
81
|
m.field "fubar", :text
|
48
82
|
end
|
49
|
-
delegate :fubar, :to=>'withText'
|
50
|
-
delegate :swank, :to=>'someData'
|
51
83
|
end
|
52
84
|
stub_ingest(@this_pid)
|
53
85
|
stub_add_ds(@this_pid, ['RELS-EXT', 'someData', 'withText', 'withText2'])
|
@@ -106,6 +138,7 @@ describe ActiveFedora::Datastreams do
|
|
106
138
|
@n.datastreams["UKETD_DC"].dsLocation.should == "sub_url/objects/#{@this_pid}/methods/hull-sDef:uketdObject/getUKETDMetadata"
|
107
139
|
end
|
108
140
|
|
141
|
+
|
109
142
|
context ":control_group => 'E'" do
|
110
143
|
before do
|
111
144
|
stub_get(@this_pid)
|
@@ -82,14 +82,6 @@ describe ActiveFedora::MetadataDatastream do
|
|
82
82
|
@test_ds.should be_dirty
|
83
83
|
end
|
84
84
|
|
85
|
-
it "should support single-value arguments (as opposed to a hash of values with array indexes as keys)" do
|
86
|
-
# In other words, { "fubar"=>"dork" } should have the same effect as { "fubar"=>{"0"=>"dork"} }
|
87
|
-
pending "this should be working, but for some reason, the updates don't stick"
|
88
|
-
result = @test_ds.update_indexed_attributes( { "fubar"=>"dork" } )
|
89
|
-
result.should == {"fubar"=>{"0"=>"dork"}}
|
90
|
-
@test_ds.fubar_values.should == ["dork"]
|
91
|
-
end
|
92
|
-
|
93
85
|
it "should work for text fields" do
|
94
86
|
att= {"swank"=>{"-1"=>"mork", "1"=>"york"}}
|
95
87
|
result = @test_ds.update_indexed_attributes(att)
|
@@ -113,12 +105,6 @@ describe ActiveFedora::MetadataDatastream do
|
|
113
105
|
result.should == {"swank"=>{"2"=>"mork"}}
|
114
106
|
end
|
115
107
|
|
116
|
-
it "should return accurate response when multiple values have been added in a single run" do
|
117
|
-
pending
|
118
|
-
att= {"swank"=>{"-1"=>"mork", "0"=>"york"}}
|
119
|
-
@test_ds.update_indexed_attributes(att).should == {"swank"=>{"0"=>"york", "1"=>"mork"}}
|
120
|
-
end
|
121
|
-
|
122
108
|
it "should deal gracefully with adding new values at explicitly declared indexes" do
|
123
109
|
@test_ds.fubar_values = ["all", "for", "the"]
|
124
110
|
att = {"fubar"=>{"3"=>'glory'}}
|
@@ -346,8 +332,6 @@ describe ActiveFedora::MetadataDatastream do
|
|
346
332
|
solr_doc["empty_field_t"].should be_nil
|
347
333
|
end
|
348
334
|
|
349
|
-
it "should allow multiple values for a single field"
|
350
|
-
|
351
335
|
it 'should append create keys in format field_name + _ + field_type' do
|
352
336
|
@test_ds.stubs(:fields).returns(@sample_fields)
|
353
337
|
|
@@ -34,8 +34,8 @@ describe ActiveFedora::NtriplesRDFDatastream do
|
|
34
34
|
@subject.based_near.should == ["New York, NY, US"]
|
35
35
|
@subject.related_url.should == ["http://google.com/"]
|
36
36
|
end
|
37
|
-
it "should return fields that are TermProxies" do
|
38
|
-
@subject.created.should be_kind_of
|
37
|
+
it "should return fields that are not TermProxies" do
|
38
|
+
@subject.created.should be_kind_of Array
|
39
39
|
end
|
40
40
|
it "should have method missing" do
|
41
41
|
lambda{@subject.frank}.should raise_exception ActiveFedora::UnregisteredPredicateError
|
@@ -56,7 +56,7 @@ describe ActiveFedora::NtriplesRDFDatastream do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
describe "a new instance" do
|
59
|
-
before do
|
59
|
+
before(:each) do
|
60
60
|
class MyDatastream < ActiveFedora::NtriplesRDFDatastream
|
61
61
|
register_vocabularies RDF::DC
|
62
62
|
map_predicates do |map|
|
@@ -66,36 +66,59 @@ describe ActiveFedora::NtriplesRDFDatastream do
|
|
66
66
|
@subject = MyDatastream.new(@inner_object, 'mixed_rdf')
|
67
67
|
@subject.stubs(:pid => 'test:1')
|
68
68
|
end
|
69
|
+
after(:each) do
|
70
|
+
Object.send(:remove_const, :MyDatastream)
|
71
|
+
end
|
69
72
|
it "should save and reload" do
|
70
73
|
@subject.publisher = ["St. Martin's Press"]
|
71
74
|
@subject.save
|
72
75
|
end
|
73
|
-
|
76
|
+
it "should support to_s method" do
|
77
|
+
@subject.publisher.to_s.should == [].to_s
|
78
|
+
@subject.publisher = "Bob"
|
79
|
+
@subject.publisher.to_s.should == ["Bob"].to_s
|
80
|
+
@subject.publisher << "Jim"
|
81
|
+
@subject.publisher.to_s.should == ["Bob", "Jim"].to_s
|
82
|
+
end
|
83
|
+
end
|
74
84
|
|
75
85
|
describe "solr integration" do
|
76
86
|
before(:all) do
|
77
87
|
class MyDatastream < ActiveFedora::NtriplesRDFDatastream
|
78
88
|
register_vocabularies RDF::DC, RDF::FOAF, RDF::RDFS
|
79
89
|
map_predicates do |map|
|
80
|
-
map.created(:in => RDF::DC
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
map.
|
90
|
+
map.created(:in => RDF::DC) do |index|
|
91
|
+
index.as :sortable, :displayable
|
92
|
+
index.type :date
|
93
|
+
end
|
94
|
+
map.title(:in => RDF::DC) do |index|
|
95
|
+
index.as :searchable, :displayable, :sortable
|
96
|
+
index.type :text
|
97
|
+
end
|
98
|
+
map.publisher(:in => RDF::DC) do |index|
|
99
|
+
index.as :facetable, :sortable, :searchable, :displayable
|
100
|
+
end
|
101
|
+
map.based_near(:in => RDF::FOAF) do |index|
|
102
|
+
index.as :displayable, :facetable, :searchable
|
103
|
+
index.type :text
|
104
|
+
end
|
105
|
+
map.related_url(:to => "seeAlso", :in => RDF::RDFS) do |index|
|
106
|
+
index.defaults
|
107
|
+
end
|
108
|
+
map.rights(:in => RDF::DC)
|
85
109
|
end
|
86
110
|
end
|
87
111
|
@subject = MyDatastream.new(@inner_object, 'solr_rdf')
|
88
112
|
@subject.content = File.new('spec/fixtures/solr_rdf_descMetadata.nt').read
|
89
113
|
@subject.stubs(:pid => 'test:1')
|
90
114
|
@subject.stubs(:new? => false)
|
91
|
-
@sample_fields = {:publisher => {:values => ["publisher1"], :type => :string},
|
92
|
-
:based_near => {:values => ["coverage1", "coverage2"], :type => :text},
|
93
|
-
:created => {:values => "fake-date", :type => :date},
|
94
|
-
:title => {:values => "fake-title", :type => :text},
|
95
|
-
:related_url => {:values => "http://example.org/", :type => :
|
96
|
-
:empty_field => {:values => []}
|
115
|
+
@sample_fields = {:publisher => {:values => ["publisher1"], :type => :string, :behaviors => [:facetable, :sortable, :searchable, :displayable]},
|
116
|
+
:based_near => {:values => ["coverage1", "coverage2"], :type => :text, :behaviors => [:displayable, :facetable, :searchable]},
|
117
|
+
:created => {:values => "fake-date", :type => :date, :behaviors => [:sortable, :displayable]},
|
118
|
+
:title => {:values => "fake-title", :type => :text, :behaviors => [:searchable, :displayable, :sortable]},
|
119
|
+
:related_url => {:values => "http://example.org/", :type =>:string, :behaviors => [:searchable]},
|
120
|
+
:empty_field => {:values => [], :type => :string, :behaviors => [:searchable]}
|
97
121
|
}
|
98
|
-
@sample_xml = XmlSimple.xml_in("<fields><based_near>coverage1</based_near><based_near>coverage2</based_near><created>fake-date</created><publisher>publisher1</publisher><related_url>http://example.org/</related_url><title>fake-title</title></fields>")
|
99
122
|
end
|
100
123
|
after(:all) do
|
101
124
|
# Revert to default mappings after running tests
|
@@ -117,9 +140,17 @@ describe ActiveFedora::NtriplesRDFDatastream do
|
|
117
140
|
@subject.expects(:fields).returns(@sample_fields)
|
118
141
|
solr_doc = @subject.to_solr
|
119
142
|
solr_doc["publisher_t"].should == ["publisher1"]
|
143
|
+
solr_doc["publisher_sort"].should == ["publisher1"]
|
144
|
+
solr_doc["publisher_display"].should == ["publisher1"]
|
145
|
+
solr_doc["publisher_facet"].should == ["publisher1"]
|
120
146
|
solr_doc["based_near_t"].sort.should == ["coverage1", "coverage2"]
|
121
|
-
solr_doc["
|
147
|
+
solr_doc["based_near_display"].sort.should == ["coverage1", "coverage2"]
|
148
|
+
solr_doc["based_near_facet"].sort.should == ["coverage1", "coverage2"]
|
149
|
+
solr_doc["created_sort"].should == ["fake-date"]
|
150
|
+
solr_doc["created_display"].should == ["fake-date"]
|
122
151
|
solr_doc["title_t"].should == ["fake-title"]
|
152
|
+
solr_doc["title_sort"].should == ["fake-title"]
|
153
|
+
solr_doc["title_display"].should == ["fake-title"]
|
123
154
|
solr_doc["related_url_t"].should == ["http://example.org/"]
|
124
155
|
solr_doc["empty_field_t"].should be_nil
|
125
156
|
end
|
@@ -130,9 +161,9 @@ describe ActiveFedora::NtriplesRDFDatastream do
|
|
130
161
|
#should have these
|
131
162
|
@subject.to_solr["publisher_t"].should_not be_nil
|
132
163
|
@subject.to_solr["based_near_t"].should_not be_nil
|
133
|
-
@subject.to_solr["created_dt"].should_not be_nil
|
134
164
|
@subject.to_solr["title_t"].should_not be_nil
|
135
|
-
|
165
|
+
@subject.to_solr["related_url_t"].should_not be_nil
|
166
|
+
|
136
167
|
#should NOT have these
|
137
168
|
@subject.to_solr["narrator"].should be_nil
|
138
169
|
@subject.to_solr["empty_field"].should be_nil
|
@@ -142,11 +173,11 @@ describe ActiveFedora::NtriplesRDFDatastream do
|
|
142
173
|
ActiveFedora::SolrService.load_mappings(File.join(File.dirname(__FILE__), "..", "..", "config", "solr_mappings_af_0.1.yml"))
|
143
174
|
@subject.stubs(:fields).returns(@sample_fields)
|
144
175
|
solr_doc = @subject.to_solr
|
145
|
-
|
176
|
+
|
146
177
|
#should have these
|
147
178
|
solr_doc["publisher_field"].should == ["publisher1"]
|
148
179
|
solr_doc["based_near_field"].sort.should == ["coverage1", "coverage2"]
|
149
|
-
solr_doc["
|
180
|
+
solr_doc["created_display"].should == ["fake-date"]
|
150
181
|
solr_doc["title_field"].should == ["fake-title"]
|
151
182
|
|
152
183
|
solr_doc["title_t"].should be_nil
|
@@ -157,15 +188,6 @@ describe ActiveFedora::NtriplesRDFDatastream do
|
|
157
188
|
# Reload default mappings
|
158
189
|
ActiveFedora::SolrService.load_mappings
|
159
190
|
end
|
160
|
-
it 'should append _dt to dates' do
|
161
|
-
ActiveFedora::SolrService.load_mappings
|
162
|
-
@subject.expects(:fields).returns(@sample_fields).at_least_once
|
163
|
-
@subject.to_solr["created_dt"].should_not be_nil
|
164
|
-
|
165
|
-
#should NOT have these
|
166
|
-
@subject.to_solr["created"].should be_nil
|
167
|
-
@subject.to_solr["created_date"].should be_nil
|
168
|
-
end
|
169
191
|
describe "with an actual object" do
|
170
192
|
before(:all) do
|
171
193
|
@obj = MyDatastream.new(@inner_object, 'solr_rdf')
|
@@ -174,6 +196,7 @@ describe ActiveFedora::NtriplesRDFDatastream do
|
|
174
196
|
@obj.publisher = "Bob's Blogtastic Publishing"
|
175
197
|
@obj.based_near = ["Tacoma, WA", "Renton, WA"]
|
176
198
|
@obj.related_url = "http://example.org/blogtastic/"
|
199
|
+
@obj.rights = "Totally open, y'all"
|
177
200
|
@obj.save
|
178
201
|
end
|
179
202
|
describe ".fields()" do
|
@@ -201,14 +224,22 @@ describe ActiveFedora::NtriplesRDFDatastream do
|
|
201
224
|
end
|
202
225
|
describe ".to_solr()" do
|
203
226
|
it "should return the right # of fields" do
|
204
|
-
@obj.to_solr.keys.count.should ==
|
227
|
+
@obj.to_solr.keys.count.should == 13
|
205
228
|
end
|
206
229
|
it "should return the right fields" do
|
207
230
|
@obj.to_solr.keys.should include("related_url_t")
|
208
231
|
@obj.to_solr.keys.should include("publisher_t")
|
209
|
-
@obj.to_solr.keys.should include("
|
232
|
+
@obj.to_solr.keys.should include("publisher_sort")
|
233
|
+
@obj.to_solr.keys.should include("publisher_display")
|
234
|
+
@obj.to_solr.keys.should include("publisher_facet")
|
235
|
+
@obj.to_solr.keys.should include("created_sort")
|
236
|
+
@obj.to_solr.keys.should include("created_display")
|
210
237
|
@obj.to_solr.keys.should include("title_t")
|
238
|
+
@obj.to_solr.keys.should include("title_sort")
|
239
|
+
@obj.to_solr.keys.should include("title_display")
|
211
240
|
@obj.to_solr.keys.should include("based_near_t")
|
241
|
+
@obj.to_solr.keys.should include("based_near_facet")
|
242
|
+
@obj.to_solr.keys.should include("based_near_display")
|
212
243
|
end
|
213
244
|
it "should return the right values" do
|
214
245
|
@obj.to_solr["related_url_t"].should == ["http://example.org/blogtastic/"]
|
data/spec/unit/property_spec.rb
CHANGED
@@ -15,25 +15,10 @@ describe ActiveFedora::Property do
|
|
15
15
|
ActiveFedora::Property.should respond_to(:new)
|
16
16
|
end
|
17
17
|
|
18
|
-
describe '.new' do
|
19
|
-
|
20
|
-
it 'should use assertions to check types of incoming args'
|
21
|
-
|
22
|
-
# This could rely on property_set and in turn serialize to a 'properties' metadata datastream...
|
23
|
-
it 'should add corresponding field to the properties datastream'
|
24
|
-
|
25
|
-
it 'should add field to repository indexer (ie. solr)'
|
26
|
-
end
|
27
|
-
|
28
18
|
it 'should provide .name' do
|
29
19
|
ActiveFedora::Property.should respond_to(:name)
|
30
20
|
end
|
31
21
|
|
32
|
-
describe '.name' do
|
33
|
-
it 'should return the value of the name attribute' do
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|
37
22
|
|
38
23
|
it 'should provide .instance_variable_name' do
|
39
24
|
#ActiveFedora::Property.should respond_to(:instance_variable_name)
|
@@ -48,7 +48,14 @@ describe ActiveFedora::ServiceDefinitions do
|
|
48
48
|
obj.document_style_1({:format=>'xml'})
|
49
49
|
end
|
50
50
|
it "should call the appropriate rubydora rest api method with a block" do
|
51
|
-
|
51
|
+
Rubydora::Repository.any_instance.stubs(:dissemination).with({:pid=>'monkey:99',:sdef=>'test:12', :method=>'getDocumentStyle1'}).yields "ping!","pang!"
|
52
|
+
obj = Test.new()
|
53
|
+
obj.stubs(:pid).returns('monkey:99')
|
54
|
+
block_response = ""
|
55
|
+
obj.document_style_1 {|res,req|
|
56
|
+
block_response += 'pong!' if res == "ping!" and req == "pang!"
|
57
|
+
}
|
58
|
+
block_response.should == "pong!"
|
52
59
|
end
|
53
60
|
end
|
54
61
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active-fedora
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15424129
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 4
|
8
8
|
- 0
|
9
9
|
- 0
|
10
10
|
- rc
|
11
|
-
-
|
12
|
-
version: 4.0.0.
|
11
|
+
- 10
|
12
|
+
version: 4.0.0.rc10
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Matt Zumwalt
|
@@ -19,7 +19,7 @@ autorequire:
|
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
21
|
|
22
|
-
date: 2012-03-
|
22
|
+
date: 2012-03-12 00:00:00 Z
|
23
23
|
dependencies:
|
24
24
|
- !ruby/object:Gem::Dependency
|
25
25
|
prerelease: false
|