active-fedora 9.9.1 → 9.10.0.pre1

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.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -2
  3. data/.travis.yml +2 -6
  4. data/active-fedora.gemspec +9 -6
  5. data/lib/active_fedora.rb +31 -15
  6. data/lib/active_fedora/associations.rb +1 -1
  7. data/lib/active_fedora/associations/association.rb +6 -2
  8. data/lib/active_fedora/associations/belongs_to_association.rb +0 -10
  9. data/lib/active_fedora/associations/builder/association.rb +85 -12
  10. data/lib/active_fedora/associations/builder/belongs_to.rb +3 -1
  11. data/lib/active_fedora/associations/builder/collection_association.rb +4 -3
  12. data/lib/active_fedora/associations/builder/contains.rb +7 -2
  13. data/lib/active_fedora/associations/builder/directly_contains.rb +7 -3
  14. data/lib/active_fedora/associations/builder/directly_contains_one.rb +8 -4
  15. data/lib/active_fedora/associations/builder/has_and_belongs_to_many.rb +6 -2
  16. data/lib/active_fedora/associations/builder/has_many.rb +6 -2
  17. data/lib/active_fedora/associations/builder/indirectly_contains.rb +7 -3
  18. data/lib/active_fedora/associations/builder/property.rb +7 -2
  19. data/lib/active_fedora/associations/builder/singular_association.rb +3 -1
  20. data/lib/active_fedora/associations/builder/singular_property.rb +3 -1
  21. data/lib/active_fedora/associations/collection_association.rb +9 -5
  22. data/lib/active_fedora/associations/collection_proxy.rb +1 -1
  23. data/lib/active_fedora/associations/contained_finder.rb +1 -2
  24. data/lib/active_fedora/associations/directly_contains_one_association.rb +1 -1
  25. data/lib/active_fedora/associations/has_many_association.rb +1 -5
  26. data/lib/active_fedora/associations/rdf.rb +1 -20
  27. data/lib/active_fedora/attached_files.rb +1 -1
  28. data/lib/active_fedora/attribute_methods.rb +18 -0
  29. data/lib/active_fedora/attributes.rb +1 -1
  30. data/lib/active_fedora/autosave_association.rb +8 -12
  31. data/lib/active_fedora/base.rb +0 -2
  32. data/lib/active_fedora/caching_connection.rb +1 -1
  33. data/lib/active_fedora/default_model_mapper.rb +24 -0
  34. data/lib/active_fedora/fedora.rb +1 -1
  35. data/lib/active_fedora/file/attributes.rb +4 -5
  36. data/lib/active_fedora/identifiable.rb +5 -0
  37. data/lib/active_fedora/indexing.rb +13 -7
  38. data/lib/active_fedora/indexing_service.rb +4 -4
  39. data/lib/active_fedora/ldp_resource.rb +1 -0
  40. data/lib/active_fedora/model.rb +18 -16
  41. data/lib/active_fedora/model_classifier.rb +77 -0
  42. data/lib/active_fedora/nested_attributes.rb +145 -18
  43. data/lib/active_fedora/persistence.rb +1 -1
  44. data/lib/active_fedora/predicates.rb +3 -0
  45. data/lib/active_fedora/qualified_dublin_core_datastream.rb +1 -1
  46. data/lib/active_fedora/query_result_builder.rb +12 -28
  47. data/lib/active_fedora/querying.rb +1 -1
  48. data/lib/active_fedora/rdf/datastream_indexing.rb +1 -1
  49. data/lib/active_fedora/reflection.rb +15 -7
  50. data/lib/active_fedora/relation.rb +17 -0
  51. data/lib/active_fedora/relation/calculations.rb +1 -5
  52. data/lib/active_fedora/relation/finder_methods.rb +39 -26
  53. data/lib/active_fedora/scoping.rb +5 -0
  54. data/lib/active_fedora/scoping/default.rb +113 -0
  55. data/lib/active_fedora/scoping/named.rb +11 -3
  56. data/lib/active_fedora/simple_datastream.rb +1 -1
  57. data/lib/active_fedora/solr_hit.rb +71 -0
  58. data/lib/active_fedora/solr_instance_loader.rb +12 -36
  59. data/lib/active_fedora/solr_query_builder.rb +20 -25
  60. data/lib/active_fedora/solr_service.rb +24 -13
  61. data/lib/active_fedora/type.rb +8 -0
  62. data/lib/active_fedora/type/boolean.rb +23 -0
  63. data/lib/active_fedora/type/value.rb +118 -0
  64. data/lib/active_fedora/validations.rb +14 -5
  65. data/lib/active_fedora/version.rb +1 -1
  66. data/lib/active_fedora/versionable.rb +8 -7
  67. data/spec/config_helper.rb +0 -5
  68. data/spec/integration/associations_spec.rb +5 -5
  69. data/spec/integration/base_spec.rb +4 -4
  70. data/spec/integration/bug_spec.rb +0 -1
  71. data/spec/integration/full_featured_model_spec.rb +4 -4
  72. data/spec/integration/has_and_belongs_to_many_associations_spec.rb +1 -1
  73. data/spec/integration/has_many_associations_spec.rb +30 -1
  74. data/spec/integration/indirect_container_spec.rb +1 -1
  75. data/spec/integration/nested_attribute_spec.rb +6 -0
  76. data/spec/integration/ntriples_datastream_spec.rb +4 -4
  77. data/spec/integration/om_datastream_spec.rb +1 -1
  78. data/spec/integration/relation_delegation_spec.rb +1 -1
  79. data/spec/integration/scoped_query_spec.rb +12 -12
  80. data/spec/integration/solr_hit_spec.rb +52 -0
  81. data/spec/samples/hydra-mods_article_datastream.rb +2 -2
  82. data/spec/spec_helper.rb +5 -9
  83. data/spec/unit/active_fedora_spec.rb +0 -26
  84. data/spec/unit/base_spec.rb +20 -0
  85. data/spec/unit/builder/has_and_belongs_to_many_spec.rb +2 -3
  86. data/spec/unit/callback_spec.rb +3 -8
  87. data/spec/unit/default_model_mapper_spec.rb +39 -0
  88. data/spec/unit/finder_methods_spec.rb +30 -6
  89. data/spec/unit/has_many_association_spec.rb +23 -1
  90. data/spec/unit/indexing_spec.rb +17 -3
  91. data/spec/unit/model_classifier_spec.rb +49 -0
  92. data/spec/unit/model_spec.rb +0 -9
  93. data/spec/unit/ntriples_datastream_spec.rb +16 -16
  94. data/spec/unit/om_datastream_spec.rb +7 -7
  95. data/spec/unit/qualified_dublin_core_datastream_spec.rb +1 -1
  96. data/spec/unit/query_result_builder_spec.rb +4 -10
  97. data/spec/unit/query_spec.rb +28 -28
  98. data/spec/unit/rdf/indexing_service_spec.rb +16 -16
  99. data/spec/unit/scoping_spec.rb +67 -0
  100. data/spec/unit/simple_datastream_spec.rb +2 -2
  101. data/spec/unit/solr_config_options_spec.rb +29 -32
  102. data/spec/unit/solr_hit_spec.rb +58 -0
  103. data/spec/unit/solr_query_builder_spec.rb +9 -1
  104. data/spec/unit/solr_service_spec.rb +19 -3
  105. metadata +73 -17
  106. data/spec/support/freeze_mocks.rb +0 -12
