active-fedora 9.0.6 → 9.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +5 -5
  2. data/History.txt +57 -0
  3. data/lib/active_fedora.rb +5 -0
  4. data/lib/active_fedora/associations/collection_association.rb +1 -18
  5. data/lib/active_fedora/associations/has_and_belongs_to_many_association.rb +12 -10
  6. data/lib/active_fedora/core.rb +15 -17
  7. data/lib/active_fedora/core/fedora_id_translator.rb +12 -0
  8. data/lib/active_fedora/core/fedora_uri_translator.rb +9 -0
  9. data/lib/active_fedora/errors.rb +4 -0
  10. data/lib/active_fedora/fedora_attributes.rb +15 -5
  11. data/lib/active_fedora/file.rb +2 -0
  12. data/lib/active_fedora/inheritable_accessors.rb +26 -0
  13. data/lib/active_fedora/reflection.rb +3 -1
  14. data/lib/active_fedora/relation/finder_methods.rb +27 -3
  15. data/lib/active_fedora/version.rb +1 -1
  16. data/lib/active_fedora/versions_graph.rb +7 -8
  17. data/spec/integration/associations_spec.rb +34 -22
  18. data/spec/integration/belongs_to_association_spec.rb +118 -47
  19. data/spec/integration/collection_association_spec.rb +46 -0
  20. data/spec/integration/has_and_belongs_to_many_associations_spec.rb +178 -139
  21. data/spec/integration/versionable_spec.rb +38 -1
  22. data/spec/samples/samples.rb +0 -1
  23. data/spec/unit/base_spec.rb +51 -0
  24. data/spec/unit/core/fedora_id_translator_spec.rb +20 -0
  25. data/spec/unit/core/fedora_uri_translator_spec.rb +19 -0
  26. data/spec/unit/core_spec.rb +50 -0
  27. data/spec/unit/has_many_association_spec.rb +27 -2
  28. data/spec/unit/qualified_dublin_core_datastream_spec.rb +0 -6
  29. data/spec/unit/reflection_spec.rb +44 -0
  30. metadata +9 -13
  31. data/spec/samples/marpa-dc_datastream.rb +0 -102
  32. data/spec/samples/models/audio_record.rb +0 -29
  33. data/spec/samples/models/image.rb +0 -5
  34. data/spec/samples/models/oral_history.rb +0 -36
  35. data/spec/samples/models/seminar.rb +0 -29
  36. data/spec/samples/models/seminar_audio_file.rb +0 -32
  37. data/spec/samples/oral_history_sample_model.rb +0 -30
  38. data/spec/samples/special_thing.rb +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: cbfeceebf66b94fa9e04ccb8527c9795167a4e73
4
- data.tar.gz: 7438bf293a82b052a103ccea3febb14929e9e3c2
2
+ SHA256:
3
+ metadata.gz: ebf611de1fa3721bc0d53f15e6210ced8509072da4f1406f818e2f14c5f11be2
4
+ data.tar.gz: 1f6729e4bce4f1b03ba5ba2864c4dbe84ae454932221de98fe4357b8e80e69e4
5
5
  SHA512:
