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.
- checksums.yaml +4 -4
 - data/.rubocop.yml +4 -2
 - data/.travis.yml +2 -6
 - data/active-fedora.gemspec +9 -6
 - data/lib/active_fedora.rb +31 -15
 - data/lib/active_fedora/associations.rb +1 -1
 - data/lib/active_fedora/associations/association.rb +6 -2
 - data/lib/active_fedora/associations/belongs_to_association.rb +0 -10
 - data/lib/active_fedora/associations/builder/association.rb +85 -12
 - data/lib/active_fedora/associations/builder/belongs_to.rb +3 -1
 - data/lib/active_fedora/associations/builder/collection_association.rb +4 -3
 - data/lib/active_fedora/associations/builder/contains.rb +7 -2
 - data/lib/active_fedora/associations/builder/directly_contains.rb +7 -3
 - data/lib/active_fedora/associations/builder/directly_contains_one.rb +8 -4
 - data/lib/active_fedora/associations/builder/has_and_belongs_to_many.rb +6 -2
 - data/lib/active_fedora/associations/builder/has_many.rb +6 -2
 - data/lib/active_fedora/associations/builder/indirectly_contains.rb +7 -3
 - data/lib/active_fedora/associations/builder/property.rb +7 -2
 - data/lib/active_fedora/associations/builder/singular_association.rb +3 -1
 - data/lib/active_fedora/associations/builder/singular_property.rb +3 -1
 - data/lib/active_fedora/associations/collection_association.rb +9 -5
 - data/lib/active_fedora/associations/collection_proxy.rb +1 -1
 - data/lib/active_fedora/associations/contained_finder.rb +1 -2
 - data/lib/active_fedora/associations/directly_contains_one_association.rb +1 -1
 - data/lib/active_fedora/associations/has_many_association.rb +1 -5
 - data/lib/active_fedora/associations/rdf.rb +1 -20
 - data/lib/active_fedora/attached_files.rb +1 -1
 - data/lib/active_fedora/attribute_methods.rb +18 -0
 - data/lib/active_fedora/attributes.rb +1 -1
 - data/lib/active_fedora/autosave_association.rb +8 -12
 - data/lib/active_fedora/base.rb +0 -2
 - data/lib/active_fedora/caching_connection.rb +1 -1
 - data/lib/active_fedora/default_model_mapper.rb +24 -0
 - data/lib/active_fedora/fedora.rb +1 -1
 - data/lib/active_fedora/file/attributes.rb +4 -5
 - data/lib/active_fedora/identifiable.rb +5 -0
 - data/lib/active_fedora/indexing.rb +13 -7
 - data/lib/active_fedora/indexing_service.rb +4 -4
 - data/lib/active_fedora/ldp_resource.rb +1 -0
 - data/lib/active_fedora/model.rb +18 -16
 - data/lib/active_fedora/model_classifier.rb +77 -0
 - data/lib/active_fedora/nested_attributes.rb +145 -18
 - data/lib/active_fedora/persistence.rb +1 -1
 - data/lib/active_fedora/predicates.rb +3 -0
 - data/lib/active_fedora/qualified_dublin_core_datastream.rb +1 -1
 - data/lib/active_fedora/query_result_builder.rb +12 -28
 - data/lib/active_fedora/querying.rb +1 -1
 - data/lib/active_fedora/rdf/datastream_indexing.rb +1 -1
 - data/lib/active_fedora/reflection.rb +15 -7
 - data/lib/active_fedora/relation.rb +17 -0
 - data/lib/active_fedora/relation/calculations.rb +1 -5
 - data/lib/active_fedora/relation/finder_methods.rb +39 -26
 - data/lib/active_fedora/scoping.rb +5 -0
 - data/lib/active_fedora/scoping/default.rb +113 -0
 - data/lib/active_fedora/scoping/named.rb +11 -3
 - data/lib/active_fedora/simple_datastream.rb +1 -1
 - data/lib/active_fedora/solr_hit.rb +71 -0
 - data/lib/active_fedora/solr_instance_loader.rb +12 -36
 - data/lib/active_fedora/solr_query_builder.rb +20 -25
 - data/lib/active_fedora/solr_service.rb +24 -13
 - data/lib/active_fedora/type.rb +8 -0
 - data/lib/active_fedora/type/boolean.rb +23 -0
 - data/lib/active_fedora/type/value.rb +118 -0
 - data/lib/active_fedora/validations.rb +14 -5
 - data/lib/active_fedora/version.rb +1 -1
 - data/lib/active_fedora/versionable.rb +8 -7
 - data/spec/config_helper.rb +0 -5
 - data/spec/integration/associations_spec.rb +5 -5
 - data/spec/integration/base_spec.rb +4 -4
 - data/spec/integration/bug_spec.rb +0 -1
 - data/spec/integration/full_featured_model_spec.rb +4 -4
 - data/spec/integration/has_and_belongs_to_many_associations_spec.rb +1 -1
 - data/spec/integration/has_many_associations_spec.rb +30 -1
 - data/spec/integration/indirect_container_spec.rb +1 -1
 - data/spec/integration/nested_attribute_spec.rb +6 -0
 - data/spec/integration/ntriples_datastream_spec.rb +4 -4
 - data/spec/integration/om_datastream_spec.rb +1 -1
 - data/spec/integration/relation_delegation_spec.rb +1 -1
 - data/spec/integration/scoped_query_spec.rb +12 -12
 - data/spec/integration/solr_hit_spec.rb +52 -0
 - data/spec/samples/hydra-mods_article_datastream.rb +2 -2
 - data/spec/spec_helper.rb +5 -9
 - data/spec/unit/active_fedora_spec.rb +0 -26
 - data/spec/unit/base_spec.rb +20 -0
 - data/spec/unit/builder/has_and_belongs_to_many_spec.rb +2 -3
 - data/spec/unit/callback_spec.rb +3 -8
 - data/spec/unit/default_model_mapper_spec.rb +39 -0
 - data/spec/unit/finder_methods_spec.rb +30 -6
 - data/spec/unit/has_many_association_spec.rb +23 -1
 - data/spec/unit/indexing_spec.rb +17 -3
 - data/spec/unit/model_classifier_spec.rb +49 -0
 - data/spec/unit/model_spec.rb +0 -9
 - data/spec/unit/ntriples_datastream_spec.rb +16 -16
 - data/spec/unit/om_datastream_spec.rb +7 -7
 - data/spec/unit/qualified_dublin_core_datastream_spec.rb +1 -1
 - data/spec/unit/query_result_builder_spec.rb +4 -10
 - data/spec/unit/query_spec.rb +28 -28
 - data/spec/unit/rdf/indexing_service_spec.rb +16 -16
 - data/spec/unit/scoping_spec.rb +67 -0
 - data/spec/unit/simple_datastream_spec.rb +2 -2
 - data/spec/unit/solr_config_options_spec.rb +29 -32
 - data/spec/unit/solr_hit_spec.rb +58 -0
 - data/spec/unit/solr_query_builder_spec.rb +9 -1
 - data/spec/unit/solr_service_spec.rb +19 -3
 - metadata +73 -17
 - data/spec/support/freeze_mocks.rb +0 -12
 