@@ -16,15 +16,15 @@ module ActiveFedora
16
16
  end
17
17
 
18
18
  def self.profile_solr_name
19
- @profile_solr_name ||= ActiveFedora::SolrQueryBuilder.solr_name("object_profile", :displayable)
19
+ @profile_solr_name ||= ActiveFedora.index_field_mapper.solr_name("object_profile", :displayable)
20
20
  end
21
21
 
22
22
  def self.create_time_solr_name
23
- @create_time_solr_name ||= ActiveFedora::SolrQueryBuilder.solr_name('system_create', :stored_sortable, type: :date)
23
+ @create_time_solr_name ||= ActiveFedora.index_field_mapper.solr_name('system_create', :stored_sortable, type: :date)
24
24
  end
25
25
 
26
26
  def self.modified_time_solr_name
27
- @modified_time_solr_name ||= ActiveFedora::SolrQueryBuilder.solr_name('system_modified', :stored_sortable, type: :date)
27
+ @modified_time_solr_name ||= ActiveFedora.index_field_mapper.solr_name('system_modified', :stored_sortable, type: :date)
28
28
  end
29
29
 
30
30
  def rdf_service
@@ -40,7 +40,7 @@ module ActiveFedora
40
40
  Solrizer.set_field(solr_doc, 'system_modified', m_time, :stored_sortable)