6
- metadata.gz: aa70a485f881672113c3004de9da43d15bb6008e8a95bf85ce22d097260b51169240490b2f2d369eeeb93fa429df116a5f0790b5707bb8ba5cc18684c098e0ef
7
- data.tar.gz: cd423d69239dc6c2dfce41c5ad4c69570a71099d82a543122247efc421d59f1637dba4b5ff43319ccd8702f9f97b30ede3891c9c78db2acae083b693da798dfd
6
+ metadata.gz: f5ba1bc7bcb326f435f1ed88cad1e1a7b68c04b122472379430bf320a634e67e3da72c13c424dda5ba1f9d2673aec820a74d9b7adffb60bd9c23498f89ed7b52
7
+ data.tar.gz: 2e06a0593ec85862f1995277e7a530f05bff3f31e30ed80a4719c04beb8807c28060ec275fa2d833c118b83ad22fb812c5a07d848823bbfc9d90bb8693683fd9
@@ -1,3 +1,60 @@
1
+ v9.0.8
2
+
3
+ 2015-04-15: Revert "Move the indexing logic to the model. Fixes #736"
4
+ [Justin Coyne] (cabb9057)
5
+
6
+ 2015-04-15: Fix deleting from a HABTM when the inverse_of is a
7
+ has_many. Fixes #763 [Justin Coyne] (b1e67fb1)
8
+
9
+ 2015-04-15: Remove a spec that is a duplicate of
10
+ integration/collection_association_spec.rb:92 [Justin Coyne]
11
+ (bdafd50d)
12
+
13
+ 2015-04-15: Leverage the code in AssociationRelation to find the
14
+ inverse. Fixes #760 [Justin Coyne] (c764ea70)
15
+
16
+ 2015-04-15: Make #translate_id_to_uri/uri_to_id reliable. [Trey
17
+ Terrell] (80a4e3fd)
18
+
19
+ 2015-04-15: Find best model match in case of inheritance [Stuart
20
+ Kenny] (481a9cd4)
21
+
22
+ 2015-04-15: Requires 'deprecation' for ActiveFedora::File [Andrew
23
+ Myers] (14be5cf6)
24
+
25
+ 2015-04-07: The indexing hints should be inheritable [Justin Coyne]
26
+ (c8d41b91)
27
+
28
+ v9.0.7
29
+ 2015-04-06: Only set/save the inverse on a HABTM if the inverse is also HABTM
30
+ previously we were getting: [Justin Coyne]
31
+
32
+ 2015-04-06: Derive a foreign_key ending with `_ids` if the inverse is a
33
+ collection [Justin Coyne]
34
+
35
+ 2015-04-06: Find inverse relations when class_names have modules [Justin Coyne]
36
+
37
+ 2015-04-06: Raise an error when the inverse relationship can not be found.
38
+ Previously a "SystemStackError: Stack too deep" was encountered in this
39
+ situation [Justin Coyne]
40
+
41
+ 2015-04-02: Add a mechanism to set rdf_label on the ActiveTriple resource
42
+ [Justin Coyne]
43
+
44
+ 2015-04-03: Refactor has_and_belongs_to_many_associations_spec [Justin Coyne]
45
+
46
+ 2015-04-03: Remove unused sample classes [Justin Coyne]
47
+
48
+ 2015-04-02: Sort versions as dates not as strings [Justin Coyne]
49
+
50
+ 2015-04-01: Prevents an object from being loaded to the incorrect class. For
51
+ example, when loading a batch object it should be loaded into a Batch (and not a
52
+ File for example.) [Justin Coyne]
53
+
54
+ 2015-03-27: Move the indexing logic to the model. Fixes #736 You should now add
55
+ indexing hints to has_attributes by passing a block similar to how you do it
56
+ with rdf properties. e.g.: [Justin Coyne]
57
+
1
58
  v9.0.6
2
59
  2015-03-26: Setting type should not wipe out properties. Fixes #737 [Justin Coyne]
3
60
 
@@ -51,6 +51,10 @@ module ActiveFedora #:nodoc:
51
51
  autoload :ChangeSet
52
52
  autoload :Config
53
53
  autoload :Core
54
+ autoload_under 'core' do
55
+ autoload :FedoraIdTranslator
56
+ autoload :FedoraUriTranslator
57
+ end
54
58
  autoload :Datastream
55
59
  autoload :Datastreams
56
60
  autoload :DelegatedAttribute
@@ -63,6 +67,7 @@ module ActiveFedora #:nodoc:
63
67
  autoload :FixityService
64
68
  autoload :Indexing
65
69
  autoload :IndexingService
70
+ autoload :InheritableAccessors
66
71
  autoload :LdpCache
67
72
  autoload :LdpResource
68
73
  autoload :LdpResourceService
@@ -343,29 +343,12 @@ module ActiveFedora
343
343
  def find_reflection
344
344
  return reflection if @reflection.options[:predicate]
345
345
  if @reflection.class_name && @reflection.class_name != 'ActiveFedora::Base' && @reflection.macro != :has_and_belongs_to_many
346
- inverse_relation = @owner.class.to_s.underscore.to_sym
347
- begin
348
- find_reflection_for_relation(@reflection.class_name.constantize)
349
- rescue NameError
350
- raise "No :predicate attribute was set or could be inferred for #{@reflection.macro} #{@reflection.name.inspect} on #{@owner.class}"
351
- end
346
+ @reflection.inverse_of || raise("No :inverse_of or :predicate attribute was set or could be inferred for #{@reflection.macro} #{@reflection.name.inspect} on #{@owner.class}")
352
347
  else
353
348
  raise "Couldn't find reflection"