| 
         @@ -1,8 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module ActiveFedora::Associations::Builder
         
     | 
| 
       2 
2 
     | 
    
         
             
              class DirectlyContainsOne < SingularAssociation #:nodoc:
         
     | 
| 
       3 
     | 
    
         
            -
                self.macro 
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
                 
     | 
| 
      
 3 
     | 
    
         
            +
                def self.macro
         
     | 
| 
      
 4 
     | 
    
         
            +
                  :directly_contains_one
         
     | 
| 
      
 5 
     | 
    
         
            +
                end
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                def self.valid_options(options)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  super + [:has_member_relation, :is_member_of_relation, :type, :through] - [:predicate]
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
       6 
10 
     | 
    
         | 
| 
       7 
11 
     | 
    
         
             
                def validate_options
         
     | 
| 
       8 
12 
     | 
    
         
             
                  raise ArgumentError, "you must specify a :through option on #{name}.  #{name} will use the container from that directly_contains association." unless options[:through]
         
     | 
| 
         @@ -34,7 +38,7 @@ module ActiveFedora::Associations::Builder 
     | 
|
| 
       34 
38 
     | 
    
         
             
                  end
         
     | 
| 
       35 
39 
     | 
    
         | 
| 
       36 
40 
     | 
    
         
             
                  def lookup_reflection(association_name)
         
     | 
| 
       37 
     | 
    
         
            -
                    model. 
     | 
| 
      
 41 
     | 
    
         
            +
                    model._reflect_on_association(association_name)
         
     | 
| 
       38 
42 
     | 
    
         
             
                  end
         
     | 
| 
       39 
43 
     | 
    
         
             
              end
         
     | 
| 
       40 
44 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,9 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module ActiveFedora::Associations::Builder
         
     | 
| 
       2 
2 
     | 
    
         
             
              class HasAndBelongsToMany < CollectionAssociation #:nodoc:
         
     | 
| 
       3 
3 
     | 
    
         
             
                extend Deprecation
         
     | 
| 
       4 
     | 
    
         
            -
                self.macro 
     | 
| 
      
 4 
     | 
    
         
            +
                def self.macro
         
     | 
| 
      
 5 
     | 
    
         
            +
                  :has_and_belongs_to_many
         
     | 
| 
      
 6 
     | 
    
         
            +
                end
         
     | 
| 
       5 
7 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
                self.valid_options 
     | 
| 
      
 8 
     | 
    
         
            +
                def self.valid_options(options)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  super + [:inverse_of, :solr_page_size]
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
       7 
11 
     | 
    
         | 
| 
       8 
12 
     | 
    
         
             
                def validate_options
         
     | 
| 
       9 
13 
     | 
    
         
             
                  super
         
     | 
| 
         @@ -1,8 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module ActiveFedora::Associations::Builder
         
     | 