41
41
  Solrizer.set_field(solr_doc, 'active_fedora_model', object.class.inspect, :stored_sortable)
42
42
  solr_doc[QueryResultBuilder::HAS_MODEL_SOLR_FIELD] = object.has_model
43
- solr_doc[SOLR_DOCUMENT_ID.to_sym] = object.id
43
+ solr_doc[ActiveFedora.id_field.to_sym] = object.id
44
44
  solr_doc[self.class.profile_solr_name] = profile_service.new(object).export
45
45
  object.declared_attached_files.each do |name, file|
46
46
  solr_doc.merge! file.to_solr(solr_doc, name: name.to_s)
@@ -16,6 +16,7 @@ module ActiveFedora
16
16
  # @param [RDF::Graph] original_graph The graph returned by the LDP server
17
17
  # @return [RDF::Graph] A graph striped of any inlined resources present in the original
18
18
  def build_graph(original_graph)
19
+ Deprecation.warn(ActiveFedora::LdpResource, '#build_graph is deprecated and will be removed in active-fedora 10.0')
19
20
  inlined_resources = get.graph.query(predicate: Ldp.contains).map(&:object)
20
21
 
21
22
  # ActiveFedora always wants to copy the resources to a new graph because it
@@ -1,29 +1,31 @@
1
- SOLR_DOCUMENT_ID = "id".freeze unless defined?(SOLR_DOCUMENT_ID)
2
-
3
1
  module ActiveFedora
4
2
  # = ActiveFedora
5
3
  # This module mixes various methods into the including class,
6
4
  # much in the way ActiveRecord does.
7
5
  module Model
6
+ # @deprecated
7
+ # Convenience method for getting class constant based on a string
8
+ # @example
9
+ # ActiveFedora::Model.class_from_string("Om")
10
+ # => Om
11
+ # ActiveFedora::Model.class_from_string("ActiveFedora::RdfNode::TermProxy")
12
+ # => ActiveFedora::RdfNode::TermProxy
13
+ # @example Search within ActiveFedora::RdfNode for a class called "TermProxy"
14
+ # ActiveFedora::Model.class_from_string("TermProxy", ActiveFedora::RdfNode)
15
+ # => ActiveFedora::RdfNode::TermProxy
16
+ def self.class_from_string(*args)
17
+ Deprecation.warn("ActiveFedora::Model.class_from_string has been deprecated and will be removed in ActiveFedora 10.0. Use ActiveFedora::ModelClassifier.class_from_string instead")
18
+ ActiveFedora::ModelClassifier.class_from_string(*args)
19
+ end
20
+
21
+ # @deprecated
8
22
  # Takes a Fedora URI for a cModel, and returns a
9
23
  # corresponding Model if available
10
24
  # This method should reverse ClassMethods#to_class_uri
11
25
  # @return [Class, False] the class of the model or false, if it does not exist
12
26
  def self.from_class_uri(model_value)
13
- unless class_exists?(model_value)
14
- ActiveFedora::Base.logger.warn "'#{model_value}' is not a real class" if ActiveFedora::Base.logger
15
- return nil
16
- end
17
- ActiveFedora.class_from_string(model_value)
18
- end
19
-
20
- def self.class_exists?(class_name)
21
- return false if class_name.empty?
22
- klass = class_name.constantize
23
- return klass.is_a?(Class)
24
- rescue NameError
25
- return false
27
+ Deprecation.warn("ActiveFedora::Model.from_class_uri has been deprecated and will be removed in ActiveFedora 10.0. Use ActiveFedora::ModelClassifier.from_class_uri instead")
28
+ ActiveFedora::ModelClassifier.new(Array(model_value)).best_model
26
29
  end
27
- private_class_method :class_exists?
28
30
  end
29
31
  end