354
349
  end
355
350
  end
356
351
 
357
- def find_reflection_for_relation(klass, inverse_relation=@owner.class.to_s.underscore.to_sym)
358
- raise "Unable to lookup the :predicate attribute for #{@reflection.macro} #{@reflection.name.inspect} on #{@owner.class} because #{klass} specifies \"class_name: 'ActiveFedora::Base'\". Either specify a specific class_name in #{klass} or set :predicate in the #{@reflection.macro} declaration on #{@owner.class}" if inverse_relation == :'active_fedora/base'
359
- if klass.reflections.key?(inverse_relation)
360
- # Try it singular
361
- return klass.reflections[inverse_relation]
362
- elsif klass.reflections.key?(inverse_relation.to_s.pluralize.to_sym)
363
- # Try it plural
364
- return klass.reflections[inverse_relation.to_s.pluralize.to_sym]
365
- end
366
- find_reflection_for_relation(klass, @owner.class.superclass.to_s.underscore.to_sym)
367
- end
368
-
369
352
  def create_record(attributes, raise = false)
370
353
  attributes.update(@reflection.options[:conditions]) if @reflection.options[:conditions].is_a?(Hash)
371
354
  ensure_owner_is_not_new
@@ -18,13 +18,16 @@ module ActiveFedora
18
18
  owner[reflection.foreign_key] ||= []
19
19
  owner[reflection.foreign_key] += [record.id]
20
20
 
21
- if @owner.new_record? and @reflection.options[:inverse_of]
22
- ActiveFedora::Base.logger.warn("has_and_belongs_to_many #{@reflection.inspect} is cowardly refusing to insert the inverse relationship into #{record}, because #{@owner} is not persisted yet.") if ActiveFedora::Base.logger
23
- elsif @reflection.options[:inverse_of]
24
- inverse = @reflection.inverse_of
25
- record[inverse.foreign_key] ||= []
26
- record[inverse.foreign_key] += [owner.id]
27
- record.save
21
+ # Only if they've explicitly stated the inverse in the options
22
+ if reflection.options[:inverse_of]
23
+ inverse = reflection.inverse_of
24
+ if owner.new_record?
25
+ ActiveFedora::Base.logger.warn("has_and_belongs_to_many #{reflection.inspect} is cowardly refusing to insert the inverse relationship into #{record}, because #{owner} is not persisted yet.") if ActiveFedora::Base.logger
26
+ elsif inverse.has_and_belongs_to_many?
27
+ record[inverse.foreign_key] ||= []
28
+ record[inverse.foreign_key] += [owner.id]
29
+ record.save
30
+ end
28
31
  end
29
32
 
30
33
  return true
@@ -76,9 +79,8 @@ module ActiveFedora
76
79
  records.each do |r|
77
80
  owner[reflection.foreign_key] -= [r.id]
78
81
 
79
- if (@reflection.options[:inverse_of])
80
- inverse = @reflection.inverse_of
81
- r[inverse.foreign_key] -= [owner.id]
82
+ if inverse = @reflection.inverse_of
83
+ r[inverse.foreign_key] -= [owner.id] if inverse.has_and_belongs_to_many?
82
84
  r.association(inverse.name).reset
83
85
  r.save
84
86
  end
@@ -14,14 +14,25 @@ module ActiveFedora
14
14
  # :singleton-method
15
15
  #
16
16
  # Accepts a proc that takes an id and transforms it to a URI
17
- mattr_accessor :translate_id_to_uri, instance_writer: false
17
+ mattr_reader :translate_id_to_uri do
18
+ FedoraIdTranslator
19
+ end
20
+
21
+ def self.translate_id_to_uri=(translator)
22
+ @@translate_id_to_uri = translator || FedoraIdTranslator
23
+ end
18
24
 
19
25
  ##
20
26
  # :singleton-method
21
27
  #
22
28
  # Accepts a proc that takes a uri and transforms it to an id
23
- mattr_accessor :translate_uri_to_id, instance_writer: false
29
+ mattr_reader :translate_uri_to_id do
30
+ FedoraUriTranslator
31
+ end
24
32
 
33
+ def self.translate_uri_to_id=(translator)
34
+ @@translate_uri_to_id = translator || FedoraUriTranslator
35
+ end
25
36
  end
26
37
 
27
38
  def ldp_source
@@ -134,27 +145,14 @@ module ActiveFedora
134
145
  # Transforms an id into a uri