| 
       2 
2 
     | 
    
         
             
              class HasMany < CollectionAssociation #:nodoc:
         
     | 
| 
       3 
     | 
    
         
            -
                self.macro 
     | 
| 
      
 3 
     | 
    
         
            +
                def self.macro
         
     | 
| 
      
 4 
     | 
    
         
            +
                  :has_many
         
     | 
| 
      
 5 
     | 
    
         
            +
                end
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
                self.valid_options 
     | 
| 
      
 7 
     | 
    
         
            +
                def self.valid_options(options)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  super + [:as, :dependent, :inverse_of]
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
       6 
10 
     | 
    
         | 
| 
       7 
11 
     | 
    
         
             
                def build
         
     | 
| 
       8 
12 
     | 
    
         
             
                  reflection = super
         
     | 
| 
         @@ -1,8 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module ActiveFedora::Associations::Builder
         
     | 
| 
       2 
2 
     | 
    
         
             
              class IndirectlyContains < CollectionAssociation #:nodoc:
         
     | 
| 
       3 
     | 
    
         
            -
                self.macro 
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
                 
     | 
| 
      
 3 
     | 
    
         
            +
                def self.macro
         
     | 
| 
      
 4 
     | 
    
         
            +
                  :indirectly_contains
         
     | 
| 
      
 5 
     | 
    
         
            +
                end
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                def self.valid_options(options)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  super + [:has_member_relation, :is_member_of_relation, :inserted_content_relation, :foreign_key, :through] - [:predicate]
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
       6 
10 
     | 
    
         | 
| 
       7 
11 
     | 
    
         
             
                def build
         
     | 
| 
       8 
12 
     | 
    
         
             
                  reflection = super
         
     | 
| 
         @@ -1,7 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module ActiveFedora::Associations::Builder
         
     | 
| 
       2 
2 
     | 
    
         
             
              class Property < Association
         
     | 
| 
       3 
     | 
    
         
            -
                self.macro 
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
      
 3 
     | 
    
         
            +
                def self.macro
         
     | 
| 
      
 4 
     | 
    
         
            +
                  :rdf
         
     | 
| 
      
 5 
     | 
    
         
            +
                end
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                def self.valid_options(options)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  super
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
       5 
10 
     | 
    
         | 
| 
       6 
11 
     | 
    
         
             
                def initialize(model, name, options)
         
     | 
| 
       7 
12 
     | 
    
         
             
                  super
         
     | 
| 
         @@ -14,7 +14,13 @@ module ActiveFedora 
     | 
|
| 
       14 
14 
     | 
    
         
             
                      force_reload = opts
         
     | 
| 
       15 
15 
     | 
    
         
             
                    end
         
     | 
| 
       16 
16 
     | 
    
         
             
                    reload if force_reload || stale_target?
         
     | 
| 
       17 
     | 
    
         
            -
                     
     | 
| 
      
 17 
     | 
    
         
            +
                    if null_scope?
         
     | 
| 
      
 18 
     | 
    
         
            +
                      # Cache the proxy separately before the owner has an id
         
     | 
| 
      
 19 
     | 
    
         
            +
                      # or else a post-save proxy will still lack the id
         
     | 
| 
      
 20 
     | 
    
         
            +
                      @null_proxy ||= CollectionProxy.new(self)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    else
         
     | 
| 
      
 22 
     | 
    
         
            +
                      @proxy ||= CollectionProxy.new(self)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    end
         
     | 
| 
       18 
24 
     | 
    
         
             
                  end
         
     | 
| 
       19 
25 
     | 
    
         | 
| 
       20 
26 
     | 
    
         
             
                  # Implements the writer method, e.g. foo.items= for Foo.has_many :items
         
     | 
| 
         @@ -27,9 +33,7 @@ module ActiveFedora 
     | 
|
| 
       27 
33 
     | 
    
         
             
                    if loaded?
         
     | 
| 
       28 
34 
     | 
    
         
             
                      load_target.map(&:id)
         
     | 
| 
       29 
35 
     | 
    
         
             
                    else
         
     | 
| 
       30 
     | 
    
         
            -
                      load_from_solr.map 
     | 
| 
       31 
     | 
    
         
            -
                        solr_record['id']
         
     | 
| 
       32 
     | 
    
         
            -
                      end
         
     | 
| 
      
 36 
     | 
    
         
            +
                      load_from_solr.map(&:id)
         
     | 
| 
       33 
37 
     | 
    
         
             
                    end
         
     | 
| 
       34 
38 
     | 
    
         
             
                  end
         
     | 
| 
       35 
39 
     | 
    
         | 
| 
         @@ -225,7 +229,7 @@ module ActiveFedora 
     | 
|
| 
       225 
229 
     | 
    
         
             
                  # Count all records using solr. Construct options and pass them with
         
     | 
| 
       226 
230 
     | 
    
         
             
                  # scope to the target class's +count+.
         
     | 
| 
       227 
231 
     | 
    
         
             
                  def count(_options = {})
         
     | 
