active-fedora 6.4.0 → 6.4.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.
- checksums.yaml +4 -4
- data/lib/active_fedora.rb +1 -0
- data/lib/active_fedora/associations.rb +0 -1
- data/lib/active_fedora/associations/association_collection.rb +28 -1
- data/lib/active_fedora/associations/has_many_association.rb +1 -1
- data/lib/active_fedora/om_datastream.rb +0 -1
- data/lib/active_fedora/qualified_dublin_core_datastream.rb +4 -2
- data/lib/active_fedora/railtie.rb +5 -0
- data/lib/active_fedora/rdf/nested_attributes.rb +25 -4
- data/lib/active_fedora/rdf_node.rb +8 -0
- data/lib/active_fedora/rdf_node/term_proxy.rb +3 -1
- data/lib/active_fedora/version.rb +1 -1
- data/lib/generators/active_fedora/model/USAGE +2 -0
- data/lib/generators/active_fedora/model/model_generator.rb +8 -1
- data/lib/generators/active_fedora/model/templates/datastream.rb.erb +32 -0
- data/lib/generators/active_fedora/model/templates/datastream_spec.rb.erb +13 -0
- data/lib/generators/active_fedora/model/templates/model.rb.erb +3 -6
- data/lib/generators/active_fedora/model/templates/model_spec.rb.erb +5 -1
- data/spec/integration/associations_spec.rb +374 -283
- data/spec/integration/complex_rdf_datastream_spec.rb +13 -0
- data/spec/integration/has_many_associations_spec.rb +2 -2
- data/spec/integration/rdf_nested_attributes_spec.rb +9 -2
- data/spec/unit/qualified_dublin_core_datastream_spec.rb +10 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 967a4215aac7cba00431147cd02fd5e9f96b04f1
|
4
|
+
data.tar.gz: 3eb487a369aa83bfe1d9de8f1d016a5950ffa5a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fd89f5819540cb4cd994f4009151d089b5d45f4502a7a0ee1480c4e6eadf2a6386c83e0ae95ea182e9054f324a8b20ee011a34d6bfec987f07459048911cdae
|
7
|
+
data.tar.gz: 43f479f7be5b7a683eb748ac06e03150c897bc1b0ac9d1ea650a5b9c158fef9039aeeb1582b707a2136ac6c5b218aa011812e6492aa4b75e8f9e34078b75cb14
|
data/lib/active_fedora.rb
CHANGED
@@ -22,6 +22,7 @@ module ActiveFedora #:nodoc:
|
|
22
22
|
class AssociationTypeMismatch < RuntimeError; end # :nodoc:
|
23
23
|
class UnregisteredPredicateError < RuntimeError; end # :nodoc:
|
24
24
|
class RecordNotSaved < RuntimeError; end # :nodoc:
|
25
|
+
class RecordNotFound < RuntimeError; end # :nodoc:
|
25
26
|
|
26
27
|
|
27
28
|
eager_autoload do
|
@@ -36,7 +36,6 @@ module ActiveFedora
|
|
36
36
|
module ClassMethods
|
37
37
|
|
38
38
|
def has_many(association_id, options={})
|
39
|
-
raise "You must specify a property name for #{name}" if !options[:property]
|
40
39
|
reflection = create_has_many_reflection(association_id, options)
|
41
40
|
add_association_callbacks(reflection.name, reflection.options)
|
42
41
|
collection_accessor_methods(reflection, HasManyAssociation)
|
@@ -180,13 +180,40 @@ module ActiveFedora
|
|
180
180
|
end
|
181
181
|
|
182
182
|
def construct_query
|
183
|
-
|
183
|
+
|
184
|
+
clauses = {find_predicate => @owner.internal_uri}
|
184
185
|
clauses[:has_model] = @reflection.class_name.constantize.to_class_uri if @reflection.class_name && @reflection.class_name != 'ActiveFedora::Base'
|
185
186
|
@counter_query = @finder_query = ActiveFedora::SolrService.construct_query_for_rel(clauses)
|
186
187
|
end
|
187
188
|
|
188
189
|
|
189
190
|
private
|
191
|
+
|
192
|
+
def find_predicate
|
193
|
+
if @reflection.options[:property]
|
194
|
+
@reflection.options[:property]
|
195
|
+
elsif @reflection.class_name && @reflection.class_name != 'ActiveFedora::Base' && @reflection.macro != :has_and_belongs_to_many
|
196
|
+
inverse_relation = @owner.class.to_s.underscore.to_sym
|
197
|
+
begin
|
198
|
+
find_class_for_relation(@reflection.class_name.constantize)
|
199
|
+
rescue NameError
|
200
|
+
raise "No :property attribute was set or could be inferred for #{@reflection.macro} #{@reflection.name.inspect} on #{@owner.class}"
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def find_class_for_relation(klass, inverse_relation=@owner.class.to_s.underscore.to_sym)
|
206
|
+
raise "Unable to find #{klass}." if inverse_relation == :'active_fedora/base'
|
207
|
+
if klass.reflections.key?(inverse_relation)
|
208
|
+
# Try it singular
|
209
|
+
return klass.reflections[inverse_relation].options[:property]
|
210
|
+
elsif klass.reflections.key?(inverse_relation.to_s.pluralize.to_sym)
|
211
|
+
# Try it plural
|
212
|
+
return klass.reflections[inverse_relation.to_s.pluralize.to_sym].options[:property]
|
213
|
+
end
|
214
|
+
find_class_for_relation(klass, @owner.class.superclass.to_s.underscore.to_sym)
|
215
|
+
end
|
216
|
+
|
190
217
|
def create_record(attrs)
|
191
218
|
attrs.update(@reflection.options[:conditions]) if @reflection.options[:conditions].is_a?(Hash)
|
192
219
|
ensure_owner_is_not_new
|
@@ -45,7 +45,7 @@ module ActiveFedora
|
|
45
45
|
# Deletes the records according to the <tt>:dependent</tt> option.
|
46
46
|
def delete_records(records)
|
47
47
|
records.each do |r|
|
48
|
-
r.remove_relationship(
|
48
|
+
r.remove_relationship(find_predicate, @owner)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -76,8 +76,9 @@ module ActiveFedora
|
|
76
76
|
:tableOfContents,
|
77
77
|
:temporal,
|
78
78
|
:title,
|
79
|
+
:type,
|
79
80
|
:valid
|
80
|
-
] # removed :
|
81
|
+
] # removed :format
|
81
82
|
DCTERMS.freeze
|
82
83
|
|
83
84
|
#Constructor. this class will call self.field for each DCTERM. In short, all DCTERMS fields will already exist
|
@@ -122,7 +123,8 @@ module ActiveFedora
|
|
122
123
|
self.class.class_fields << name.to_s
|
123
124
|
# add term to terminology
|
124
125
|
unless self.class.terminology.has_term?(name.to_sym)
|
125
|
-
|
126
|
+
om_term_opts = {:xmlns=>"http://purl.org/dc/terms/", :namespace_prefix => "dcterms", :path => opts[:path]}
|
127
|
+
term = OM::XML::Term.new(name.to_sym, om_term_opts, self.class.terminology)
|
126
128
|
self.class.terminology.add_term(term)
|
127
129
|
term.generate_xpath_queries!
|
128
130
|
end
|
@@ -3,6 +3,11 @@ module ActiveFedora
|
|
3
3
|
rake_tasks do
|
4
4
|
load "tasks/active_fedora.rake"
|
5
5
|
end
|
6
|
+
|
7
|
+
initializer 'activefedora.autoload', :before => :set_autoload_paths do |app|
|
8
|
+
app.config.autoload_paths << 'app/models/datastreams'
|
9
|
+
end
|
10
|
+
|
6
11
|
generators do
|
7
12
|
require(
|
8
13
|
'generators/active_fedora/config/config_generator'
|
@@ -12,14 +12,35 @@ module ActiveFedora
|
|
12
12
|
|
13
13
|
UNASSIGNABLE_KEYS = %w( id _destroy )
|
14
14
|
|
15
|
+
# @params [Symbol] association_name
|
16
|
+
# @params [Hash, Array] attributes_collection
|
17
|
+
# @example
|
18
|
+
#
|
19
|
+
# assign_nested_attributes_for_collection_association(:people, {
|
20
|
+
# '1' => { id: '1', name: 'Peter' },
|
21
|
+
# '2' => { name: 'John' },
|
22
|
+
# '3' => { id: '2', _destroy: true }
|
23
|
+
# })
|
24
|
+
#
|
25
|
+
# Will update the name of the Person with ID 1, build a new associated
|
26
|
+
# person with the name 'John', and mark the associated Person with ID 2
|
27
|
+
# for destruction.
|
28
|
+
#
|
29
|
+
# Also accepts an Array of attribute hashes:
|
30
|
+
#
|
31
|
+
# assign_nested_attributes_for_collection_association(:people, [
|
32
|
+
# { id: '1', name: 'Peter' },
|
33
|
+
# { name: 'John' },
|
34
|
+
# { id: '2', _destroy: true }
|
35
|
+
# ])
|
15
36
|
def assign_nested_attributes_for_collection_association(association_name, attributes_collection)
|
16
37
|
options = self.nested_attributes_options[association_name]
|
17
38
|
|
18
39
|
# TODO
|
19
40
|
#check_record_limit!(options[:limit], attributes_collection)
|
20
41
|
|
21
|
-
if attributes_collection.is_a?(Hash) || attributes_collection.is_a?(String)
|
22
|
-
attributes_collection =
|
42
|
+
if attributes_collection.is_a?(Hash)# || attributes_collection.is_a?(String)
|
43
|
+
attributes_collection = attributes_collection.values
|
23
44
|
end
|
24
45
|
|
25
46
|
association = self.send(association_name)
|
@@ -35,7 +56,7 @@ module ActiveFedora
|
|
35
56
|
assign_to_or_mark_for_destruction(existing_record, attributes, options[:allow_destroy])
|
36
57
|
end
|
37
58
|
else
|
38
|
-
raise_nested_attributes_record_not_found(association_name,
|
59
|
+
raise_nested_attributes_record_not_found(association_name, attributes['id'].to_s)
|
39
60
|
end
|
40
61
|
end
|
41
62
|
end
|
@@ -48,7 +69,7 @@ module ActiveFedora
|
|
48
69
|
end
|
49
70
|
|
50
71
|
def raise_nested_attributes_record_not_found(association_name, record_id)
|
51
|
-
raise RecordNotFound, "Couldn't find #{association_name} with ID=#{record_id} for #{self.class.name} with ID=#{
|
72
|
+
raise RecordNotFound, "Couldn't find #{association_name} with ID=#{record_id} for #{self.class.name} with ID=#{rdf_subject.to_s}"
|
52
73
|
end
|
53
74
|
|
54
75
|
def call_reject_if(association_name, attributes)
|
@@ -64,6 +64,14 @@ module ActiveFedora
|
|
64
64
|
@marked_for_destruction
|
65
65
|
end
|
66
66
|
|
67
|
+
def new_record= val
|
68
|
+
@new_record = val
|
69
|
+
end
|
70
|
+
|
71
|
+
def new_record?
|
72
|
+
@new_record
|
73
|
+
end
|
74
|
+
|
67
75
|
# if there are any existing statements with this predicate, replace them
|
68
76
|
# @param [RDF::URI] subject the subject to insert into the graph
|
69
77
|
# @param [Symbol, RDF::URI] predicate the predicate to insert into the graph
|
@@ -21,7 +21,9 @@ module ActiveFedora
|
|
21
21
|
node = mint_node(attributes)
|
22
22
|
parent.graph.insert([subject, predicate, node.rdf_subject])
|
23
23
|
reset!
|
24
|
-
target.find { |n| n.rdf_subject == node.rdf_subject}
|
24
|
+
new_node = target.find { |n| n.rdf_subject == node.rdf_subject}
|
25
|
+
new_node.new_record = true
|
26
|
+
new_node
|
25
27
|
end
|
26
28
|
|
27
29
|
def reset!
|
@@ -6,18 +6,25 @@ module ActiveFedora
|
|
6
6
|
check_class_collision
|
7
7
|
|
8
8
|
class_option :directory, :type => :string, :default => 'models', :desc => "Which directory to generate? (i.e. app/DIRECTORY)"
|
9
|
+
class_option :datastream_directory, :type => :string, :default => 'models/datastreams', :desc => "Which datastream directory to generate? (i.e. models/datastreams)"
|
9
10
|
class_option :has_file_datastream, :type => :string, :default => nil, :desc => "Name a file datastream to create"
|
10
11
|
class_option :descMetadata, :type => :string, :default => nil, :desc => "Add a descMetadata metadata datastream"
|
11
12
|
|
12
13
|
def install
|
13
14
|
template('model.rb.erb',File.join('app', directory, "#{file_name}.rb"))
|
15
|
+
template('datastream.rb.erb',File.join('app', datastream_directory, "#{file_name}_metadata.rb"))
|
14
16
|
template('model_spec.rb.erb',File.join('spec', directory, "#{file_name}_spec.rb"))
|
17
|
+
template('datastream_spec.rb.erb',File.join('spec', datastream_directory, "#{file_name}_metadata_spec.rb"))
|
15
18
|
end
|
16
19
|
|
17
20
|
protected
|
18
21
|
|
19
22
|
def directory
|
20
|
-
options[:directory]
|
23
|
+
options[:directory]
|
24
|
+
end
|
25
|
+
|
26
|
+
def datastream_directory
|
27
|
+
options[:datastream_directory]
|
21
28
|
end
|
22
29
|
end
|
23
30
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Generated via
|
2
|
+
# `rails generate active_fedora::model <%= class_name %>`
|
3
|
+
class <%= class_name %>Metadata < ActiveFedora::OmDatastream
|
4
|
+
|
5
|
+
# Define a terminology for parsing this XML document
|
6
|
+
# See: https://github.com/projecthydra/om/wiki/Tame-your-XML-with-OM
|
7
|
+
#
|
8
|
+
# set_terminology do |t|
|
9
|
+
# t.root(path: "fields")
|
10
|
+
# t.title
|
11
|
+
# t.author
|
12
|
+
# end
|
13
|
+
|
14
|
+
|
15
|
+
# Describe what an empty document looks like
|
16
|
+
#
|
17
|
+
# def self.xml_template
|
18
|
+
# Nokogiri::XML.parse("<fields/>")
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
|
22
|
+
|
23
|
+
# "If you need to add additional attributes to the SOLR document, define the
|
24
|
+
# #to_solr method and make sure to use super"
|
25
|
+
#
|
26
|
+
# def to_solr(solr_document={}, options={})
|
27
|
+
# super(solr_document, options)
|
28
|
+
# solr_document["my_attribute_s"] = my_attribute
|
29
|
+
# return solr_document
|
30
|
+
# end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# Generated via
|
2
|
+
# `rails generate active_fedora::model <%= class_name %>`
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe <%= class_name %>Metadata do
|
6
|
+
it 'should have a title' do
|
7
|
+
pending "Create a terminology for <%= class_name %>Metadata, then enable this test"
|
8
|
+
subject.title = 'War and Peace'
|
9
|
+
subject.title.should == ['War and Peace']
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
@@ -1,15 +1,12 @@
|
|
1
1
|
# Generated via
|
2
2
|
# `rails generate active_fedora::model <%= class_name %>`
|
3
|
-
require 'active_fedora/base'
|
4
3
|
class <%= class_name %> < ActiveFedora::Base
|
5
4
|
<% if options['descMetadata'] %>
|
6
|
-
has_metadata
|
5
|
+
has_metadata "descMetadata", type: <%= options['descMetadata'] %>
|
7
6
|
<% else %>
|
8
|
-
#
|
9
|
-
# datastream. You will need to specify the :type:, which may involve
|
10
|
-
# creating a new Datastream object.
|
7
|
+
# Creating a #descMetadata method that returns the datastream.
|
11
8
|
#
|
12
|
-
|
9
|
+
has_metadata "descMetadata", type: <%= class_name %>Metadata
|
13
10
|
<%- end -%>
|
14
11
|
<% if options['has_file_datastream'] %>
|
15
12
|
has_file_datastream "<%= options['has_file_datastream'] %>"
|
@@ -1,357 +1,369 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
class Library < ActiveFedora::Base
|
4
|
-
has_many :books, :property=>:has_constituent
|
5
|
-
end
|
6
|
-
|
7
|
-
class Book < ActiveFedora::Base
|
8
|
-
belongs_to :library, :property=>:has_constituent
|
9
|
-
belongs_to :author, :property=>:has_member, :class_name=>'Person'
|
10
|
-
has_and_belongs_to_many :topics, :property=>:has_topic, :inverse_of=>:is_topic_of
|
11
|
-
has_and_belongs_to_many :collections, :property=>:is_member_of_collection
|
12
|
-
end
|
13
|
-
|
14
|
-
class Person < ActiveFedora::Base
|
15
|
-
end
|
16
|
-
|
17
|
-
class Collection < ActiveFedora::Base
|
18
|
-
end
|
19
|
-
|
20
|
-
class Topic < ActiveFedora::Base
|
21
|
-
has_and_belongs_to_many :books, :property=>:is_topic_of
|
22
|
-
end
|
23
|
-
|
24
3
|
describe ActiveFedora::Base do
|
25
|
-
describe "
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
@book = Book.new
|
30
|
-
@book.save
|
31
|
-
@book2 = Book.new
|
32
|
-
@book2.save
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should build child" do
|
36
|
-
new_book = @library.books.build({})
|
37
|
-
new_book.should be_new_record
|
38
|
-
new_book.should be_kind_of Book
|
39
|
-
new_book.library.should be_nil
|
40
|
-
@library.books.should == [new_book]
|
41
|
-
#TODO save the associated children too, requires something like ActiveRecord::AutosaveAssociation (ver 3.0.12)
|
42
|
-
#@library.save
|
43
|
-
#new_book.library.should == @library
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should not create children if the parent isn't saved" do
|
47
|
-
lambda {@library.books.create({})}.should raise_error ActiveFedora::RecordNotSaved, "You cannot call create unless the parent is saved"
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should create children" do
|
51
|
-
@library.save!
|
52
|
-
new_book = @library.books.create({})
|
53
|
-
new_book.should_not be_new_record
|
54
|
-
new_book.should be_kind_of Book
|
55
|
-
new_book.library.should == @library
|
56
|
-
end
|
57
|
-
|
58
|
-
it "should build parent" do
|
59
|
-
new_library = @book.build_library({})
|
60
|
-
new_library.should be_new_record
|
61
|
-
new_library.should be_kind_of Library
|
62
|
-
@book.library.should == new_library
|
4
|
+
describe "complex example" do
|
5
|
+
before do
|
6
|
+
class Library < ActiveFedora::Base
|
7
|
+
has_many :books, :property=>:has_constituent
|
63
8
|
end
|
64
9
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
10
|
+
class Book < ActiveFedora::Base
|
11
|
+
belongs_to :library, :property=>:has_constituent
|
12
|
+
belongs_to :author, :property=>:has_member, :class_name=>'Person'
|
13
|
+
has_and_belongs_to_many :topics, :property=>:has_topic, :inverse_of=>:is_topic_of
|
14
|
+
has_and_belongs_to_many :collections, :property=>:is_member_of_collection
|
70
15
|
end
|
71
16
|
|
72
|
-
|
73
|
-
@library.new_record?.should be_true
|
74
|
-
@library.books.size == 0
|
75
|
-
@library.books.should == []
|
76
|
-
@library.book_ids.should ==[]
|
77
|
-
@library.books << @book
|
78
|
-
@library.books.should == [@book]
|
79
|
-
@library.book_ids.should ==[@book.pid]
|
80
|
-
|
17
|
+
class Person < ActiveFedora::Base
|
81
18
|
end
|
82
19
|
|
83
|
-
|
84
|
-
@library.books = [@book, @book2]
|
85
|
-
@library.books.should == [@book, @book2]
|
86
|
-
@library.save
|
87
|
-
|
88
|
-
@library.books = [@book]
|
89
|
-
@library.books.should == [@book]
|
90
|
-
|
91
|
-
end
|
92
|
-
it "should let you set an array of object ids" do
|
93
|
-
@library.book_ids = [@book.pid, @book2.pid]
|
94
|
-
@library.books.should == [@book, @book2]
|
20
|
+
class Collection < ActiveFedora::Base
|
95
21
|
end
|
96
22
|
|
97
|
-
|
98
|
-
|
99
|
-
@library.book_ids = [@book2.pid]
|
100
|
-
@library.books.should == [@book2]
|
101
|
-
|
23
|
+
class Topic < ActiveFedora::Base
|
24
|
+
has_and_belongs_to_many :books, :property=>:is_topic_of
|
102
25
|
end
|
26
|
+
end
|
103
27
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
28
|
+
after do
|
29
|
+
Object.send(:remove_const, :Library)
|
30
|
+
Object.send(:remove_const, :Book)
|
31
|
+
Object.send(:remove_const, :Person)
|
32
|
+
Object.send(:remove_const, :Collection)
|
33
|
+
Object.send(:remove_const, :Topic)
|
34
|
+
end
|
111
35
|
|
36
|
+
describe "an unsaved instance" do
|
37
|
+
describe "of has_many" do
|
38
|
+
before do
|
39
|
+
@library = Library.new()
|
40
|
+
@book = Book.new
|
41
|
+
@book.save
|
42
|
+
@book2 = Book.new
|
43
|
+
@book2.save
|
44
|
+
end
|
112
45
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
46
|
+
it "should build child" do
|
47
|
+
new_book = @library.books.build({})
|
48
|
+
new_book.should be_new_record
|
49
|
+
new_book.should be_kind_of Book
|
50
|
+
new_book.library.should be_nil
|
51
|
+
@library.books.should == [new_book]
|
52
|
+
#TODO save the associated children too, requires something like ActiveRecord::AutosaveAssociation (ver 3.0.12)
|
53
|
+
#@library.save
|
54
|
+
#new_book.library.should == @library
|
55
|
+
end
|
119
56
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
solr_resp = @library.books(:response_format=>:solr)
|
124
|
-
solr_resp.size.should == 2
|
125
|
-
solr_resp[0]['id'].should == @book.pid
|
126
|
-
solr_resp[1]['id'].should == @book2.pid
|
127
|
-
|
128
|
-
end
|
57
|
+
it "should not create children if the parent isn't saved" do
|
58
|
+
lambda {@library.books.create({})}.should raise_error ActiveFedora::RecordNotSaved, "You cannot call create unless the parent is saved"
|
59
|
+
end
|
129
60
|
|
61
|
+
it "should create children" do
|
62
|
+
@library.save!
|
63
|
+
new_book = @library.books.create({})
|
64
|
+
new_book.should_not be_new_record
|
65
|
+
new_book.should be_kind_of Book
|
66
|
+
new_book.library.should == @library
|
67
|
+
end
|
130
68
|
|
69
|
+
it "should build parent" do
|
70
|
+
new_library = @book.build_library({})
|
71
|
+
new_library.should be_new_record
|
72
|
+
new_library.should be_kind_of Library
|
73
|
+
@book.library.should == new_library
|
74
|
+
end
|
131
75
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
76
|
+
it "should create parent" do
|
77
|
+
new_library = @book.create_library({})
|
78
|
+
new_library.should_not be_new_record
|
79
|
+
new_library.should be_kind_of Library
|
80
|
+
@book.library.should == new_library
|
81
|
+
end
|
137
82
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
@book.library_id = nil
|
147
|
-
end
|
148
|
-
it "should be settable from the book side" do
|
149
|
-
@book.library_id = @library.pid
|
150
|
-
@book.library.should == @library
|
151
|
-
@book.library.pid.should == @library.pid
|
152
|
-
@book.attributes= {:library_id => ""}
|
153
|
-
@book.library_id.should be_nil
|
154
|
-
end
|
155
|
-
after do
|
156
|
-
@library.delete
|
157
|
-
@book.delete
|
158
|
-
end
|
159
|
-
end
|
83
|
+
it "should let you shift onto the association" do
|
84
|
+
@library.new_record?.should be_true
|
85
|
+
@library.books.size == 0
|
86
|
+
@library.books.should == []
|
87
|
+
@library.book_ids.should ==[]
|
88
|
+
@library.books << @book
|
89
|
+
@library.books.should == [@book]
|
90
|
+
@library.book_ids.should ==[@book.pid]
|
160
91
|
|
161
|
-
|
162
|
-
before do
|
163
|
-
@topic1 = Topic.create
|
164
|
-
@topic2 = Topic.create
|
165
|
-
@book = Book.create
|
166
|
-
end
|
167
|
-
it "habtm should set and remove relationships bidirectionally" do
|
168
|
-
@book.topics << @topic1
|
169
|
-
@book.topics.should == [@topic1]
|
170
|
-
@topic1.books.should == [@book]
|
171
|
-
@topic1.reload.books.should == [@book]
|
92
|
+
end
|
172
93
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
end
|
178
|
-
after do
|
179
|
-
@topic1.delete
|
180
|
-
@topic2.delete
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
94
|
+
it "should let you set an array of objects" do
|
95
|
+
@library.books = [@book, @book2]
|
96
|
+
@library.books.should == [@book, @book2]
|
97
|
+
@library.save
|
184
98
|
|
185
|
-
|
99
|
+
@library.books = [@book]
|
100
|
+
@library.books.should == [@book]
|
101
|
+
|
102
|
+
end
|
103
|
+
it "should let you set an array of object ids" do
|
104
|
+
@library.book_ids = [@book.pid, @book2.pid]
|
105
|
+
@library.books.should == [@book, @book2]
|
106
|
+
end
|
186
107
|
|
108
|
+
it "setter should wipe out previously saved relations" do
|
109
|
+
@library.book_ids = [@book.pid, @book2.pid]
|
110
|
+
@library.book_ids = [@book2.pid]
|
111
|
+
@library.books.should == [@book2]
|
112
|
+
|
113
|
+
end
|
187
114
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
@person = Person.new
|
196
|
-
@person.save
|
197
|
-
end
|
198
|
-
it "should have many books once it has been saved" do
|
199
|
-
@library.books << @book
|
115
|
+
it "saving the parent should save the relationships on the children" do
|
116
|
+
@library.save
|
117
|
+
@library.books = [@book, @book2]
|
118
|
+
@library.save
|
119
|
+
@library = Library.find(@library.pid)
|
120
|
+
@library.books.should == [@book, @book2]
|
121
|
+
end
|
200
122
|
|
201
|
-
@book.library.pid.should == @library.pid
|
202
|
-
@library.books.reload
|
203
|
-
@library.books.should == [@book]
|
204
123
|
|
205
|
-
|
206
|
-
|
207
|
-
|
124
|
+
it "should let you lookup an array of objects with solr" do
|
125
|
+
@library.save
|
126
|
+
@book.library = @library
|
127
|
+
@book2.library = @library
|
128
|
+
@book.save
|
129
|
+
@book2.save
|
208
130
|
|
209
|
-
|
210
|
-
|
211
|
-
|
131
|
+
@library = Library.find(@library.pid)
|
132
|
+
@library.books.should == [@book, @book2]
|
133
|
+
|
134
|
+
solr_resp = @library.books(:response_format=>:solr)
|
135
|
+
solr_resp.size.should == 2
|
136
|
+
solr_resp[0]['id'].should == @book.pid
|
137
|
+
solr_resp[1]['id'].should == @book2.pid
|
138
|
+
|
139
|
+
end
|
212
140
|
|
213
|
-
# @book.library.pid.should == @library.pid
|
214
|
-
# @library.books.reload
|
215
|
-
# @library.books.should == [@book]
|
216
141
|
|
217
|
-
@library2 = Library.find(@library.pid)
|
218
|
-
@library2.books.size.should == 2
|
219
|
-
end
|
220
142
|
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
Book.find(@book.id).author.send(:find_target).should be_kind_of Person
|
143
|
+
after do
|
144
|
+
@book.delete
|
145
|
+
@book2.delete
|
146
|
+
end
|
226
147
|
end
|
227
148
|
|
228
|
-
describe "
|
149
|
+
describe "of belongs to" do
|
229
150
|
before do
|
230
|
-
@
|
151
|
+
@library = Library.new()
|
152
|
+
@library.save
|
153
|
+
@book = Book.new
|
231
154
|
@book.save
|
232
|
-
@library2 = Library.create
|
233
155
|
end
|
234
|
-
it "
|
235
|
-
@book.library_id
|
236
|
-
|
237
|
-
|
238
|
-
|
156
|
+
it "shouldn't do anything if you set a nil id" do
|
157
|
+
@book.library_id = nil
|
158
|
+
end
|
159
|
+
it "should be settable from the book side" do
|
160
|
+
@book.library_id = @library.pid
|
161
|
+
@book.library.should == @library
|
162
|
+
@book.library.pid.should == @library.pid
|
163
|
+
@book.attributes= {:library_id => ""}
|
164
|
+
@book.library_id.should be_nil
|
239
165
|
end
|
240
166
|
after do
|
241
|
-
@
|
167
|
+
@library.delete
|
168
|
+
@book.delete
|
242
169
|
end
|
243
170
|
end
|
244
171
|
|
245
|
-
|
246
|
-
@library.delete
|
247
|
-
@book.delete
|
248
|
-
end
|
249
|
-
end
|
250
|
-
describe "of has_many_and_belongs_to" do
|
251
|
-
before do
|
252
|
-
@book = Book.create
|
253
|
-
end
|
254
|
-
after do
|
255
|
-
@book.delete
|
256
|
-
end
|
257
|
-
describe "when invese is specified" do
|
172
|
+
describe "of has_many_and_belongs_to" do
|
258
173
|
before do
|
259
174
|
@topic1 = Topic.create
|
260
175
|
@topic2 = Topic.create
|
176
|
+
@book = Book.create
|
261
177
|
end
|
262
|
-
it "should set relationships bidirectionally" do
|
178
|
+
it "habtm should set and remove relationships bidirectionally" do
|
263
179
|
@book.topics << @topic1
|
264
180
|
@book.topics.should == [@topic1]
|
265
|
-
@
|
266
|
-
@topic1.
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
@
|
272
|
-
@book.topics.first.pid.should_not be_nil
|
273
|
-
end
|
274
|
-
it "should clear out the old associtions" do
|
275
|
-
@book.topics = [@topic1]
|
276
|
-
@book.topics = [@topic2]
|
277
|
-
@book.topic_ids.should == [@topic2.pid]
|
181
|
+
@topic1.books.should == [@book]
|
182
|
+
@topic1.reload.books.should == [@book]
|
183
|
+
|
184
|
+
@book.topics.delete(@topic1)
|
185
|
+
#@topic1.books.delete(@book)
|
186
|
+
@book.topics.should == []
|
187
|
+
@topic1.books.should == []
|
278
188
|
end
|
279
189
|
after do
|
280
190
|
@topic1.delete
|
281
191
|
@topic2.delete
|
282
192
|
end
|
283
193
|
end
|
284
|
-
|
194
|
+
end
|
195
|
+
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
describe "a saved instance" do
|
200
|
+
describe "of belongs_to" do
|
285
201
|
before do
|
286
|
-
@
|
287
|
-
@
|
202
|
+
@library = Library.new()
|
203
|
+
@library.save()
|
204
|
+
@book = Book.new
|
288
205
|
@book.save
|
206
|
+
@person = Person.new
|
207
|
+
@person.save
|
208
|
+
end
|
209
|
+
it "should have many books once it has been saved" do
|
210
|
+
@library.books << @book
|
211
|
+
|
212
|
+
@book.library.pid.should == @library.pid
|
213
|
+
@library.books.reload
|
214
|
+
@library.books.should == [@book]
|
215
|
+
|
216
|
+
@library2 = Library.find(@library.pid)
|
217
|
+
@library2.books.should == [@book]
|
289
218
|
end
|
219
|
+
|
220
|
+
it "should have a count once it has been saved" do
|
221
|
+
@library.books << @book << Book.create
|
222
|
+
@library.save
|
223
|
+
|
224
|
+
# @book.library.pid.should == @library.pid
|
225
|
+
# @library.books.reload
|
226
|
+
# @library.books.should == [@book]
|
227
|
+
|
228
|
+
@library2 = Library.find(@library.pid)
|
229
|
+
@library2.books.size.should == 2
|
230
|
+
end
|
231
|
+
|
232
|
+
it "should respect the :class_name parameter" do
|
233
|
+
@book.author = @person
|
234
|
+
@book.save
|
235
|
+
Book.find(@book.id).author_id.should == @person.pid
|
236
|
+
Book.find(@book.id).author.send(:find_target).should be_kind_of Person
|
237
|
+
end
|
238
|
+
|
239
|
+
describe "when changing the belonger" do
|
240
|
+
before do
|
241
|
+
@book.library = @library
|
242
|
+
@book.save
|
243
|
+
@library2 = Library.create
|
244
|
+
end
|
245
|
+
it "should replace an existing instance" do
|
246
|
+
@book.library_id.should == @library.id
|
247
|
+
@book.library = @library2
|
248
|
+
@book.save
|
249
|
+
Book.find(@book.id).library_id.should == @library2.id
|
250
|
+
end
|
251
|
+
after do
|
252
|
+
@library2.delete
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
290
256
|
after do
|
291
|
-
@
|
257
|
+
@library.delete
|
258
|
+
@book.delete
|
292
259
|
end
|
293
|
-
|
294
|
-
|
295
|
-
|
260
|
+
end
|
261
|
+
describe "of has_many_and_belongs_to" do
|
262
|
+
before do
|
263
|
+
@book = Book.create
|
296
264
|
end
|
297
|
-
|
298
|
-
|
265
|
+
after do
|
266
|
+
@book.delete
|
299
267
|
end
|
300
|
-
|
301
|
-
|
302
|
-
|
268
|
+
describe "when invese is specified" do
|
269
|
+
before do
|
270
|
+
@topic1 = Topic.create
|
271
|
+
@topic2 = Topic.create
|
272
|
+
end
|
273
|
+
it "should set relationships bidirectionally" do
|
274
|
+
@book.topics << @topic1
|
275
|
+
@book.topics.should == [@topic1]
|
276
|
+
@book.relationships(:has_topic).should == [@topic1.internal_uri]
|
277
|
+
@topic1.relationships(:has_topic).should == []
|
278
|
+
@topic1.relationships(:is_topic_of).should == [@book.internal_uri]
|
279
|
+
Topic.find(@topic1.pid).books.should == [@book] #Can't have saved it because @book isn't saved yet.
|
280
|
+
end
|
281
|
+
it "should save new child objects" do
|
282
|
+
@book.topics << Topic.new
|
283
|
+
@book.topics.first.pid.should_not be_nil
|
284
|
+
end
|
285
|
+
it "should clear out the old associtions" do
|
286
|
+
@book.topics = [@topic1]
|
287
|
+
@book.topics = [@topic2]
|
288
|
+
@book.topic_ids.should == [@topic2.pid]
|
289
|
+
end
|
290
|
+
after do
|
291
|
+
@topic1.delete
|
292
|
+
@topic2.delete
|
293
|
+
end
|
294
|
+
end
|
295
|
+
describe "when invese is not specified" do
|
296
|
+
before do
|
297
|
+
@c = Collection.create
|
298
|
+
@book.collections << @c
|
299
|
+
@book.save
|
300
|
+
end
|
301
|
+
after do
|
302
|
+
@c.delete
|
303
|
+
end
|
304
|
+
it "should have a collection" do
|
305
|
+
@book.relationships(:is_member_of_collection).should == [@c.internal_uri]
|
306
|
+
@book.collections.should == [@c]
|
307
|
+
end
|
308
|
+
it "habtm should not set foreign relationships if :inverse_of is not specified" do
|
309
|
+
@c.relationships(:is_member_of_collection).should == []
|
310
|
+
end
|
311
|
+
it "should load the collections" do
|
312
|
+
reloaded = Book.find(@book.pid)
|
313
|
+
reloaded.collections.should == [@c]
|
314
|
+
end
|
303
315
|
end
|
304
316
|
end
|
305
317
|
end
|
306
|
-
end
|
307
318
|
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
319
|
+
describe "setting belongs_to" do
|
320
|
+
before do
|
321
|
+
@library = Library.new()
|
322
|
+
@library.save()
|
323
|
+
@book = Book.new
|
324
|
+
end
|
325
|
+
it "should set the association" do
|
326
|
+
@book.library = @library
|
327
|
+
@book.library.pid.should == @library.pid
|
328
|
+
@book.save
|
318
329
|
|
319
330
|
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
331
|
+
Book.find(@book.pid).library.pid.should == @library.pid
|
332
|
+
|
333
|
+
end
|
334
|
+
it "should clear the association" do
|
335
|
+
@book.library = @library
|
336
|
+
@book.library = nil
|
337
|
+
@book.save
|
327
338
|
|
328
|
-
|
329
|
-
|
330
|
-
|
339
|
+
Book.find(@book.pid).library.should be_nil
|
340
|
+
|
341
|
+
end
|
331
342
|
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
343
|
+
it "should replace the association" do
|
344
|
+
@library2 = Library.new
|
345
|
+
@library2.save
|
346
|
+
@book.library = @library
|
347
|
+
@book.save
|
348
|
+
@book.library = @library2
|
349
|
+
@book.save
|
350
|
+
Book.find(@book.pid).library.pid.should == @library2.pid
|
340
351
|
|
341
|
-
|
352
|
+
end
|
342
353
|
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
354
|
+
it "should be able to be set by id" do
|
355
|
+
@book.library_id = @library.pid
|
356
|
+
@book.library_id.should == @library.pid
|
357
|
+
@book.library.pid.should == @library.pid
|
358
|
+
@book.save
|
359
|
+
Book.find(@book.pid).library_id.should == @library.pid
|
360
|
+
end
|
350
361
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
362
|
+
after do
|
363
|
+
@library.delete
|
364
|
+
@book.delete
|
365
|
+
@library2.delete if @library2
|
366
|
+
end
|
355
367
|
end
|
356
368
|
end
|
357
369
|
|
@@ -503,7 +515,11 @@ describe ActiveFedora::Base do
|
|
503
515
|
@master.media_object = @media
|
504
516
|
@master.save
|
505
517
|
@master.reload
|
518
|
+
end
|
506
519
|
|
520
|
+
after :all do
|
521
|
+
Object.send(:remove_const, :MasterFile)
|
522
|
+
Object.send(:remove_const, :MediaObject)
|
507
523
|
end
|
508
524
|
|
509
525
|
it "should also remove the relationships that point at that object" do
|
@@ -513,5 +529,80 @@ describe ActiveFedora::Base do
|
|
513
529
|
end
|
514
530
|
end
|
515
531
|
|
532
|
+
describe "has_many" do
|
533
|
+
describe "when an object doesn't have a property, and the class_name is predictable" do
|
534
|
+
before (:all) do
|
535
|
+
class Bauble < ActiveFedora::Base
|
536
|
+
belongs_to :media_object, property: :is_part_of
|
537
|
+
end
|
538
|
+
class MediaObject < ActiveFedora::Base
|
539
|
+
has_many :baubles
|
540
|
+
end
|
541
|
+
end
|
542
|
+
after :all do
|
543
|
+
Object.send(:remove_const, :Bauble)
|
544
|
+
Object.send(:remove_const, :MediaObject)
|
545
|
+
end
|
546
|
+
|
547
|
+
it "it should find the predicate" do
|
548
|
+
MediaObject.new.baubles.send(:find_predicate).should == :is_part_of
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
552
|
+
describe "when an object doesn't have a property, but has a class_name" do
|
553
|
+
before (:all) do
|
554
|
+
class MasterFile < ActiveFedora::Base
|
555
|
+
belongs_to :media_object, property: :is_part_of
|
556
|
+
end
|
557
|
+
class MediaObject < ActiveFedora::Base
|
558
|
+
has_many :parts, :class_name=>'MasterFile'
|
559
|
+
end
|
560
|
+
end
|
561
|
+
after :all do
|
562
|
+
Object.send(:remove_const, :MasterFile)
|
563
|
+
Object.send(:remove_const, :MediaObject)
|
564
|
+
end
|
565
|
+
|
566
|
+
it "it should find the predicate" do
|
567
|
+
MediaObject.new.parts.send(:find_predicate).should == :is_part_of
|
568
|
+
end
|
569
|
+
end
|
570
|
+
|
571
|
+
describe "an object has an explicity property" do
|
572
|
+
before (:all) do
|
573
|
+
class Bauble < ActiveFedora::Base
|
574
|
+
belongs_to :media_object, property: :is_part_of
|
575
|
+
end
|
576
|
+
class MediaObject < ActiveFedora::Base
|
577
|
+
has_many :baubles, property: :has_baubles
|
578
|
+
end
|
579
|
+
end
|
580
|
+
after :all do
|
581
|
+
Object.send(:remove_const, :Bauble)
|
582
|
+
Object.send(:remove_const, :MediaObject)
|
583
|
+
end
|
584
|
+
|
585
|
+
it "it should find the predicate" do
|
586
|
+
MediaObject.new.baubles.send(:find_predicate).should == :has_baubles
|
587
|
+
end
|
588
|
+
end
|
589
|
+
describe "an object doesn't have a property" do
|
590
|
+
before (:all) do
|
591
|
+
class Bauble < ActiveFedora::Base
|
592
|
+
belongs_to :media_object, property: :is_part_of
|
593
|
+
end
|
594
|
+
class MediaObject < ActiveFedora::Base
|
595
|
+
has_many :shoes
|
596
|
+
end
|
597
|
+
end
|
598
|
+
after :all do
|
599
|
+
Object.send(:remove_const, :Bauble)
|
600
|
+
Object.send(:remove_const, :MediaObject)
|
601
|
+
end
|
516
602
|
|
603
|
+
it "it should find the predicate" do
|
604
|
+
expect { MediaObject.new.shoes.send(:find_predicate) }.to raise_error RuntimeError, "No :property attribute was set or could be inferred for has_many :shoes on MediaObject"
|
605
|
+
end
|
606
|
+
end
|
607
|
+
end
|
517
608
|
end
|
@@ -27,6 +27,19 @@ describe "Nested Rdf Objects" do
|
|
27
27
|
ds = SpecDatastream.new(mock_obj)
|
28
28
|
end
|
29
29
|
|
30
|
+
describe "#new_record?" do
|
31
|
+
it "should be true when its built" do
|
32
|
+
v = ds.parts.build(label: 'Alternator')
|
33
|
+
v.should be_new_record
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should not be new when it's loaded from fedora" do
|
37
|
+
ds.content = '_:g70324142325120 <http://purl.org/dc/terms/title> "Alternator" .
|
38
|
+
<info:fedora/test:124> <http://purl.org/dc/terms/hasPart> _:g70324142325120 .'
|
39
|
+
ds.parts.first.should_not be_new_record
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
30
43
|
it "should not choke on invalid data" do
|
31
44
|
# set a string in the graph where model expects a node
|
32
45
|
ds.parts = ["foo"]
|
@@ -3,8 +3,8 @@ require 'spec_helper'
|
|
3
3
|
describe "When two or more relationships share the same property" do
|
4
4
|
before do
|
5
5
|
class Book < ActiveFedora::Base
|
6
|
-
has_many :collections, :
|
7
|
-
has_many :people
|
6
|
+
has_many :collections, :class_name=>'Collection'
|
7
|
+
has_many :people
|
8
8
|
end
|
9
9
|
|
10
10
|
class Person < ActiveFedora::Base
|
@@ -70,18 +70,20 @@ describe "Nesting attribute behavior of RDFDatastream" do
|
|
70
70
|
let(:params) do
|
71
71
|
{ myResource:
|
72
72
|
{
|
73
|
-
topic_attributes:
|
73
|
+
topic_attributes: {
|
74
|
+
'0' =>
|
74
75
|
{
|
75
76
|
elementList_attributes: [{
|
76
77
|
topicElement:"Cosmology"
|
77
78
|
}]
|
78
79
|
},
|
80
|
+
'1' =>
|
79
81
|
{
|
80
82
|
elementList_attributes: [{
|
81
83
|
topicElement:"Quantum Behavior"
|
82
84
|
}]
|
83
85
|
}
|
84
|
-
|
86
|
+
},
|
85
87
|
personalName_attributes: [
|
86
88
|
{
|
87
89
|
elementList_attributes: [{
|
@@ -153,6 +155,11 @@ describe "Nesting attribute behavior of RDFDatastream" do
|
|
153
155
|
subject.parts.map{|p| p.label.first}.should == ['Alternator', 'Universal Joint', 'Transmission', 'Oil Pump']
|
154
156
|
|
155
157
|
end
|
158
|
+
it "should raise an error when the object isn't found" do
|
159
|
+
expect {
|
160
|
+
subject.parts_attributes= [{id: '_:g70192865051320', label: "Universal Joint"}]
|
161
|
+
}.to raise_error ActiveFedora::RecordNotFound
|
162
|
+
end
|
156
163
|
end
|
157
164
|
end
|
158
165
|
end
|
@@ -45,7 +45,7 @@ describe ActiveFedora::QualifiedDublinCoreDatastream do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
it "should create the right number of fields" do
|
48
|
-
ActiveFedora::QualifiedDublinCoreDatastream::DCTERMS.size.should ==
|
48
|
+
ActiveFedora::QualifiedDublinCoreDatastream::DCTERMS.size.should == 54
|
49
49
|
end
|
50
50
|
|
51
51
|
it "should have unmodifiable constants" do
|
@@ -114,6 +114,7 @@ describe ActiveFedora::QualifiedDublinCoreDatastream do
|
|
114
114
|
end
|
115
115
|
|
116
116
|
end
|
117
|
+
|
117
118
|
describe 'custom fields' do
|
118
119
|
it 'should grab the term' do
|
119
120
|
sample_xml = "<dc xmlns:dcterms='http://purl.org/dc/terms/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><dcterms:cust>custom</dcterms:cust></dc>"
|
@@ -123,4 +124,12 @@ describe ActiveFedora::QualifiedDublinCoreDatastream do
|
|
123
124
|
end
|
124
125
|
end
|
125
126
|
|
127
|
+
describe "#field should accept :path option" do
|
128
|
+
it "should be able to map :dc_type to the path 'type'" do
|
129
|
+
test_ds = ActiveFedora::QualifiedDublinCoreDatastream.from_xml(@sample_xml)
|
130
|
+
test_ds.field :dc_type, :string, path: "type", multiple: true
|
131
|
+
test_ds.dc_type.should == ['sound']
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
126
135
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active-fedora
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.4.
|
4
|
+
version: 6.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Zumwalt
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-07-
|
13
|
+
date: 2013-07-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rsolr
|
@@ -384,6 +384,8 @@ files:
|
|
384
384
|
- lib/generators/active_fedora/config/solr/templates/solr_conf/solr.xml
|
385
385
|
- lib/generators/active_fedora/model/USAGE
|
386
386
|
- lib/generators/active_fedora/model/model_generator.rb
|
387
|
+
- lib/generators/active_fedora/model/templates/datastream.rb.erb
|
388
|
+
- lib/generators/active_fedora/model/templates/datastream_spec.rb.erb
|
387
389
|
- lib/generators/active_fedora/model/templates/model.rb.erb
|
388
390
|
- lib/generators/active_fedora/model/templates/model_spec.rb.erb
|
389
391
|
- lib/tasks/active_fedora.rake
|