@@ -0,0 +1,77 @@
1
+ module ActiveFedora
2
+ # Translate model names to classes
3
+ class ModelClassifier
4
+ # Convenience method for getting class constant based on a string
5
+ # @example
6
+ # ActiveFedora::Model.class_from_string("Om")
7
+ # => Om
8
+ # ActiveFedora::Model.class_from_string("ActiveFedora::RdfNode::TermProxy")
9
+ # => ActiveFedora::RdfNode::TermProxy
10
+ # @example Search within ActiveFedora::RdfNode for a class called "TermProxy"
11
+ # ActiveFedora::Model.class_from_string("TermProxy", ActiveFedora::RdfNode)
12
+ # => ActiveFedora::RdfNode::TermProxy
13
+ def self.class_from_string(full_class_name, container_class = Kernel)
14
+ container_class = container_class.name if container_class.is_a? Module
15
+ container_parts = container_class.split('::')
16
+ (container_parts + full_class_name.split('::')).flatten.inject(Kernel) do |mod, class_name|
17
+ if mod == Kernel
18
+ Object.const_get(class_name)
19
+ elsif mod.const_defined? class_name.to_sym
20
+ mod.const_get(class_name)
21
+ else
22
+ container_parts.pop
23
+ class_from_string(class_name, container_parts.join('::'))
24
+ end
25
+ end
26
+ end
27
+
28
+ attr_reader :class_names, :default
29
+
30
+ def initialize(class_names, default: ActiveFedora::Base)
31
+ @class_names = Array(class_names)
32
+ @default = default
33
+ end
34
+
35
+ ##
36
+ # Convert all the provided class names to class instances
37
+ def models
38
+ class_names.map do |uri|
39
+ classify(uri)
40
+ end.compact
41
+ end
42
+
43
+ ##
44
+ # Select the "best" class from the list of class names. We define
45
+ # the "best" class as:
46
+ # - a subclass of the given default, base class
47
+ # - preferring subclasses over the parent class
48
+ def best_model(opts = {})
49
+ best_model_match = opts.fetch(:default, default)
50
+
51
+ models.each do |model_value|
52
+ # If there is an inheritance structure, use the most specific case.
53
+ best_model_match = model_value if best_model_match.nil? || best_model_match > model_value
54
+ end
55
+
56
+ best_model_match
57
+ end
58
+
59
+ private
60
+
61
+ def classify(model_value)
62
+ unless class_exists?(model_value)
63
+ ActiveFedora::Base.logger.warn "'#{model_value}' is not a real class" if ActiveFedora::Base.logger
64
+ return nil
65
+ end
66
+ ActiveFedora::ModelClassifier.class_from_string(model_value)
67
+ end
68
+
69
+ def class_exists?(class_name)
70
+ return false if class_name.empty?
71
+ klass = class_name.constantize
72
+ return klass.is_a?(Class)
73
+ rescue NameError
74
+ return false
75
+ end
76
+ end
77
+ end
@@ -60,9 +60,9 @@ module ActiveFedora
60
60
  options[:reject_if] = REJECT_ALL_BLANK_PROC if options[:reject_if] == :all_blank
61
61
 
62
62
  attr_names.each do |association_name|
63
- if reflection = reflect_on_association(association_name)
64
- reflection.options[:autosave] = true
65
- add_autosave_association_callbacks(reflection)
63
+ if reflection = _reflect_on_association(association_name)
64
+ reflection.autosave = true
65
+ define_autosave_association_callbacks(reflection)
66
66
  ## TODO this ought to work, but doesn't seem to do the class inheritance right
67
67
 
68
68
  nested_attributes_options = self.nested_attributes_options.dup
@@ -70,10 +70,8 @@ module ActiveFedora
70
70
  self.nested_attributes_options = nested_attributes_options
71
71
 
72
72
  type = (reflection.collection? ? :collection : :one_to_one)
73
+ generate_association_writer(association_name, type)
73
74
 
74
- # def pirate_attributes=(attributes)
75
- # assign_nested_attributes_for_one_to_one_association(:pirate, attributes)
76
- # end
77
75
  class_eval <<-eoruby, __FILE__, __LINE__ + 1