| 
       228 
     | 
    
         
            -
                     
     | 
| 
      
 232 
     | 
    
         
            +
                    scope.count
         
     | 
| 
       229 
233 
     | 
    
         
             
                  end
         
     | 
| 
       230 
234 
     | 
    
         | 
| 
       231 
235 
     | 
    
         
             
                  # Sets the target of this proxy to <tt>\target</tt>, and the \loaded flag to +true+.
         
     | 
| 
         @@ -42,8 +42,7 @@ module ActiveFedora::Associations 
     | 
|
| 
       42 
42 
     | 
    
         
             
                    query = ActiveFedora::SolrQueryBuilder.construct_query_for_rel(
         
     | 
| 
       43 
43 
     | 
    
         
             
                      [[:has_model, proxy_class.to_class_uri], [:proxyFor, record.id]]
         
     | 
| 
       44 
44 
     | 
    
         
             
                    )
         
     | 
| 
       45 
     | 
    
         
            -
                     
     | 
| 
       46 
     | 
    
         
            -
                    results.map { |res| ::RDF::URI(ActiveFedora::Base.id_to_uri(res['id'])) }
         
     | 
| 
      
 45 
     | 
    
         
            +
                    ActiveFedora::SolrService.query(query, fl: 'id').map(&:rdf_uri)
         
     | 
| 
       47 
46 
     | 
    
         
             
                  end
         
     | 
| 
       48 
47 
     | 
    
         
             
              end
         
     | 
| 
       49 
48 
     | 
    
         
             
            end
         
     | 
| 
         @@ -66,7 +66,7 @@ module ActiveFedora 
     | 
|
| 
       66 
66 
     | 
    
         | 
| 
       67 
67 
     | 
    
         
             
                    # Returns the Reflection corresponding to the direct container association that's being filtered
         
     | 
| 
       68 
68 
     | 
    
         
             
                    def container_reflection
         
     | 
| 
       69 
     | 
    
         
            -
                      @container_reflection ||= @owner.class. 
     | 
| 
      
 69 
     | 
    
         
            +
                      @container_reflection ||= @owner.class._reflect_on_association(@reflection.options[:through])
         
     | 
| 
       70 
70 
     | 
    
         
             
                    end
         
     | 
| 
       71 
71 
     | 
    
         | 
| 
       72 
72 
     | 
    
         
             
                    # Returns the DirectContainerAssociation corresponding to the direct container that's being filtered
         
     | 
| 
         @@ -14,11 +14,7 @@ module ActiveFedora 
     | 
|
| 
       14 
14 
     | 
    
         
             
                  # If the collection is empty the target is set to an empty array and
         
     | 
| 
       15 
15 
     | 
    
         
             
                  # the loaded flag is set to true as well.
         
     | 
| 
       16 
16 
     | 
    
         
             
                  def count_records
         
     | 
| 
       17 
     | 
    
         
            -
                    count =  
     | 
| 
       18 
     | 
    
         
            -
                              @target.size
         
     | 
| 
       19 
     | 
    
         
            -
                            else
         
     | 
| 
       20 
     | 
    
         
            -
                              @reflection.klass.count(conditions: construct_query)
         
     | 
| 
       21 
     | 
    
         
            -
                            end
         
     | 
| 
      
 17 
     | 
    
         
            +
                    count = scope.count
         
     | 
| 
       22 
18 
     | 
    
         | 
| 
       23 
19 
     | 
    
         
             
                    # If there's nothing in the database and @target has no new records
         
     | 
| 
       24 
20 
     | 
    
         
             
                    # we are certain the current target is an empty array. This is a
         
     | 
| 
         @@ -60,26 +60,7 @@ module ActiveFedora 
     | 
|
| 
       60 
60 
     | 
    
         
             
                      ids = candidate_uris.map { |uri| ActiveFedora::Base.uri_to_id(uri) }
         
     | 
| 
       61 
61 
     | 
    
         
             
                      results = ActiveFedora::SolrService.query(ActiveFedora::SolrQueryBuilder.construct_query_for_ids(ids), rows: 10_000)
         
     | 
| 
       62 
62 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
                       
     | 
| 
       64 
     | 
    
         
            -
                        ActiveFedora::QueryResultBuilder.classes_from_solr_document(result).any? do |klass|
         
     | 
| 
       65 
     | 
    
         
            -
                          class_ancestors(klass).include? reflection.klass
         
     | 
| 
       66 
     | 
    
         
            -
                        end
         
     | 
| 
       67 
     | 
    
         
            -
                      end
         
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
                      docs.map { |doc| ::RDF::URI.new(ActiveFedora::Base.id_to_uri(doc['id'])) }
         
     | 
| 
       70 
     | 
    
         
            -
                    end
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
                    ##
         
     | 
| 
       73 
     | 
    
         
            -
                    # Returns a list of all the ancestor classes up to ActiveFedora::Base including the class itself
         
     | 
| 
       74 
     | 
    
         
            -
                    # @param [Class] klass
         
     | 