135
146
  # if translate_id_to_uri is set it uses that proc, otherwise just the default
136
147
  def id_to_uri(id)
137
- if translate_id_to_uri
138
- translate_id_to_uri.call(id)
139
- else
140
- id = "/#{id}" unless id.start_with? SLASH
141
- unless ActiveFedora.fedora.base_path == SLASH || id.start_with?("#{ActiveFedora.fedora.base_path}/")
142
- id = ActiveFedora.fedora.base_path + id
143
- end
144
- ActiveFedora.fedora.host + id
145
- end
148
+ translate_id_to_uri.call(id)
146
149
  end
147
150
 
148
151
  ##
149
152
  # Transforms a uri into an id
150
153
  # if translate_uri_to_id is set it uses that proc, otherwise just the default
151
154
  def uri_to_id(uri)
152
- if translate_uri_to_id
153
- translate_uri_to_id.call(uri)
154
- else
155
- id = uri.to_s.sub(ActiveFedora.fedora.host + ActiveFedora.fedora.base_path, '')
156
- id.start_with?('/') ? id[1..-1] : id
157
- end
155
+ translate_uri_to_id.call(uri)
158
156
  end
159
157
 
160
158
  ##
@@ -0,0 +1,12 @@
1
+ module ActiveFedora::Core
2
+ class FedoraIdTranslator
3
+ SLASH = '/'.freeze
4
+ def self.call(id)
5
+ id = "/#{id}" unless id.start_with? SLASH
6
+ unless ActiveFedora.fedora.base_path == SLASH || id.start_with?("#{ActiveFedora.fedora.base_path}/")
7
+ id = ActiveFedora.fedora.base_path + id
8
+ end
9
+ ActiveFedora.fedora.host + id
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module ActiveFedora::Core
2
+ class FedoraUriTranslator
3
+ SLASH = '/'.freeze
4
+ def self.call(uri)
5
+ id = uri.to_s.sub(ActiveFedora.fedora.host + ActiveFedora.fedora.base_path, '')
6
+ id.start_with?(SLASH) ? id[1..-1] : id
7
+ end
8
+ end
9
+ end
@@ -72,4 +72,8 @@ module ActiveFedora #:nodoc:
72
72
  # Transactions are currently incomplete
73
73
  class Rollback < ActiveFedoraError
74
74
  end
75
+
76
+ # Raised when Fedora returns a version without a create date
77
+ class VersionLacksCreateDate < ActiveFedoraError
78
+ end
75
79
  end
@@ -1,6 +1,7 @@
1
1
  module ActiveFedora
2
2
  module FedoraAttributes
3
3
  extend ActiveSupport::Concern
4
+ include InheritableAccessors
4
5
 
5
6
  included do
6
7
  include ActiveTriples::Properties
@@ -18,6 +19,8 @@ module ActiveFedora
18
19
  def modified_date
19
20
  super.first
20
21
  end
22
+
23
+ define_inheritable_accessor(:type, :rdf_label)
21
24
  end
22
25
 
23
26
  # Override ActiveTriples method for setting properties
@@ -62,6 +65,12 @@ module ActiveFedora
62
65
  @resource ||= self.class.resource_class.new(@ldp_source.graph.rdf_subject, @ldp_source.graph)
63
66
  end
64
67
 
68
+ # You can set the URI to use for the rdf_label on ClassMethods.rdf_label, then on
69
+ # the instance, calling rdf_label returns the value of that configured property
70
+ def rdf_label
71
+ resource.rdf_label
72
+ end
73
+
65
74
  module ClassMethods
66
75
  # We make a unique class, because properties belong to a class.
67
76
  # This keeps properties from different objects separate.
@@ -70,7 +79,7 @@ module ActiveFedora
70
79
  def resource_class
71
80
  @generated_resource_class ||= begin
72
81
  klass = self.const_set(:GeneratedResourceSchema, Class.new(ActiveTriples::Resource))
73
- klass.configure type: @type if @type
82
+ klass.configure active_triple_options
74
83
  klass.properties.merge(self.properties).each do |property, config|