78
76
  remove_possible_method(:#{association_name}_attributes=)
79
77
 
@@ -83,6 +81,7 @@ module ActiveFedora
83
81
  eoruby
84
82
  elsif reflect_on_property(association_name)
85
83
  resource_class.accepts_nested_attributes_for(association_name, options)
84
+ generate_property_writer(association_name, type)
86
85
 
87
86
  # Delegate the setter to the resource.
88
87
  class_eval <<-eoruby, __FILE__, __LINE__ + 1
@@ -98,6 +97,53 @@ module ActiveFedora
98
97
  end
99
98
  end
100
99
  end
100
+
101
+ private
102
+
103
+ # Generates a writer method for this association. Serves as a point for
104
+ # accessing the objects in the association. For example, this method
105
+ # could generate the following:
106
+ #
107
+ # def pirate_attributes=(attributes)
108
+ # assign_nested_attributes_for_one_to_one_association(:pirate, attributes)
109
+ # end
110
+ #
111
+ # This redirects the attempts to write objects in an association through
112
+ # the helper methods defined below. Makes it seem like the nested
113
+ # associations are just regular associations.
114
+ def generate_association_writer(association_name, type)
115
+ generated_association_methods.module_eval <<-eoruby, __FILE__, __LINE__ + 1
116
+ if method_defined?(:#{association_name}_attributes=)
117
+ remove_method(:#{association_name}_attributes=)
118
+ end
119
+ def #{association_name}_attributes=(attributes)
120
+ assign_nested_attributes_for_#{type}_association(:#{association_name}, attributes)
121
+ end
122
+ eoruby
123
+ end
124
+
125
+ # Generates a writer method for this association. Serves as a point for
126
+ # accessing the objects in the association. For example, this method
127
+ # could generate the following:
128
+ #
129
+ # def pirate_attributes=(attributes)
130
+ # assign_nested_attributes_for_one_to_one_association(:pirate, attributes)
131
+ # end
132
+ #
133
+ # This redirects the attempts to write objects in an association through
134
+ # the helper methods defined below. Makes it seem like the nested
135
+ # associations are just regular associations.
136
+ def generate_property_writer(association_name, _type)
137
+ generated_association_methods.module_eval <<-eoruby, __FILE__, __LINE__ + 1
138
+ if method_defined?(:#{association_name}_attributes=)
139
+ remove_method(:#{association_name}_attributes=)
140
+ end
141
+ def #{association_name}_attributes=(attributes)
142
+ attribute_will_change!(:#{association_name})
143
+ resource.#{association_name}_attributes=(attributes)
144
+ end
145
+ eoruby
146
+ end
101
147
  end
102
148
 
103
149
  # Returns ActiveFedora::Base#marked_for_destruction? It's
@@ -115,13 +161,63 @@ module ActiveFedora
115
161
  # These hash keys are nested attributes implementation details.
116
162
  UNASSIGNABLE_KEYS = %w( id _destroy ).freeze
117
163
 
164
+ # Assigns the given attributes to the association.
165
+ #
166
+ # If an associated record does not yet exist, one will be instantiated. If
167
+ # an associated record already exists, the method's behavior depends on
168
+ # the value of the update_only option. If update_only is +false+ and the
169
+ # given attributes include an <tt>:id</tt> that matches the existing record's
170
+ # id, then the existing record will be modified. If no <tt>:id</tt> is provided
171
+ # it will be replaced with a new record. If update_only is +true+ the existing
172
+ # record will be modified regardless of whether an <tt>:id</tt> is provided.
173
+ #
174
+ # If the given attributes include a matching <tt>:id</tt> attribute, or
175
+ # update_only is true, and a <tt>:_destroy</tt> key set to a truthy value,
176
+ # then the existing record will be marked for destruction.
177
+ def assign_nested_attributes_for_one_to_one_association(association_name, attributes)
178
+ options = nested_attributes_options[association_name]
179
+
180
+ attributes = attributes.to_h if attributes.respond_to?(:permitted?)
181
+ attributes = attributes.with_indifferent_access
182
+ existing_record = send(association_name)
183
+
184
+ if (options[:update_only] || !attributes['id'].blank?) && existing_record &&
185
+ (options[:update_only] || existing_record.id.to_s == attributes['id'].to_s)
186
+ assign_to_or_mark_for_destruction(existing_record, attributes, options[:allow_destroy]) unless call_reject_if(association_name, attributes)
187
+
188
+ elsif attributes['id'].present?
189
+ raise_nested_attributes_record_not_found!(association_name, attributes['id'])
190
+
191
+ elsif !reject_new_record?(association_name, attributes)
192
+ assignable_attributes = attributes.except(*UNASSIGNABLE_KEYS)
193
+
194
+ if existing_record && existing_record.new_record?
195
+ existing_record.assign_attributes(assignable_attributes)
196
+ association(association_name).initialize_attributes(existing_record)
197
+ else
198
+ method = "build_#{association_name}"
199
+ if respond_to?(method)
200
+ send(method, assignable_attributes)
201
+ else
202
+ raise ArgumentError, "Cannot build association `#{association_name}'. Are you trying to build a polymorphic one-to-one association?"
203
+ end
204
+ end
205
+ end
206
+ end
207
+
118
208
  def assign_nested_attributes_for_collection_association(association_name, attributes_collection)
119
209
  options = nested_attributes_options[association_name]
120
210
 
121
- if options[:limit] && attributes_collection.size > options[:limit]
122
- raise TooManyRecords, "Maximum #{options[:limit]} records are allowed. Got #{attributes_collection.size} records instead."
211
+ if attributes_collection.respond_to?(:permitted?)
212
+ attributes_collection = attributes_collection.to_h
123
213
  end
124
214
 
215
+ unless attributes_collection.is_a?(Hash) || attributes_collection.is_a?(Array)
216
+ raise ArgumentError, "Hash or Array expected, got #{attributes_collection.class.name} (#{attributes_collection.inspect})"
217
+ end
218
+
219
+ check_record_limit!(options[:limit], attributes_collection)
220
+
125
221
  if attributes_collection.is_a? Hash
126
222
  keys = attributes_collection.keys
127
223
  attributes_collection = if keys.include?('id') || keys.include?(:id)
@@ -134,13 +230,14 @@ module ActiveFedora
134
230
  association = send(association_name)
135
231
 
136
232
  existing_records = if association.loaded?
137
- association.to_a
233
+ association.target
138
234
  else
139
235
  attribute_ids = attributes_collection.map { |a| a['id'] || a[:id] }.compact
140
236
  attribute_ids.present? ? association.to_a.select { |x| attribute_ids.include?(x.id) } : []
141
237
  end
142
238
 
143
239
  attributes_collection.each do |attributes|
240
+ attributes = attributes.to_h if attributes.respond_to?(:permitted)
144
241
  attributes = attributes.with_indifferent_access
145
242
 
146
243
  if attributes['id'].blank?
@@ -156,11 +253,31 @@ module ActiveFedora
156
253
  end
157
254
 
158
255
  else
159
- raise_nested_attributes_record_not_found(association_name, attributes['id'])
256
+ raise_nested_attributes_record_not_found!(association_name, attributes['id'])
160
257
  end
161
258
  end
162
259
  end
163
260
 
261
+ # Takes in a limit and checks if the attributes_collection has too many
262
+ # records. It accepts limit in the form of symbol, proc, or
263
+ # number-like object (anything that can be compared with an integer).
264
+ #
265
+ # Raises TooManyRecords error if the attributes_collection is
266
+ # larger than the limit.
267
+ def check_record_limit!(limit, attributes_collection)
268
+ return unless limit
269
+ limit = case limit
270
+ when Symbol
271
+ send(limit)
272
+ when Proc
273
+ limit.call
274
+ else
275
+ limit
276
+ end
277
+
278
+ raise TooManyRecords, "Maximum #{limit} records are allowed. Got #{attributes_collection.size} records instead." if limit && attributes_collection.size > limit
279
+ end
280
+
164
281
  # Updates a record with the +attributes+ or marks it for destruction if
165
282
  # +allow_destroy+ is +true+ and has_destroy_flag? returns +true+.
166
283
  def assign_to_or_mark_for_destruction(record, attributes, allow_destroy)
@@ -170,19 +287,14 @@ module ActiveFedora
170
287
 
171
288
  # Determines if a hash contains a truthy _destroy key.
172
289
  def has_destroy_flag?(hash)
173
- ["1", "true"].include?(hash['_destroy'].to_s)
290
+ Type::Boolean.new.cast(hash['_destroy'])
174
291
  end
175
292
 
176
293
  # Determines if a new record should be rejected by checking
177
294
  # has_destroy_flag? or if a <tt>:reject_if</tt> proc exists for this
178
295
  # association and evaluates to +true+.
179
296
  def reject_new_record?(association_name, attributes)
180
- has_destroy_flag?(attributes) || call_reject_if(association_name, attributes)
181
- end
182
-
183
- def raise_nested_attributes_record_not_found(association_name, record_id)
184
- reflection = self.class.reflect_on_association(association_name)
185
- raise ObjectNotFoundError, "Couldn't find #{reflection.klass.name} with ID=#{record_id} for #{self.class.name} with ID=#{id}"
297
+ will_be_destroyed?(association_name, attributes) || call_reject_if(association_name, attributes)
186
298
  end
187
299
 
188
300
  # Determines if a record with the particular +attributes+ should be
@@ -191,8 +303,9 @@ module ActiveFedora
191
303
  #
192
304
  # Returns false if there is a +destroy_flag+ on the attributes.
193
305
  def call_reject_if(association_name, attributes)
306
+ return false if will_be_destroyed?(association_name, attributes)
307
+
194
308
  opts = nested_attributes_options[association_name]
195
- return false if has_destroy_flag?(attributes) && opts[:allow_destroy]
196
309
  case callback = opts[:reject_if]
197
310
  when Symbol
198
311
  method(callback).arity == 0 ? send(callback) : send(callback, attributes)
@@ -200,5 +313,19 @@ module ActiveFedora
200
313
  callback.call(attributes)
201
314
  end
202
315
  end
316
+
317
+ # Only take into account the destroy flag if <tt>:allow_destroy</tt> is true
318
+ def will_be_destroyed?(association_name, attributes)
319
+ allow_destroy?(association_name) && has_destroy_flag?(attributes)
320
+ end
321
+
322
+ def allow_destroy?(association_name)
323
+ nested_attributes_options[association_name][:allow_destroy]
324
+ end
325
+
326
+ def raise_nested_attributes_record_not_found!(association_name, record_id)
327
+ reflection = self.class._reflect_on_association(association_name).klass.name
328
+ raise ObjectNotFoundError, "Couldn't find #{reflection.klass.name} with ID=#{record_id} for #{self.class.name} with ID=#{id}"
329
+ end
203
330
  end
204
331
  end
@@ -57,7 +57,7 @@ module ActiveFedora
57
57
  raise ObjectNotFoundError, "Unable to find #{id} in the repository"
58
58
  end
59
59
 
60
- ActiveFedora::SolrService.delete(id) if ENABLE_SOLR_UPDATES
60
+ ActiveFedora::SolrService.delete(id) if ActiveFedora.enable_solr_updates?
61
61
  self.class.eradicate(id) if opts[:eradicate]
62
62
  freeze
63
63
  end
@@ -14,6 +14,7 @@ module ActiveFedora
14
14
  end
15
15
 
16
16
  def self.find_graph_predicate(predicate)
17
+ Deprecation.warn("find_graph_predicate has been deprecated and will be removed in ActiveFedora 10.0")
17
18
  # TODO, these could be cached
18
19
  case predicate
19
20
  when :has_model, "hasModel", :hasModel
@@ -42,6 +43,7 @@ module ActiveFedora
42
43
  end
43
44
 
44
45
  def self.vocabularies(vocabs = {})
46
+ Deprecation.warn("vocabularies has been deprecated and will be removed in ActiveFedora 10.0")
45
47
  @vocabularies ||= vocabs
46
48
  predicate_mappings.keys.each do |ns|
47
49
  @vocabularies[ns] = ::RDF::Vocabulary.new(ns) unless @vocabularies.key? ns
@@ -75,6 +77,7 @@ module ActiveFedora
75
77
  end
76
78
 
77
79
  def self.predicate_namespaces
80
+ Deprecation.warn("predicate_namespaces has been deprecated and will be removed in ActiveFedora 10.0")
78
81
  predicate_config[:predicate_namespaces] ||= {}
79
82
  end
80
83
 
@@ -147,7 +147,7 @@ module ActiveFedora
147
147
  @fields.each do |field_key, field_info|
148
148
  things = send(field_key)
149
149
  next unless things
150
- field_symbol = ActiveFedora::SolrQueryBuilder.solr_name(field_key, type: field_info[:type])
150
+ field_symbol = ActiveFedora.index_field_mapper.solr_name(field_key, type: field_info[:type])
151
151
  things.val.each do |val|
152
152
  ::Solrizer::Extractor.insert_solr_field_value(solr_doc, field_symbol, val)
153
153
  end