| 
       75 
     | 
    
         
            -
                    # @return [Array<Class>]
         
     | 
| 
       76 
     | 
    
         
            -
                    # @example
         
     | 
| 
       77 
     | 
    
         
            -
                    #   class Car < ActiveFedora::Base; end
         
     | 
| 
       78 
     | 
    
         
            -
                    #   class SuperCar < Car; end
         
     | 
| 
       79 
     | 
    
         
            -
                    #   class_ancestors(SuperCar)
         
     | 
| 
       80 
     | 
    
         
            -
                    #   # => [SuperCar, Car, ActiveFedora::Base]
         
     | 
| 
       81 
     | 
    
         
            -
                    def class_ancestors(klass)
         
     | 
| 
       82 
     | 
    
         
            -
                      klass.ancestors.select { |k| k.instance_of?(Class) } - [Object, BasicObject]
         
     | 
| 
      
 63 
     | 
    
         
            +
                      results.select { |result| result.model? reflection.klass }.map(&:rdf_uri)
         
     | 
| 
       83 
64 
     | 
    
         
             
                    end
         
     | 
| 
       84 
65 
     | 
    
         
             
                end
         
     | 
| 
       85 
66 
     | 
    
         
             
              end
         
     | 
| 
         @@ -49,7 +49,7 @@ module ActiveFedora 
     | 
|
| 
       49 
49 
     | 
    
         
             
                deprecation_deprecate :clear_datastreams
         
     | 
| 
       50 
50 
     | 
    
         | 
| 
       51 
51 
     | 
    
         
             
                def contains_assertions
         
     | 