75
84
  klass.property(config.term,
76
85
  predicate: config.predicate,
@@ -80,10 +89,11 @@ module ActiveFedora
80
89
  end
81
90
  end
82
91
 
83
- # Set the rdf type for this class
84
- def type(uri)
85
- @type = uri
86
- end
92
+ private
93
+ # @return a Hash of options suitable for passing to ActiveTriples::Base.configure
94
+ def active_triple_options
95
+ { type: type, rdf_label: rdf_label }
96
+ end
87
97
  end
88
98
  end
89
99
  end
@@ -1,3 +1,5 @@
1
+ require 'deprecation'
2
+
1
3
  module ActiveFedora
2
4
 
3
5
  #This class represents a Fedora datastream
@@ -0,0 +1,26 @@
1
+ # Similar to ActiveSupport.class_attribute but with a setter that doesn't use the #{name}= syntax
2
+ # This preserves backward compatibility with the API in ActiveTriples
3
+
4
+ module ActiveFedora
5
+ module InheritableAccessors
6
+ extend ActiveSupport::Concern
7
+ module ClassMethods
8
+ def define_inheritable_accessor(*names)
9
+ names.each do |name|
10
+ define_accessor(name, nil)
11
+ end
12
+ end
13
+
14
+ private
15
+ def define_accessor(name, val)
16
+ singleton_class.class_eval do
17
+ remove_possible_method(name)
18
+ define_method(name) do |uri = nil|
19
+ define_accessor(name, uri) if uri
20
+ val
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -152,6 +152,8 @@ module ActiveFedora
152
152
  "#{name.to_s.singularize}_ids"
153
153
  elsif options[:as]
154
154
  "#{options[:as]}_id"
155
+ elsif inverse_of && inverse_of.collection?
156
+ "#{options[:inverse_of].to_s.singularize}_ids"
155
157
  else
156
158
  # This works well if this is a has_many that is the inverse of a belongs_to, but it isn't correct for a has_many that is the invers of a has_and_belongs_to_many
157
159
  active_fedora.name.foreign_key
@@ -292,7 +294,7 @@ module ActiveFedora
292
294
  # returns either false or the inverse association name that it finds.
293
295
  def automatic_inverse_of
294
296
  if can_find_inverse_of_automatically?(self)
295
- inverse_name = ActiveSupport::Inflector.underscore(active_fedora.name).to_sym
297
+ inverse_name = ActiveSupport::Inflector.underscore(options[:as] || active_fedora.name.demodulize).to_sym
296
298
 
297
299
  begin
298
300
  reflection = klass.reflect_on_association(inverse_name)
@@ -38,7 +38,6 @@ module ActiveFedora
38
38
  return to_a.find { |*block_args| yield(*block_args) } if block_given?
39
39
  options = args.extract_options!
40
40
  options = options.dup
41
-
42
41
  cast = if @klass == ActiveFedora::Base && !options.has_key?(:cast)
43
42
  true
44
43
  else
@@ -198,12 +197,37 @@ module ActiveFedora
198
197
  ActiveFedora::Base
199
198
  else
200
199
  # The true class may be a subclass of @klass, so always use from_class_uri
201
- Model.from_class_uri(has_model_value(resource)) || ActiveFedora::Base
200
+ resource_class = Model.from_class_uri(has_model_value(resource)) || ActiveFedora::Base
201
+ unless equivalent_class?(resource_class)
202
+ raise ActiveFedora::ActiveFedoraError.new("Model mismatch. Expected #{@klass}. Got: #{resource_class}")
203
+ end
204
+ resource_class
202
205
  end
203
206
  end
204
207
 
205
208
  def has_model_value(resource)
206
- resource.graph.query([nil, ActiveFedora::RDF::Fcrepo::Model.hasModel, nil]).first.object.to_s
209
+ best_model_match = nil
210
+
211
+ resource.graph.query([nil, ActiveFedora::RDF::Fcrepo::Model.hasModel, nil]).each do |rg|
212
+
213
+ model_value = Model.from_class_uri(rg.object.to_s)
214
+
215
+ if model_value
216
+
217
+ best_model_match ||= model_value
218
+
219
+ # If there is an inheritance structure, use the most specific case.
220
+ if best_model_match > model_value
221
+ best_model_match = model_value
222
+ end
223
+ end
224
+ end
225
+
226
+ best_model_match.to_s
227
+ end
228
+
229
+ def equivalent_class?(other_class)
230
+ other_class <= @klass
207
231
  end
208
232
 
209
233
  def find_with_ids(ids, cast)
@@ -1,3 +1,3 @@
1
1
  module ActiveFedora
2
- VERSION = "9.0.6"
2
+ VERSION = "9.0.8"
3
3
  end
@@ -2,11 +2,13 @@ module ActiveFedora
2
2
  class VersionsGraph < ::RDF::Graph
3
3
 
4
4
  def all opts={}
5
- if opts[:include_auto_save]
6
- fedora_versions
7
- else
8
- fedora_versions.reject { |v| v.label.match("auto") }
5
+ versions = fedora_versions
6
+ unless opts[:include_auto_save]
7
+ versions.reject! { |version| version.label.match("auto") }
9
8
  end
9
+ versions.sort_by { |version| DateTime.parse(version.created) }
10
+ rescue ArgumentError, NoMethodError
11
+ raise ActiveFedora::VersionLacksCreateDate
10
12
  end
11
13
 
12
14
  def first
@@ -50,10 +52,7 @@ module ActiveFedora
50
52
  end
51
53
 
52
54
  def fedora_versions
53
- list = resources.map { |statement| version_from_resource(statement) }
54
- list.sort_by(&:created)
55
+ resources.map { |statement| version_from_resource(statement) }
55
56
  end
56
-
57
57
  end
58
-
59
58
  end
@@ -28,7 +28,7 @@ describe ActiveFedora::Base do
28
28
  describe "explicit foreign key" do
29
29
  before do
30
30
  class FooThing < ActiveFedora::Base
31
- has_many :bars, :class_name=>'BarThing', :predicate=>ActiveFedora::RDF::Fcrepo::RelsExt.isPartOf, :as=>:foothing
31
+ has_many :bars, :class_name=>'BarThing', :predicate=>ActiveFedora::RDF::Fcrepo::RelsExt.isPartOf, as: :foothing
32
32
  end
33
33
 
34
34
  class BarThing < ActiveFedora::Base
@@ -286,6 +286,39 @@ describe ActiveFedora::Base do
286
286
  end
287
287
  end
288
288
 
289
+ describe "when fetching an existing object" do
290
+ before do
291
+ class Dog < ActiveFedora::Base; end
292
+ class BigDog < Dog; end
293
+ class Cat < ActiveFedora::Base; end
294
+ @dog = Dog.create
295
+ @big_dog = BigDog.create
296
+ end
297
+ it "should detect class mismatch" do
298
+ expect {
299
+ Cat.find @dog.id
300
+ }.to raise_error(ActiveFedora::ActiveFedoraError)
301
+ end
302
+
303
+ it "should not accept parent class into a subclass" do
304
+ expect {
305
+ BigDog.find @dog.id
306
+ }.to raise_error(ActiveFedora::ActiveFedoraError)
307
+ end
308
+
309
+ it "should accept a subclass into a parent class" do
310
+ # We could prevent this altogether since loading a subclass into
311
+ # a parent class (a BigDog into a Dog) would result in lost of
312
+ # data if the object is saved back and the subclass has more
313
+ # properties than the parent class. However, it does seem reasonable
314
+ # that people might want to use them interchangeably (after all
315
+ # a BigDog is a Dog) and therefore we allow for it.
316
+ expect {
317
+ Dog.find @big_dog.id
318
+ }.not_to raise_error
319
+ end
320
+ end
321
+
289
322
  describe "setting belongs_to" do
290
323
  before do
291
324
  @library = Library.new()
@@ -558,27 +591,6 @@ describe ActiveFedora::Base do
558
591
  expect(MediaObject.new.association(:baubles).send(:find_reflection)).to eq MediaObject.reflect_on_association(:baubles)
559
592
  end
560
593
  end
561
-
562
- describe "an object doesn't have a property" do
563
- before :all do
564
- class Bauble < ActiveFedora::Base
565
- belongs_to :media_object, predicate: ActiveFedora::RDF::Fcrepo::RelsExt.isPartOf
566
- end
567
-
568
- class MediaObject < ActiveFedora::Base
569
- has_many :shoes
570
- end
571
- end
572
-
573
- after :all do
574
- Object.send(:remove_const, :Bauble)
575
- Object.send(:remove_const, :MediaObject)
576
- end
577
-
578
- it "it should find the predicate" do
579
- expect { MediaObject.new.shoes.send(:find_predicate) }.to raise_error RuntimeError, "No :predicate attribute was set or could be inferred for has_many :shoes on MediaObject"
580
- end
581
- end
582
594
  end
583
595
 
584
596
  describe "casting when the class name is ActiveFedora::Base" do