| 
       52 
     | 
    
         
            -
                  resource.query(subject: resource, predicate:  
     | 
| 
      
 52 
     | 
    
         
            +
                  resource.query(subject: resource, predicate: ::RDF::Vocab::LDP.contains).objects.map(&:to_s)
         
     | 
| 
       53 
53 
     | 
    
         
             
                end
         
     | 
| 
       54 
54 
     | 
    
         | 
| 
       55 
55 
     | 
    
         
             
                def load_attached_files
         
     | 
| 
         @@ -110,6 +110,24 @@ module ActiveFedora 
     | 
|
| 
       110 
110 
     | 
    
         
             
                    include @generated_attribute_methods
         
     | 
| 
       111 
111 
     | 
    
         
             
                  end
         
     | 
| 
       112 
112 
     | 
    
         | 
| 
      
 113 
     | 
    
         
            +
                  # A method name is 'dangerous' if it is already (re)defined by Active Fedora, but
         
     | 
| 
      
 114 
     | 
    
         
            +
                  # not by any ancestors. (So 'puts' is not dangerous but 'save' is.)
         
     | 
| 
      
 115 
     | 
    
         
            +
                  def dangerous_attribute_method?(name) # :nodoc:
         
     | 
| 
      
 116 
     | 
    
         
            +
                    method_defined_within?(name, Base)
         
     | 
| 
      
 117 
     | 
    
         
            +
                  end
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
                  def method_defined_within?(name, klass, superklass = klass.superclass) # :nodoc:
         
     | 
| 
      
 120 
     | 
    
         
            +
                    if klass.method_defined?(name) || klass.private_method_defined?(name)
         
     | 
| 
      
 121 
     | 
    
         
            +
                      if superklass.method_defined?(name) || superklass.private_method_defined?(name)
         
     | 
| 
      
 122 
     | 
    
         
            +
                        klass.instance_method(name).owner != superklass.instance_method(name).owner
         
     | 
| 
      
 123 
     | 
    
         
            +
                      else
         
     | 
| 
      
 124 
     | 
    
         
            +
                        true
         
     | 
| 
      
 125 
     | 
    
         
            +
                      end
         
     | 
| 
      
 126 
     | 
    
         
            +
                    else
         
     | 
| 
      
 127 
     | 
    
         
            +
                      false
         
     | 
| 
      
 128 
     | 
    
         
            +
                    end
         
     | 
| 
      
 129 
     | 
    
         
            +
                  end
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
       113 
131 
     | 
    
         
             
                  private
         
     | 
| 
       114 
132 
     | 
    
         | 
| 
       115 
133 
     | 
    
         
             
                    # @param name [Symbol] name of the attribute to generate
         
     | 
| 
         @@ -239,7 +239,7 @@ module ActiveFedora 
     | 
|
| 
       239 
239 
     | 
    
         
             
                      # @param [String] dsid the datastream id
         
     | 
| 
       240 
240 
     | 
    
         
             
                      # @return [Class] the class of the datastream
         
     | 
| 
       241 
241 
     | 
    
         
             
                      def datastream_class_for_name(dsid)
         
     | 
| 
       242 
     | 
    
         
            -
                        reflection =  
     | 
| 
      
 242 
     | 
    
         
            +
                        reflection = _reflect_on_association(dsid.to_sym)
         
     | 
| 
       243 
243 
     | 
    
         
             
                        reflection ? reflection.klass : ActiveFedora::File
         
     | 
| 
       244 
244 
     | 
    
         
             
                      end
         
     | 
| 
       245 
245 
     | 
    
         | 
| 
         @@ -75,24 +75,20 @@ module ActiveFedora 
     | 
|
| 
       75 
75 
     | 
    
         
             
              module AutosaveAssociation
         
     | 
| 
       76 
76 
     | 
    
         
             
                extend ActiveSupport::Concern
         
     | 
| 
       77 
77 
     | 
    
         | 
| 
       78 
     | 
    
         
            -
                ASSOCIATION_TYPES =  
     | 
| 
      
 78 
     | 
    
         
            +
                ASSOCIATION_TYPES = [:has_many, :belongs_to, :has_and_belongs_to_many, :directly_contains, :indirectly_contains].freeze
         
     | 
| 
       79 
79 
     | 
    
         | 
| 
       80 
80 
     | 
    
         
             
                module AssociationBuilderExtension #:nodoc:
         
     | 
| 
       81 
     | 
    
         
            -
                  def self. 
     | 
| 
       82 
     | 
    
         
            -
                     
     | 
| 
      
 81 
     | 
    
         
            +
                  def self.valid_options
         
     | 
| 
      
 82 
     | 
    
         
            +
                    [:autosave]
         
     | 
| 
       83 
83 
     | 
    
         
             
                  end
         
     | 
| 
       84 
84 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
                  def build
         
     | 
| 
       86 
     | 
    
         
            -
                    reflection  
     | 
| 
       87 
     | 
    
         
            -
                    model.send(:add_autosave_association_callbacks, reflection)
         
     | 
| 
       88 
     | 
    
         
            -
                    reflection
         
     | 
| 
      
 85 
     | 
    
         
            +
                  def self.build(model, reflection)
         
     | 
| 
      
 86 
     | 
    
         
            +
                    model.send(:define_autosave_association_callbacks, reflection) if ASSOCIATION_TYPES.include? reflection.macro
         
     | 
| 
       89 
87 
     | 
    
         
             
                  end
         
     | 
| 
       90 
88 
     | 
    
         
             
                end
         
     | 
| 
       91 
89 
     | 
    
         | 
| 
       92 
90 
     | 
    
         
             
                included do
         
     | 
| 
       93 
     | 
    
         
            -
                   
     | 
| 
       94 
     | 
    
         
            -
                    Associations::Builder.const_get(type).send(:include, AssociationBuilderExtension)
         
     | 
| 
       95 
     | 
    
         
            -
                  end
         
     | 
| 
      
 91 
     | 
    
         
            +
                  Associations::Builder::Association.extensions << AssociationBuilderExtension
         
     | 
| 
       96 
92 
     | 
    
         
             
                end
         
     | 
| 
       97 
93 
     | 
    
         | 
| 
       98 
94 
     | 
    
         
             
                module ClassMethods
         
     | 
| 
         @@ -127,7 +123,7 @@ module ActiveFedora 
     | 
|
| 
       127 
123 
     | 
    
         
             
                    # the callbacks to get defined multiple times, there are guards that
         
     | 
| 
       128 
124 
     | 
    
         
             
                    # check if the save or validation methods have already been defined
         
     | 
| 
       129 
125 
     | 
    
         
             
                    # before actually defining them.
         
     | 
| 
       130 
     | 
    
         
            -
                    def  
     | 
| 
      
 126 
     | 
    
         
            +
                    def define_autosave_association_callbacks(reflection)
         
     | 
| 
       131 
127 
     | 
    
         
             
                      save_method = :"autosave_associated_records_for_#{reflection.name}"
         
     | 
| 
       132 
128 
     | 
    
         
             
                      validation_method = :"validate_associated_records_for_#{reflection.name}"
         
     | 
| 
       133 
129 
     | 
    
         
             
                      collection = reflection.collection?
         
     | 
| 
         @@ -287,7 +283,7 @@ module ActiveFedora 
     | 
|
| 
       287 
283 
     | 
    
         
             
                      end
         
     | 
| 
       288 
284 
     | 
    
         | 
| 
       289 
285 
     | 
    
         
             
                      # reconstruct the scope now that we know the owner's id
         
     | 
| 
       290 
     | 
    
         
            -
                      association.send(: 
     | 
| 
      
 286 
     | 
    
         
            +
                      association.send(:reset_scope) if association.respond_to?(:reset_scope)
         
     | 
| 
       291 
287 
     | 
    
         
             
                    end
         
     | 
| 
       292 
288 
     | 
    
         
             
                  end
         
     | 
| 
       293 
289 
     | 
    
         | 
    
        data/lib/active_fedora/base.rb
    CHANGED
    
    | 
         @@ -1,5 +1,3 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            SOLR_DOCUMENT_ID = "id".freeze unless defined?(SOLR_DOCUMENT_ID) && !SOLR_DOCUMENT_ID.nil?
         
     | 
| 
       2 
     | 
    
         
            -
            ENABLE_SOLR_UPDATES = true unless defined?(ENABLE_SOLR_UPDATES)
         
     | 
| 
       3 
1 
     | 
    
         
             
            require 'active_support/descendants_tracker'
         
     | 
| 
       4 
2 
     | 
    
         
             
            require 'active_fedora/errors'
         
     | 
| 
       5 
3 
     | 
    
         
             
            require 'active_fedora/log_subscriber'
         
     | 
| 
         @@ -0,0 +1,24 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ActiveFedora
         
     | 
| 
      
 2 
     | 
    
         
            +
              # Create model classifiers for resources or solr documents
         
     | 
| 
      
 3 
     | 
    
         
            +
              class DefaultModelMapper
         
     | 
| 
      
 4 
     | 
    
         
            +
                attr_reader :classifier_class, :solr_field, :predicate
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                def initialize(classifier_class: ActiveFedora::ModelClassifier, solr_field: ActiveFedora::QueryResultBuilder::HAS_MODEL_SOLR_FIELD, predicate: ActiveFedora::RDF::Fcrepo::Model.hasModel)
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @classifier_class = classifier_class
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @solr_field = solr_field
         
     | 
| 
      
 9 
     | 
    
         
            +
                  @predicate = predicate
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                def classifier(resource)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  models = if resource.respond_to? :graph
         
     | 
| 
      
 14 
     | 
    
         
            +
                             resource.graph.query([nil, predicate, nil]).map { |rg| rg.object.to_s }
         
     | 
| 
      
 15 
     | 
    
         
            +
                           elsif resource.respond_to? :[]
         
     | 
| 
      
 16 
     | 
    
         
            +
                             resource[solr_field] || []
         
     | 
| 
      
 17 
     | 
    
         
            +
                           else
         
     | 
| 
      
 18 
     | 
    
         
            +
                             []
         
     | 
| 
      
 19 
     | 
    
         
            +
                           end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  classifier_class.new(models)
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
              end
         
     | 
| 
      
 24 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/active_fedora/fedora.rb
    CHANGED
    
    | 
         @@ -30,7 +30,7 @@ module ActiveFedora 
     | 
|
| 
       30 
30 
     | 
    
         
             
                  # things like ldp:IndirectContainers, but it's imposes a significant
         
     | 
| 
       31 
31 
     | 
    
         
             
                  # performance penalty on every request
         
     | 
| 
       32 
32 
     | 
    
         
             
                  #   @connection ||= InboundRelationConnection.new(CachingConnection.new(authorized_connection))
         
     | 
| 
       33 
     | 
    
         
            -
                  @connection ||= CachingConnection.new(authorized_connection)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  @connection ||= CachingConnection.new(authorized_connection, omit_ldpr_interaction_model: true)
         
     | 
| 
       34 
34 
     | 
    
         
             
                end
         
     | 
| 
       35 
35 
     | 
    
         | 
| 
       36 
36 
     | 
    
         
             
                def clean_connection
         
     | 
| 
         @@ -21,7 +21,7 @@ module ActiveFedora::File::Attributes 
     | 
|
| 
       21 
21 
     | 
    
         
             
              end
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
              def persisted_size
         
     | 
| 
       24 
     | 
    
         
            -
                ldp_source.head. 
     | 
| 
      
 24 
     | 
    
         
            +
                ldp_source.head.content_length unless new_record?
         
     | 
| 
       25 
25 
     | 
    
         
             
              end
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
              def dirty_size
         
     | 
| 
         @@ -60,7 +60,7 @@ module ActiveFedora::File::Attributes 
     | 
|
| 
       60 
60 
     | 
    
         
             
                end
         
     | 
| 
       61 
61 
     | 
    
         | 
| 
       62 
62 
     | 
    
         
             
                def links
         
     | 
| 
       63 
     | 
    
         
            -
                  @links ||=  
     | 
| 
      
 63 
     | 
    
         
            +
                  @links ||= ldp_source.head.links
         
     | 
| 
       64 
64 
     | 
    
         
             
                end
         
     | 
| 
       65 
65 
     | 
    
         | 
| 
       66 
66 
     | 
    
         
             
                def default_mime_type
         
     | 
| 
         @@ -69,12 +69,11 @@ module ActiveFedora::File::Attributes 
     | 
|
| 
       69 
69 
     | 
    
         | 
| 
       70 
70 
     | 
    
         
             
                def fetch_mime_type
         
     | 
| 
       71 
71 
     | 
    
         
             
                  return default_mime_type if new_record?
         
     | 
| 
       72 
     | 
    
         
            -
                  ldp_source.head. 
     | 
| 
      
 72 
     | 
    
         
            +
                  ldp_source.head.content_type
         
     | 
| 
       73 
73 
     | 
    
         
             
                end
         
     | 
| 
       74 
74 
     | 
    
         | 
| 
       75 
75 
     | 
    
         
             
                def fetch_original_name
         
     | 
| 
       76 
76 
     | 
    
         
             
                  return if new_record?
         
     | 
| 
       77 
     | 
    
         
            -
                   
     | 
| 
       78 
     | 
    
         
            -
                  URI.decode(m[:filename])
         
     | 
| 
      
 77 
     | 
    
         
            +
                  ldp_source.head.content_disposition_filename
         
     | 
| 
       79 
78 
     | 
    
         
             
                end
         
     | 
| 
       80 
79 
     | 
    
         
             
            end
         
     | 
| 
         @@ -15,6 +15,16 @@ module ActiveFedora 
     | 
|
| 
       15 
15 
     | 
    
         
             
                  autoload :Map
         
     | 
| 
       16 
16 
     | 
    
         
             
                end
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
      
 18 
     | 
    
         
            +
                included do
         
     | 
| 
      
 19 
     | 
    
         
            +
                  # Because the previous method of setting indexer was to override
         
     | 
| 
      
 20 
     | 
    
         
            +
                  # the class method, we must ensure that we aren't using the instance
         
     | 
| 
      
 21 
     | 
    
         
            +
                  # reader so that the old method still works.
         
     | 
| 
      
 22 
     | 
    
         
            +
                  class_attribute :indexer, instance_accessor: false
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                  # This is the default indexer class to use for this model.
         
     | 
| 
      
 25 
     | 
    
         
            +
                  self.indexer = IndexingService
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
       18 
28 
     | 
    
         
             
                # Return a Hash representation of this object where keys in the hash are appropriate Solr field names.
         
     | 
| 
       19 
29 
     | 
    
         
             
                # @param [Hash] _solr_doc (optional) Hash to insert the fields into
         
     | 
| 
       20 
30 
     | 
    
         
             
                # @param [Hash] _opts (optional)
         
     | 
| 
         @@ -37,13 +47,13 @@ module ActiveFedora 
     | 
|
| 
       37 
47 
     | 
    
         
             
                  # Determines whether a create operation causes a solr index of this object by default.
         
     | 
| 
       38 
48 
     | 
    
         
             
                  # Override this if you need different behavior.
         
     | 
| 
       39 
49 
     | 
    
         
             
                  def create_needs_index?
         
     | 
| 
       40 
     | 
    
         
            -
                     
     | 
| 
      
 50 
     | 
    
         
            +
                    ActiveFedora.enable_solr_updates?
         
     | 
| 
       41 
51 
     | 
    
         
             
                  end
         
     | 
| 
       42 
52 
     | 
    
         | 
| 
       43 
53 
     | 
    
         
             
                  # Determines whether an update operation causes a solr index of this object by default.
         
     | 
| 
       44 
54 
     | 
    
         
             
                  # Override this if you need different behavior
         
     | 
| 
       45 
55 
     | 
    
         
             
                  def update_needs_index?
         
     | 
| 
       46 
     | 
    
         
            -
                     
     | 
| 
      
 56 
     | 
    
         
            +
                    ActiveFedora.enable_solr_updates?
         
     | 
| 
       47 
57 
     | 
    
         
             
                  end
         
     | 
| 
       48 
58 
     | 
    
         | 
| 
       49 
59 
     | 
    
         
             
                private
         
     | 
| 
         @@ -72,10 +82,6 @@ module ActiveFedora 
     | 
|
| 
       72 
82 
     | 
    
         
             
                                        end
         
     | 
| 
       73 
83 
     | 
    
         
             
                    end
         
     | 
| 
       74 
84 
     | 
    
         | 
| 
       75 
     | 
    
         
            -
                    def indexer
         
     | 
| 
       76 
     | 
    
         
            -
                      IndexingService
         
     | 
| 
       77 
     | 
    
         
            -
                    end
         
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
85 
     | 
    
         
             
                    def reindex_everything
         
     | 
| 
       80 
86 
     | 
    
         
             
                      descendants = descendant_uris(ActiveFedora::Base.id_to_uri(''))
         
     | 
| 
       81 
87 
     | 
    
         
             
                      descendants.shift # Discard the root uri
         
     | 
| 
         @@ -104,7 +110,7 @@ module ActiveFedora 
     | 
|
| 
       104 
110 
     | 
    
         
             
                      resource = Ldp::Resource::RdfSource.new(ActiveFedora.fedora.connection, uri)
         
     | 
| 
       105 
111 
     | 
    
         
             
                      # GET could be slow if it's a big resource, we're using HEAD to avoid this problem,
         
     | 
| 
       106 
112 
     | 
    
         
             
                      # but this causes more requests to Fedora.
         
     | 
| 
       107 
     | 
    
         
            -
                      return [] unless  
     | 
| 
      
 113 
     | 
    
         
            +
                      return [] unless resource.head.rdf_source?
         
     | 
| 
       108 
114 
     | 
    
         
             
                      immediate_descendant_uris = resource.graph.query(predicate: ::RDF::Vocab::LDP.contains).map { |descendant| descendant.object.to_s }
         
     | 
| 
       109 
115 
     | 
    
         
             
                      all_descendants_uris = [uri]
         
     | 
| 
       110 
116 
     | 
    
         
             
                      immediate_descendant_uris.each do |descendant_uri|
         
     |