hydra-core 8.2.0 → 9.0.0.beta1
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/app/controllers/concerns/hydra/controller/controller_behavior.rb +5 -6
 - data/app/controllers/concerns/hydra/controller/download_behavior.rb +37 -39
 - data/app/models/concerns/hydra/model_methods.rb +22 -22
 - data/hydra-core.gemspec +3 -3
 - data/lib/generators/hydra/head_generator.rb +0 -2
 - data/lib/generators/hydra/templates/catalog_controller.rb +1 -2
 - data/lib/generators/hydra/templates/config/initializers/hydra_config.rb +8 -8
 - data/lib/hydra-core.rb +4 -0
 - data/lib/hydra-head/version.rb +1 -2
 - data/spec/controllers/catalog_controller_spec.rb +6 -8
 - data/spec/controllers/downloads_controller_spec.rb +40 -47
 - data/spec/lib/catalog_spec.rb +15 -0
 - data/spec/lib/model_methods_spec.rb +19 -9
 - data/spec/spec_helper.rb +9 -5
 - data/spec/support/lib/generators/test_app_generator.rb +1 -8
 - data/spec/support/lib/tasks/rspec.rake +2 -1
 - data/tasks/rspec.rake +1 -7
 - metadata +25 -31
 - data/app/search_builders/hydra/search_builder.rb +0 -5
 - data/lib/generators/hydra/hyhead_fixtures_generator.rb +0 -27
 - data/lib/generators/hydra/templates/config/blacklight.yml +0 -9
 - data/lib/railties/hydra-fixtures.rake +0 -49
 - data/spec/models/mods_asset_spec.rb +0 -16
 - data/spec/search_builders/search_builder_spec.rb +0 -22
 - data/spec/support/app/models/generic_content.rb +0 -21
 - data/spec/support/spec/fixtures/hydra_test_generic_content.foxml.xml +0 -138
 - data/spec/support/spec/fixtures/hydrangea_fixture_mods_article1.foxml.xml +0 -234
 - data/tasks/hydra-head-fixtures.rake +0 -58
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: e233f2087f4d4d190c24ffe41bfd5915ac668bf7
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 0d257fe1e9583e99e60df8d863bb30e9eba9f7c2
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 0a0843e0f816379e1da9da3e6af2c07855cbddf7310c42d63fdf45fc1f06940e8585f1a349287b974591249503a1aa5389782f8a850d6b32898a05f838c3a707
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 39f081771adf23e600202ad12c4550a08ea0d7df4d8da6cc50e779bcdec2e4d7806261938258b02f0a4602402b6019105131df4d1953bab2affbb77a6e410b67
         
     | 
| 
         @@ -12,6 +12,9 @@ module Hydra::Controller::ControllerBehavior 
     | 
|
| 
       12 
12 
     | 
    
         
             
              extend ActiveSupport::Concern
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
              included do
         
     | 
| 
      
 15 
     | 
    
         
            +
                # Other modules to auto-include
         
     | 
| 
      
 16 
     | 
    
         
            +
                include Hydra::AccessControlsEnforcement
         
     | 
| 
      
 17 
     | 
    
         
            +
              
         
     | 
| 
       15 
18 
     | 
    
         
             
                # Catch permission errors
         
     | 
| 
       16 
19 
     | 
    
         
             
                rescue_from CanCan::AccessDenied do |exception|
         
     | 
| 
       17 
20 
     | 
    
         
             
                  if (exception.action == :edit)
         
     | 
| 
         @@ -24,11 +27,7 @@ module Hydra::Controller::ControllerBehavior 
     | 
|
| 
       24 
27 
     | 
    
         
             
                  end
         
     | 
| 
       25 
28 
     | 
    
         
             
                end
         
     | 
| 
       26 
29 
     | 
    
         
             
              end
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
              # Override blacklight to produce a search_builder that has the current collection in context
         
     | 
| 
       29 
     | 
    
         
            -
              def search_builder processor_chain = search_params_logic
         
     | 
| 
       30 
     | 
    
         
            -
                super.tap { |builder| builder.current_ability = current_ability }
         
     | 
| 
       31 
     | 
    
         
            -
              end  
         
     | 
| 
      
 30 
     | 
    
         
            +
              
         
     | 
| 
       32 
31 
     | 
    
         | 
| 
       33 
32 
     | 
    
         
             
              # get the currently configured user identifier.  Can be overridden to return whatever (ie. login, email, etc)
         
     | 
| 
       34 
33 
     | 
    
         
             
              # defaults to using whatever you have set as the Devise authentication_key
         
     | 
| 
         @@ -39,7 +38,7 @@ module Hydra::Controller::ControllerBehavior 
     | 
|
| 
       39 
38 
     | 
    
         
             
              module ClassMethods
         
     | 
| 
       40 
39 
     | 
    
         
             
                # get the solr name for a field with this name and using the given solrizer descriptor
         
     | 
| 
       41 
40 
     | 
    
         
             
                def solr_name(name, *opts)
         
     | 
| 
       42 
     | 
    
         
            -
                  ActiveFedora:: 
     | 
| 
      
 41 
     | 
    
         
            +
                  ActiveFedora::SolrQueryBuilder.solr_name(name, *opts)
         
     | 
| 
       43 
42 
     | 
    
         
             
                end
         
     | 
| 
       44 
43 
     | 
    
         
             
              end
         
     | 
| 
       45 
44 
     | 
    
         
             
            end
         
     | 
| 
         @@ -5,14 +5,12 @@ module Hydra 
     | 
|
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
                  included do
         
     | 
| 
       7 
7 
     | 
    
         
             
                    include Hydra::Controller::ControllerBehavior
         
     | 
| 
       8 
     | 
    
         
            -
                    before_filter :load_asset
         
     | 
| 
       9 
     | 
    
         
            -
                    before_filter :load_datastream
         
     | 
| 
       10 
8 
     | 
    
         
             
                    before_filter :authorize_download!
         
     | 
| 
       11 
9 
     | 
    
         
             
                  end
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       13 
11 
     | 
    
         
             
                  # Responds to http requests to show the datastream
         
     | 
| 
       14 
12 
     | 
    
         
             
                  def show
         
     | 
| 
       15 
     | 
    
         
            -
                    if datastream. 
     | 
| 
      
 13 
     | 
    
         
            +
                    if datastream.new_record?
         
     | 
| 
       16 
14 
     | 
    
         
             
                      render_404
         
     | 
| 
       17 
15 
     | 
    
         
             
                    else
         
     | 
| 
       18 
16 
     | 
    
         
             
                      send_content
         
     | 
| 
         @@ -34,41 +32,34 @@ module Hydra 
     | 
|
| 
       34 
32 
     | 
    
         
             
                    :id
         
     | 
| 
       35 
33 
     | 
    
         
             
                  end
         
     | 
| 
       36 
34 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
                  def load_asset
         
     | 
| 
       38 
     | 
    
         
            -
                    @asset = ActiveFedora::Base.load_instance_from_solr(params[asset_param_key])
         
     | 
| 
       39 
     | 
    
         
            -
                  end
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
                  def load_datastream
         
     | 
| 
       42 
     | 
    
         
            -
                    @ds = datastream_to_show
         
     | 
| 
       43 
     | 
    
         
            -
                  end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
35 
     | 
    
         
             
                  # Customize the :download ability in your Ability class, or override this method
         
     | 
| 
       46 
36 
     | 
    
         
             
                  def authorize_download!
         
     | 
| 
       47 
37 
     | 
    
         
             
                    authorize! :download, datastream
         
     | 
| 
       48 
38 
     | 
    
         
             
                  end
         
     | 
| 
       49 
39 
     | 
    
         | 
| 
       50 
40 
     | 
    
         
             
                  def asset
         
     | 
| 
       51 
     | 
    
         
            -
                    @asset
         
     | 
| 
      
 41 
     | 
    
         
            +
                    @asset ||= ActiveFedora::Base.find(params[asset_param_key])
         
     | 
| 
       52 
42 
     | 
    
         
             
                  end
         
     | 
| 
       53 
43 
     | 
    
         | 
| 
       54 
44 
     | 
    
         
             
                  def datastream
         
     | 
| 
       55 
     | 
    
         
            -
                    @ds
         
     | 
| 
      
 45 
     | 
    
         
            +
                    @ds ||= datastream_to_show
         
     | 
| 
       56 
46 
     | 
    
         
             
                  end
         
     | 
| 
       57 
47 
     | 
    
         | 
| 
       58 
48 
     | 
    
         
             
                  # Override this method to change which datastream is shown.
         
     | 
| 
       59 
     | 
    
         
            -
                  # Loads the  
     | 
| 
      
 49 
     | 
    
         
            +
                  # Loads the file specified by the HTTP parameter `:datastream_id`.
         
     | 
| 
       60 
50 
     | 
    
         
             
                  # If this object does not have a datastream by that name, return the default datastream
         
     | 
| 
       61 
51 
     | 
    
         
             
                  # as returned by {#default_content_ds}
         
     | 
| 
       62 
     | 
    
         
            -
                  # @return [ActiveFedora:: 
     | 
| 
      
 52 
     | 
    
         
            +
                  # @return [ActiveFedora::File] the file
         
     | 
| 
       63 
53 
     | 
    
         
             
                  def datastream_to_show
         
     | 
| 
       64 
     | 
    
         
            -
                    ds = asset. 
     | 
| 
       65 
     | 
    
         
            -
                    ds  
     | 
| 
      
 54 
     | 
    
         
            +
                    ds = asset.attached_files[params[:datastream_id]] if params.has_key?(:datastream_id)
         
     | 
| 
      
 55 
     | 
    
         
            +
                    ds ||= default_content_ds
         
     | 
| 
       66 
56 
     | 
    
         
             
                    raise "Unable to find a datastream for #{asset}" if ds.nil?
         
     | 
| 
       67 
57 
     | 
    
         
             
                    ds
         
     | 
| 
       68 
58 
     | 
    
         
             
                  end
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
       70 
60 
     | 
    
         
             
                  # Handle the HTTP show request
         
     | 
| 
       71 
61 
     | 
    
         
             
                  def send_content
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
       72 
63 
     | 
    
         
             
                    response.headers['Accept-Ranges'] = 'bytes'
         
     | 
| 
       73 
64 
     | 
    
         | 
| 
       74 
65 
     | 
    
         
             
                    if request.head?
         
     | 
| 
         @@ -82,60 +73,67 @@ module Hydra 
     | 
|
| 
       82 
73 
     | 
    
         | 
| 
       83 
74 
     | 
    
         
             
                  # Create some headers for the datastream
         
     | 
| 
       84 
75 
     | 
    
         
             
                  def content_options
         
     | 
| 
       85 
     | 
    
         
            -
                    {disposition: 'inline', type: datastream. 
     | 
| 
      
 76 
     | 
    
         
            +
                    {disposition: 'inline', type: datastream.mime_type, filename: datastream_name}
         
     | 
| 
       86 
77 
     | 
    
         
             
                  end
         
     | 
| 
       87 
78 
     | 
    
         | 
| 
       88 
79 
     | 
    
         
             
                  # Override this if you'd like a different filename
         
     | 
| 
       89 
80 
     | 
    
         
             
                  # @return [String] the filename
         
     | 
| 
       90 
81 
     | 
    
         
             
                  def datastream_name
         
     | 
| 
       91 
     | 
    
         
            -
                    params[:filename] || asset.label
         
     | 
| 
      
 82 
     | 
    
         
            +
                    params[:filename] || datastream.original_name || (asset.respond_to?(:label) && asset.label) || datastream.id
         
     | 
| 
       92 
83 
     | 
    
         
             
                  end
         
     | 
| 
       93 
84 
     | 
    
         | 
| 
       94 
85 
     | 
    
         | 
| 
       95 
86 
     | 
    
         
             
                  # render an HTTP HEAD response
         
     | 
| 
       96 
87 
     | 
    
         
             
                  def content_head
         
     | 
| 
       97 
     | 
    
         
            -
                    response.headers['Content-Length'] = datastream. 
     | 
| 
       98 
     | 
    
         
            -
                    response.headers['Content-Type'] = datastream. 
     | 
| 
      
 88 
     | 
    
         
            +
                    response.headers['Content-Length'] = datastream.size
         
     | 
| 
      
 89 
     | 
    
         
            +
                    response.headers['Content-Type'] = datastream.mime_type
         
     | 
| 
       99 
90 
     | 
    
         
             
                    head :ok
         
     | 
| 
       100 
91 
     | 
    
         
             
                  end
         
     | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
       102 
93 
     | 
    
         | 
| 
       103 
94 
     | 
    
         
             
                  # render an HTTP Range response
         
     | 
| 
       104 
95 
     | 
    
         
             
                  def send_range
         
     | 
| 
       105 
96 
     | 
    
         
             
                    _, range = request.headers['HTTP_RANGE'].split('bytes=')
         
     | 
| 
       106 
97 
     | 
    
         
             
                    from, to = range.split('-').map(&:to_i)
         
     | 
| 
       107 
     | 
    
         
            -
                    to = datastream. 
     | 
| 
      
 98 
     | 
    
         
            +
                    to = datastream.size - 1 unless to
         
     | 
| 
       108 
99 
     | 
    
         
             
                    length = to - from + 1
         
     | 
| 
       109 
     | 
    
         
            -
                    response.headers['Content-Range'] = "bytes #{from}-#{to}/#{datastream. 
     | 
| 
      
 100 
     | 
    
         
            +
                    response.headers['Content-Range'] = "bytes #{from}-#{to}/#{datastream.size}"
         
     | 
| 
       110 
101 
     | 
    
         
             
                    response.headers['Content-Length'] = "#{length}"
         
     | 
| 
       111 
102 
     | 
    
         
             
                    self.status = 206
         
     | 
| 
       112 
103 
     | 
    
         
             
                    prepare_file_headers
         
     | 
| 
       113 
     | 
    
         
            -
                     
     | 
| 
      
 104 
     | 
    
         
            +
                    datastream.stream(request.headers['HTTP_RANGE']) do |block|
         
     | 
| 
      
 105 
     | 
    
         
            +
                      response.stream.write block
         
     | 
| 
      
 106 
     | 
    
         
            +
                    end
         
     | 
| 
      
 107 
     | 
    
         
            +
                  ensure
         
     | 
| 
      
 108 
     | 
    
         
            +
                    response.stream.close
         
     | 
| 
       114 
109 
     | 
    
         
             
                  end
         
     | 
| 
       115 
110 
     | 
    
         | 
| 
       116 
111 
     | 
    
         
             
                  def send_file_contents
         
     | 
| 
       117 
112 
     | 
    
         
             
                    self.status = 200
         
     | 
| 
       118 
113 
     | 
    
         
             
                    prepare_file_headers
         
     | 
| 
       119 
     | 
    
         
            -
                     
     | 
| 
      
 114 
     | 
    
         
            +
                    datastream.stream do |block|
         
     | 
| 
      
 115 
     | 
    
         
            +
                      response.stream.write block
         
     | 
| 
      
 116 
     | 
    
         
            +
                    end
         
     | 
| 
      
 117 
     | 
    
         
            +
                  ensure
         
     | 
| 
      
 118 
     | 
    
         
            +
                    response.stream.close
         
     | 
| 
       120 
119 
     | 
    
         
             
                  end
         
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
       122 
121 
     | 
    
         
             
                  def prepare_file_headers
         
     | 
| 
       123 
122 
     | 
    
         
             
                    send_file_headers! content_options
         
     | 
| 
       124 
     | 
    
         
            -
                    response.headers['Content-Type'] = datastream. 
     | 
| 
       125 
     | 
    
         
            -
                    self.content_type = datastream. 
     | 
| 
      
 123 
     | 
    
         
            +
                    response.headers['Content-Type'] = datastream.mime_type
         
     | 
| 
      
 124 
     | 
    
         
            +
                    self.content_type = datastream.mime_type
         
     | 
| 
       126 
125 
     | 
    
         
             
                  end
         
     | 
| 
       127 
126 
     | 
    
         | 
| 
       128 
     | 
    
         
            -
                  private 
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
      
 127 
     | 
    
         
            +
                  private
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
       130 
129 
     | 
    
         
             
                  def default_content_ds
         
     | 
| 
       131 
     | 
    
         
            -
                     
     | 
| 
       132 
     | 
    
         
            -
                       
     | 
| 
       133 
     | 
    
         
            -
                     
     | 
| 
       134 
     | 
    
         
            -
             
     | 
| 
       135 
     | 
    
         
            -
                      return asset.datastreams[DownloadsController.default_content_dsid]
         
     | 
| 
      
 130 
     | 
    
         
            +
                    if asset.class.respond_to?(:default_content_ds)
         
     | 
| 
      
 131 
     | 
    
         
            +
                      asset.attached_files[asset.class.default_content_ds]
         
     | 
| 
      
 132 
     | 
    
         
            +
                    elsif asset.attached_files.key?(DownloadsController.default_content_dsid)
         
     | 
| 
      
 133 
     | 
    
         
            +
                      asset.attached_files[DownloadsController.default_content_dsid]
         
     | 
| 
       136 
134 
     | 
    
         
             
                    end
         
     | 
| 
       137 
135 
     | 
    
         
             
                  end
         
     | 
| 
       138 
     | 
    
         
            -
             
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
       139 
137 
     | 
    
         
             
                  module ClassMethods
         
     | 
| 
       140 
138 
     | 
    
         
             
                    def default_content_dsid
         
     | 
| 
       141 
139 
     | 
    
         
             
                      "content"
         
     | 
| 
         @@ -1,39 +1,40 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'mime/types'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            module Hydra::ModelMethods
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
              #
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
       4 
5 
     | 
    
         
             
              # Adds metadata about the depositor to the asset
         
     | 
| 
       5 
6 
     | 
    
         
             
              # Most important behavior: if the asset has a rightsMetadata datastream, this method will add +depositor_id+ to its individual edit permissions.
         
     | 
| 
       6 
7 
     | 
    
         
             
              # @param [String, #user_key] depositor
         
     | 
| 
       7 
8 
     | 
    
         
             
              #
         
     | 
| 
       8 
9 
     | 
    
         
             
              def apply_depositor_metadata(depositor)
         
     | 
| 
       9 
     | 
    
         
            -
                prop_ds = self.datastreams["properties"]
         
     | 
| 
       10 
     | 
    
         
            -
                rights_ds = self.datastreams["rightsMetadata"]
         
     | 
| 
       11 
     | 
    
         
            -
                
         
     | 
| 
       12 
10 
     | 
    
         
             
                depositor_id = depositor.respond_to?(:user_key) ? depositor.user_key : depositor
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                if  
     | 
| 
       15 
     | 
    
         
            -
                   
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                if respond_to? :depositor
         
     | 
| 
      
 13 
     | 
    
         
            +
                  self.depositor = depositor_id
         
     | 
| 
       16 
14 
     | 
    
         
             
                end
         
     | 
| 
       17 
     | 
    
         
            -
                 
     | 
| 
      
 15 
     | 
    
         
            +
                self.edit_users += [depositor_id]
         
     | 
| 
       18 
16 
     | 
    
         
             
                return true
         
     | 
| 
       19 
17 
     | 
    
         
             
              end
         
     | 
| 
       20 
18 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
              # Puts the contents of file (posted blob) into a datastream and sets the title and label 
     | 
| 
      
 19 
     | 
    
         
            +
              # Puts the contents of file (posted blob) into a datastream and sets the title and label
         
     | 
| 
       22 
20 
     | 
    
         
             
              # Sets asset label and title to filename if they're empty
         
     | 
| 
       23 
21 
     | 
    
         
             
              #
         
     | 
| 
       24 
22 
     | 
    
         
             
              # @param [#read] file the IO object that is the blob
         
     | 
| 
       25 
23 
     | 
    
         
             
              # @param [String] file the IO object that is the blob
         
     | 
| 
       26 
     | 
    
         
            -
              def add_file(file, dsid, file_name)
         
     | 
| 
       27 
     | 
    
         
            -
                 
     | 
| 
       28 
     | 
    
         
            -
                 
     | 
| 
       29 
     | 
    
         
            -
                options = {:label=>file_name, :mimeType=>mime_type}
         
     | 
| 
      
 24 
     | 
    
         
            +
              def add_file(file, dsid, file_name, mime_type=nil)
         
     | 
| 
      
 25 
     | 
    
         
            +
                mime_type ||= best_mime_for_filename(file_name)
         
     | 
| 
      
 26 
     | 
    
         
            +
                options = {label: file_name, mime_type: mime_type, original_name: file_name}
         
     | 
| 
       30 
27 
     | 
    
         
             
                options[:dsid] = dsid if dsid
         
     | 
| 
       31 
28 
     | 
    
         
             
                add_file_datastream(file, options)
         
     | 
| 
       32 
     | 
    
         
            -
                set_title_and_label( file_name, : 
     | 
| 
      
 29 
     | 
    
         
            +
                set_title_and_label( file_name, only_if_blank: true )
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              def best_mime_for_filename(file_name)
         
     | 
| 
      
 33 
     | 
    
         
            +
                mime_types = MIME::Types.of(file_name)
         
     | 
| 
      
 34 
     | 
    
         
            +
                mime_types.empty? ? "application/octet-stream" : mime_types.first.content_type
         
     | 
| 
       33 
35 
     | 
    
         
             
              end
         
     | 
| 
       34 
36 
     | 
    
         | 
| 
       35 
37 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
              
         
     | 
| 
       37 
38 
     | 
    
         
             
              # Set the title and label on the current object
         
     | 
| 
       38 
39 
     | 
    
         
             
              #
         
     | 
| 
       39 
40 
     | 
    
         
             
              # @param [String] new_title
         
     | 
| 
         @@ -52,18 +53,17 @@ module Hydra::ModelMethods 
     | 
|
| 
       52 
53 
     | 
    
         
             
                  set_title( new_title )
         
     | 
| 
       53 
54 
     | 
    
         
             
                end
         
     | 
| 
       54 
55 
     | 
    
         
             
              end
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
       56 
57 
     | 
    
         
             
              # Set the title and label on the current object
         
     | 
| 
       57 
58 
     | 
    
         
             
              #
         
     | 
| 
       58 
59 
     | 
    
         
             
              # @param [String] new_title
         
     | 
| 
       59 
60 
     | 
    
         
             
              # @param [Hash] opts (optional) hash of configuration options
         
     | 
| 
       60 
61 
     | 
    
         
             
              def set_title(new_title, opts={})
         
     | 
| 
       61 
     | 
    
         
            -
                if  
     | 
| 
       62 
     | 
    
         
            -
                   
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
                    desc_metadata_ds.title_values = new_title
         
     | 
| 
      
 62 
     | 
    
         
            +
                if attached_files.has_key?("descMetadata")
         
     | 
| 
      
 63 
     | 
    
         
            +
                  if descMetadata.respond_to?(:title_values)
         
     | 
| 
      
 64 
     | 
    
         
            +
                    descMetadata.title_values = new_title
         
     | 
| 
       65 
65 
     | 
    
         
             
                  else
         
     | 
| 
       66 
     | 
    
         
            -
                     
     | 
| 
      
 66 
     | 
    
         
            +
                    descMetadata.title = new_title
         
     | 
| 
       67 
67 
     | 
    
         
             
                  end
         
     | 
| 
       68 
68 
     | 
    
         
             
                end
         
     | 
| 
       69 
69 
     | 
    
         
             
              end
         
     | 
    
        data/hydra-core.gemspec
    CHANGED
    
    | 
         @@ -17,13 +17,13 @@ Gem::Specification.new do |gem| 
     | 
|
| 
       17 
17 
     | 
    
         
             
              gem.version       = version
         
     | 
| 
       18 
18 
     | 
    
         
             
              gem.license       = "APACHE2"
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
              gem.required_ruby_version = '>=  
     | 
| 
      
 20 
     | 
    
         
            +
              gem.required_ruby_version = '>= 1.9.3'
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
              gem.add_dependency "rails", ' 
     | 
| 
      
 23 
     | 
    
         
            +
              gem.add_dependency "rails", '>= 3.2.3', '< 5' 
         
     | 
| 
       24 
24 
     | 
    
         
             
              gem.add_dependency 'block_helpers'
         
     | 
| 
       25 
25 
     | 
    
         
             
              gem.add_dependency 'hydra-access-controls', version
         
     | 
| 
       26 
     | 
    
         
            -
              gem.add_dependency 'jettywrapper', " 
     | 
| 
      
 26 
     | 
    
         
            +
              gem.add_dependency 'jettywrapper', ">=1.4.1"
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
              gem.add_development_dependency 'sqlite3'
         
     | 
| 
       29 
29 
     | 
    
         
             
              gem.add_development_dependency 'yard'
         
     | 
| 
         @@ -8,11 +8,10 @@ class CatalogController < ApplicationController 
     | 
|
| 
       8 
8 
     | 
    
         
             
              # These before_filters apply the hydra access controls
         
     | 
| 
       9 
9 
     | 
    
         
             
              before_filter :enforce_show_permissions, :only=>:show
         
     | 
| 
       10 
10 
     | 
    
         
             
              # This applies appropriate access controls to all solr queries
         
     | 
| 
       11 
     | 
    
         
            -
              CatalogController. 
     | 
| 
      
 11 
     | 
    
         
            +
              CatalogController.solr_search_params_logic += [:add_access_controls_to_solr_params]
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
              configure_blacklight do |config|
         
     | 
| 
       15 
     | 
    
         
            -
                config.search_builder_class = Hydra::SearchBuilder
         
     | 
| 
       16 
15 
     | 
    
         
             
                config.default_solr_params = {
         
     | 
| 
       17 
16 
     | 
    
         
             
                  :qt => 'search',
         
     | 
| 
       18 
17 
     | 
    
         
             
                  :rows => 10
         
     | 
| 
         @@ -6,15 +6,15 @@ Hydra.configure do |config| 
     | 
|
| 
       6 
6 
     | 
    
         
             
              # You only need to change these values if you've indexed permissions by some means other than the Hydra's built-in tooling.
         
     | 
| 
       7 
7 
     | 
    
         
             
              # If you change these, you must also update the permissions request handler in your solrconfig.xml to return those values
         
     | 
| 
       8 
8 
     | 
    
         
             
              #
         
     | 
| 
       9 
     | 
    
         
            -
              # config.permissions.discover.group       = ActiveFedora:: 
     | 
| 
       10 
     | 
    
         
            -
              # config.permissions.discover.individual  = ActiveFedora:: 
     | 
| 
       11 
     | 
    
         
            -
              # config.permissions.read.group           = ActiveFedora:: 
     | 
| 
       12 
     | 
    
         
            -
              # config.permissions.read.individual      = ActiveFedora:: 
     | 
| 
       13 
     | 
    
         
            -
              # config.permissions.edit.group           = ActiveFedora:: 
     | 
| 
       14 
     | 
    
         
            -
              # config.permissions.edit.individual      = ActiveFedora:: 
     | 
| 
      
 9 
     | 
    
         
            +
              # config.permissions.discover.group       = ActiveFedora::SolrQueryBuilder.solr_name("discover_access_group", :symbol)
         
     | 
| 
      
 10 
     | 
    
         
            +
              # config.permissions.discover.individual  = ActiveFedora::SolrQueryBuilder.solr_name("discover_access_person", :symbol)
         
     | 
| 
      
 11 
     | 
    
         
            +
              # config.permissions.read.group           = ActiveFedora::SolrQueryBuilder.solr_name("read_access_group", :symbol)
         
     | 
| 
      
 12 
     | 
    
         
            +
              # config.permissions.read.individual      = ActiveFedora::SolrQueryBuilder.solr_name("read_access_person", :symbol)
         
     | 
| 
      
 13 
     | 
    
         
            +
              # config.permissions.edit.group           = ActiveFedora::SolrQueryBuilder.solr_name("edit_access_group", :symbol)
         
     | 
| 
      
 14 
     | 
    
         
            +
              # config.permissions.edit.individual      = ActiveFedora::SolrQueryBuilder.solr_name("edit_access_person", :symbol)
         
     | 
| 
       15 
15 
     | 
    
         
             
              #
         
     | 
| 
       16 
     | 
    
         
            -
              # config.permissions.embargo.release_date  = ActiveFedora:: 
     | 
| 
       17 
     | 
    
         
            -
              # config.permissions.lease.expiration_date = ActiveFedora:: 
     | 
| 
      
 16 
     | 
    
         
            +
              # config.permissions.embargo.release_date  = ActiveFedora::SolrQueryBuilder.solr_name("embargo_release_date", :stored_sortable, type: :date)
         
     | 
| 
      
 17 
     | 
    
         
            +
              # config.permissions.lease.expiration_date = ActiveFedora::SolrQueryBuilder.solr_name("lease_expiration_date", :stored_sortable, type: :date)
         
     | 
| 
       18 
18 
     | 
    
         
             
              #
         
     | 
| 
       19 
19 
     | 
    
         
             
              #
         
     | 
| 
       20 
20 
     | 
    
         
             
              # specify the user model
         
     | 
    
        data/lib/hydra-core.rb
    CHANGED
    
    | 
         @@ -2,6 +2,10 @@ require 'hydra-access-controls' 
     | 
|
| 
       2 
2 
     | 
    
         
             
            require 'deprecation'
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            module HydraHead 
         
     | 
| 
      
 5 
     | 
    
         
            +
              extend Deprecation
         
     | 
| 
       5 
6 
     | 
    
         
             
              require 'hydra-head/engine' if defined?(Rails)
         
     | 
| 
      
 7 
     | 
    
         
            +
              def self.add_routes(router, options = {})
         
     | 
| 
      
 8 
     | 
    
         
            +
                Deprecation.warn HydraHead, "add_routes has been removed." # remove this warning in hydra-head 8
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
       6 
10 
     | 
    
         
             
            end
         
     | 
| 
       7 
11 
     | 
    
         | 
    
        data/lib/hydra-head/version.rb
    CHANGED
    
    
| 
         @@ -10,14 +10,6 @@ describe CatalogController do 
     | 
|
| 
       10 
10 
     | 
    
         
             
                expect(controller).to be_an_instance_of CatalogController
         
     | 
| 
       11 
11 
     | 
    
         
             
              end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
              describe "configuration" do
         
     | 
| 
       14 
     | 
    
         
            -
                let(:config) { CatalogController.blacklight_config }
         
     | 
| 
       15 
     | 
    
         
            -
                describe "search_builder_class" do
         
     | 
| 
       16 
     | 
    
         
            -
                  subject {config.search_builder_class }
         
     | 
| 
       17 
     | 
    
         
            -
                  it { is_expected.to eq Hydra::SearchBuilder }
         
     | 
| 
       18 
     | 
    
         
            -
                end
         
     | 
| 
       19 
     | 
    
         
            -
              end
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
13 
     | 
    
         
             
              describe "Paths Generated by Custom Routes:" do
         
     | 
| 
       22 
14 
     | 
    
         
             
                # paths generated by custom routes
         
     | 
| 
       23 
15 
     | 
    
         
             
                it "should map {:controller=>'catalog', :action=>'index'} to GET /catalog" do
         
     | 
| 
         @@ -56,6 +48,12 @@ describe CatalogController do 
     | 
|
| 
       56 
48 
     | 
    
         
             
              end
         
     | 
| 
       57 
49 
     | 
    
         | 
| 
       58 
50 
     | 
    
         
             
              describe "filters" do
         
     | 
| 
      
 51 
     | 
    
         
            +
                describe "index" do
         
     | 
| 
      
 52 
     | 
    
         
            +
                  it "should trigger enforce_index_permissions" do
         
     | 
| 
      
 53 
     | 
    
         
            +
                    expect(controller).to receive(:add_access_controls_to_solr_params)
         
     | 
| 
      
 54 
     | 
    
         
            +
                    get :index
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
       59 
57 
     | 
    
         
             
                describe "show" do
         
     | 
| 
       60 
58 
     | 
    
         
             
                  it "should trigger enforce_show_permissions" do
         
     | 
| 
       61 
59 
     | 
    
         
             
                    allow(controller).to receive(:current_user).and_return(nil)
         
     | 
| 
         @@ -18,26 +18,30 @@ describe DownloadsController do 
     | 
|
| 
       18 
18 
     | 
    
         
             
              describe "with a file" do
         
     | 
| 
       19 
19 
     | 
    
         
             
                before do
         
     | 
| 
       20 
20 
     | 
    
         
             
                  class ContentHolder < ActiveFedora::Base
         
     | 
| 
      
 21 
     | 
    
         
            +
                    include Hydra::ModelMethods
         
     | 
| 
       21 
22 
     | 
    
         
             
                    include Hydra::AccessControls::Permissions
         
     | 
| 
       22 
     | 
    
         
            -
                     
     | 
| 
      
 23 
     | 
    
         
            +
                    contains 'thumbnail'
         
     | 
| 
       23 
24 
     | 
    
         
             
                  end
         
     | 
| 
       24 
25 
     | 
    
         
             
                  @user = User.new.tap {|u| u.email = 'email@example.com'; u.password = 'password'; u.save}
         
     | 
| 
       25 
     | 
    
         
            -
                  @obj = ContentHolder.new
         
     | 
| 
       26 
     | 
    
         
            -
                  @obj.label = "world.png"
         
     | 
| 
       27 
     | 
    
         
            -
                  @obj.add_file_datastream('fizz', :dsid=>'buzz', :mimeType => 'image/png')
         
     | 
| 
       28 
     | 
    
         
            -
                  @obj.add_file_datastream('foobarfoobarfoobar', :dsid=>'content', :mimeType => 'image/png')
         
     | 
| 
       29 
     | 
    
         
            -
                  @obj.add_file_datastream("It's a stream", :dsid=>'descMetadata', :mimeType => 'text/plain')
         
     | 
| 
       30 
     | 
    
         
            -
                  @obj.read_users = [@user.user_key]
         
     | 
| 
       31 
     | 
    
         
            -
                  @obj.save!
         
     | 
| 
       32 
26 
     | 
    
         
             
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
                let(:obj) do
         
     | 
| 
      
 28 
     | 
    
         
            +
                  ContentHolder.new.tap do |obj|
         
     | 
| 
      
 29 
     | 
    
         
            +
                    obj.add_file_datastream('fizz', dsid: 'buzz', mime_type: 'image/png', original_name: 'buzz.png')
         
     | 
| 
      
 30 
     | 
    
         
            +
                    obj.add_file_datastream('foobarfoobarfoobar', dsid: 'content', mime_type: 'image/png', original_name: 'world.png')
         
     | 
| 
      
 31 
     | 
    
         
            +
                    obj.add_file_datastream("It's a stream", dsid: 'descMetadata', mime_type: 'text/plain', original_name: 'metadata.xml')
         
     | 
| 
      
 32 
     | 
    
         
            +
                    obj.read_users = [@user.user_key]
         
     | 
| 
      
 33 
     | 
    
         
            +
                    obj.save!
         
     | 
| 
      
 34 
     | 
    
         
            +
                  end
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
       33 
37 
     | 
    
         
             
                after do
         
     | 
| 
       34 
     | 
    
         
            -
                   
     | 
| 
      
 38 
     | 
    
         
            +
                  obj.destroy
         
     | 
| 
       35 
39 
     | 
    
         
             
                  Object.send(:remove_const, :ContentHolder)
         
     | 
| 
       36 
40 
     | 
    
         
             
                end 
         
     | 
| 
       37 
41 
     | 
    
         
             
                context "when not logged in" do
         
     | 
| 
       38 
42 
     | 
    
         
             
                  context "when a specific datastream is requested" do
         
     | 
| 
       39 
43 
     | 
    
         
             
                    it "should redirect to the root path and display an error" do
         
     | 
| 
       40 
     | 
    
         
            -
                      get  
     | 
| 
      
 44 
     | 
    
         
            +
                      get :show, id: obj, datastream_id: "descMetadata"
         
     | 
| 
       41 
45 
     | 
    
         
             
                      expect(response).to redirect_to new_user_session_path
         
     | 
| 
       42 
46 
     | 
    
         
             
                      expect(flash[:alert]).to eq "You are not authorized to access this page."
         
     | 
| 
       43 
47 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -50,7 +54,7 @@ describe DownloadsController do 
     | 
|
| 
       50 
54 
     | 
    
         
             
                  end
         
     | 
| 
       51 
55 
     | 
    
         
             
                  context "when a specific datastream is requested" do
         
     | 
| 
       52 
56 
     | 
    
         
             
                    it "should redirect to the root path and display an error" do
         
     | 
| 
       53 
     | 
    
         
            -
                      get  
     | 
| 
      
 57 
     | 
    
         
            +
                      get :show, id: obj, datastream_id: "descMetadata"
         
     | 
| 
       54 
58 
     | 
    
         
             
                      expect(response).to redirect_to root_path
         
     | 
| 
       55 
59 
     | 
    
         
             
                      expect(flash[:alert]).to eq "You are not authorized to access this page."
         
     | 
| 
       56 
60 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -65,16 +69,16 @@ describe DownloadsController do 
     | 
|
| 
       65 
69 
     | 
    
         
             
                  describe "#show" do
         
     | 
| 
       66 
70 
     | 
    
         
             
                    it "should default to returning default download configured by object" do
         
     | 
| 
       67 
71 
     | 
    
         
             
                      allow(ContentHolder).to receive(:default_content_ds).and_return('buzz')
         
     | 
| 
       68 
     | 
    
         
            -
                      get  
     | 
| 
       69 
     | 
    
         
            -
                      expect(response).to  
     | 
| 
      
 72 
     | 
    
         
            +
                      get :show, id: obj
         
     | 
| 
      
 73 
     | 
    
         
            +
                      expect(response).to be_successful
         
     | 
| 
       70 
74 
     | 
    
         
             
                      expect(response.headers['Content-Type']).to eq "image/png"
         
     | 
| 
       71 
     | 
    
         
            -
                      expect(response.headers["Content-Disposition"]).to eq "inline; filename=\" 
     | 
| 
      
 75 
     | 
    
         
            +
                      expect(response.headers["Content-Disposition"]).to eq "inline; filename=\"buzz.png\""
         
     | 
| 
       72 
76 
     | 
    
         
             
                      expect(response.body).to eq 'fizz'
         
     | 
| 
       73 
77 
     | 
    
         
             
                    end
         
     | 
| 
       74 
78 
     | 
    
         
             
                    it "should default to returning default download configured by controller" do
         
     | 
| 
       75 
79 
     | 
    
         
             
                      expect(DownloadsController.default_content_dsid).to eq "content"
         
     | 
| 
       76 
     | 
    
         
            -
                      get  
     | 
| 
       77 
     | 
    
         
            -
                      expect(response).to  
     | 
| 
      
 80 
     | 
    
         
            +
                      get :show, id: obj
         
     | 
| 
      
 81 
     | 
    
         
            +
                      expect(response).to be_successful
         
     | 
| 
       78 
82 
     | 
    
         
             
                      expect(response.headers['Content-Type']).to eq "image/png"
         
     | 
| 
       79 
83 
     | 
    
         
             
                      expect(response.headers["Content-Disposition"]).to eq "inline; filename=\"world.png\""
         
     | 
| 
       80 
84 
     | 
    
         
             
                      expect(response.body).to eq 'foobarfoobarfoobar'
         
     | 
| 
         @@ -83,63 +87,53 @@ describe DownloadsController do 
     | 
|
| 
       83 
87 
     | 
    
         
             
                    context "when a specific datastream is requested" do
         
     | 
| 
       84 
88 
     | 
    
         
             
                      context "and it doesn't exist" do
         
     | 
| 
       85 
89 
     | 
    
         
             
                        it "should return :not_found when the datastream doesn't exist" do
         
     | 
| 
       86 
     | 
    
         
            -
                          get  
     | 
| 
      
 90 
     | 
    
         
            +
                          get :show, id: obj, datastream_id: "thumbnail"
         
     | 
| 
       87 
91 
     | 
    
         
             
                          expect(response).to be_not_found
         
     | 
| 
       88 
92 
     | 
    
         
             
                        end
         
     | 
| 
       89 
93 
     | 
    
         
             
                      end
         
     | 
| 
       90 
94 
     | 
    
         
             
                      context "and it exists" do
         
     | 
| 
       91 
95 
     | 
    
         
             
                        it "should return it" do
         
     | 
| 
       92 
     | 
    
         
            -
                          get  
     | 
| 
       93 
     | 
    
         
            -
                          expect(response).to  
     | 
| 
      
 96 
     | 
    
         
            +
                          get :show, id: obj, datastream_id: "descMetadata"
         
     | 
| 
      
 97 
     | 
    
         
            +
                          expect(response).to be_successful
         
     | 
| 
       94 
98 
     | 
    
         
             
                          expect(response.headers['Content-Type']).to eq "text/plain"
         
     | 
| 
       95 
     | 
    
         
            -
                          expect(response.headers["Content-Disposition"]).to eq "inline; filename=\" 
     | 
| 
      
 99 
     | 
    
         
            +
                          expect(response.headers["Content-Disposition"]).to eq "inline; filename=\"metadata.xml\""
         
     | 
| 
       96 
100 
     | 
    
         
             
                          expect(response.body).to eq "It's a stream"
         
     | 
| 
       97 
101 
     | 
    
         
             
                        end
         
     | 
| 
       98 
102 
     | 
    
         
             
                      end
         
     | 
| 
       99 
103 
     | 
    
         
             
                    end
         
     | 
| 
       100 
104 
     | 
    
         
             
                    it "should support setting disposition to inline" do
         
     | 
| 
       101 
     | 
    
         
            -
                      get  
     | 
| 
       102 
     | 
    
         
            -
                      expect(response).to  
     | 
| 
      
 105 
     | 
    
         
            +
                      get :show, id: obj, :disposition => "inline"
         
     | 
| 
      
 106 
     | 
    
         
            +
                      expect(response).to be_successful
         
     | 
| 
       103 
107 
     | 
    
         
             
                      expect(response.headers['Content-Type']).to eq "image/png"
         
     | 
| 
       104 
108 
     | 
    
         
             
                      expect(response.headers["Content-Disposition"]).to eq "inline; filename=\"world.png\""
         
     | 
| 
       105 
109 
     | 
    
         
             
                      expect(response.body).to eq 'foobarfoobarfoobar'
         
     | 
| 
       106 
110 
     | 
    
         
             
                    end
         
     | 
| 
       107 
111 
     | 
    
         
             
                    it "should allow you to specify filename for download" do
         
     | 
| 
       108 
     | 
    
         
            -
                      get  
     | 
| 
       109 
     | 
    
         
            -
                      expect(response).to  
     | 
| 
      
 112 
     | 
    
         
            +
                      get :show, id: obj, "filename" => "my%20dog.png"
         
     | 
| 
      
 113 
     | 
    
         
            +
                      expect(response).to be_successful
         
     | 
| 
       110 
114 
     | 
    
         
             
                      expect(response.headers['Content-Type']).to eq "image/png"
         
     | 
| 
       111 
115 
     | 
    
         
             
                      expect(response.headers["Content-Disposition"]).to eq "inline; filename=\"my%20dog.png\""
         
     | 
| 
       112 
116 
     | 
    
         
             
                      expect(response.body).to eq 'foobarfoobarfoobar'
         
     | 
| 
       113 
117 
     | 
    
         
             
                    end
         
     | 
| 
       114 
118 
     | 
    
         
             
                  end
         
     | 
| 
       115 
119 
     | 
    
         
             
                  describe "stream" do
         
     | 
| 
      
 120 
     | 
    
         
            +
                    let(:parent) { ActiveFedora::Base.new(id: '1234') }
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
       116 
122 
     | 
    
         
             
                    before do
         
     | 
| 
       117 
     | 
    
         
            -
                       
     | 
| 
       118 
     | 
    
         
            -
                       
     | 
| 
       119 
     | 
    
         
            -
                       
     | 
| 
       120 
     | 
    
         
            -
                      allow(stub_repo).to receive(:datastream_dissemination).and_yield(stub_response)
         
     | 
| 
       121 
     | 
    
         
            -
                      stub_ds = ActiveFedora::Datastream.new
         
     | 
| 
       122 
     | 
    
         
            -
                      allow(stub_ds).to receive(:repository).and_return(stub_repo)
         
     | 
| 
       123 
     | 
    
         
            -
                      allow(stub_ds).to receive(:mimeType).and_return('video/webm')
         
     | 
| 
       124 
     | 
    
         
            -
                      allow(stub_ds).to receive(:dsSize).and_return(16)
         
     | 
| 
       125 
     | 
    
         
            -
                      allow(stub_ds).to receive(:dsid).and_return('webm')
         
     | 
| 
       126 
     | 
    
         
            -
                      allow(stub_ds).to receive(:new?).and_return(false)
         
     | 
| 
       127 
     | 
    
         
            -
                      allow(stub_ds).to receive(:pid).and_return('changeme:test')
         
     | 
| 
       128 
     | 
    
         
            -
                      stub_file = double('stub object', datastreams: {'webm' => stub_ds}, pid:'changeme:test', label: "MyVideo.webm")
         
     | 
| 
       129 
     | 
    
         
            -
                      expect(ActiveFedora::Base).to receive(:load_instance_from_solr).with('changeme:test').and_return(stub_file)
         
     | 
| 
       130 
     | 
    
         
            -
                      allow(controller).to receive(:authorize!).with(:download, stub_ds).and_return(true)
         
     | 
| 
       131 
     | 
    
         
            -
                      allow(controller).to receive(:log_download)
         
     | 
| 
      
 123 
     | 
    
         
            +
                      parent.add_file_datastream('one1two2threfour', dsid: 'webm', mime_type: 'video/webm', original_name: 'MyVideo.webm')
         
     | 
| 
      
 124 
     | 
    
         
            +
                      parent.save!
         
     | 
| 
      
 125 
     | 
    
         
            +
                      expect(controller).to receive(:authorize!).with(:download, instance_of(ActiveFedora::File)).and_return(true)
         
     | 
| 
       132 
126 
     | 
    
         
             
                    end
         
     | 
| 
       133 
127 
     | 
    
         
             
                    it "head request" do
         
     | 
| 
       134 
128 
     | 
    
         
             
                      request.env["HTTP_RANGE"] = 'bytes=0-15'
         
     | 
| 
       135 
     | 
    
         
            -
                      head :show, id:  
     | 
| 
      
 129 
     | 
    
         
            +
                      head :show, id: parent, datastream_id: 'webm'
         
     | 
| 
       136 
130 
     | 
    
         
             
                      expect(response.headers['Content-Length']).to eq 16
         
     | 
| 
       137 
131 
     | 
    
         
             
                      expect(response.headers['Accept-Ranges']).to eq 'bytes'
         
     | 
| 
       138 
132 
     | 
    
         
             
                      expect(response.headers['Content-Type']).to eq 'video/webm'
         
     | 
| 
       139 
133 
     | 
    
         
             
                    end
         
     | 
| 
       140 
134 
     | 
    
         
             
                    it "should send the whole thing" do
         
     | 
| 
       141 
135 
     | 
    
         
             
                      request.env["HTTP_RANGE"] = 'bytes=0-15'
         
     | 
| 
       142 
     | 
    
         
            -
                      get :show, id: ' 
     | 
| 
      
 136 
     | 
    
         
            +
                      get :show, id: '1234', datastream_id: 'webm'
         
     | 
| 
       143 
137 
     | 
    
         
             
                      expect(response.body).to eq 'one1two2threfour'
         
     | 
| 
       144 
138 
     | 
    
         
             
                      expect(response.headers["Content-Range"]).to eq 'bytes 0-15/16'
         
     | 
| 
       145 
139 
     | 
    
         
             
                      expect(response.headers["Content-Length"]).to eq '16'
         
     | 
| 
         @@ -149,20 +143,20 @@ describe DownloadsController do 
     | 
|
| 
       149 
143 
     | 
    
         
             
                      expect(response.status).to eq 206
         
     | 
| 
       150 
144 
     | 
    
         
             
                    end
         
     | 
| 
       151 
145 
     | 
    
         
             
                    it "should send the whole thing when the range is open ended" do
         
     | 
| 
       152 
     | 
    
         
            -
                      request.env[" 
     | 
| 
       153 
     | 
    
         
            -
                      get :show, id: ' 
     | 
| 
      
 146 
     | 
    
         
            +
                      request.env["HTTP_RANGE"] = 'bytes=0-'
         
     | 
| 
      
 147 
     | 
    
         
            +
                      get :show, id: '1234', datastream_id: 'webm'
         
     | 
| 
       154 
148 
     | 
    
         
             
                      expect(response.body).to eq 'one1two2threfour'
         
     | 
| 
       155 
149 
     | 
    
         
             
                    end
         
     | 
| 
       156 
150 
     | 
    
         
             
                    it "should get a range not starting at the beginning" do
         
     | 
| 
       157 
151 
     | 
    
         
             
                      request.env["HTTP_RANGE"] = 'bytes=3-15'
         
     | 
| 
       158 
     | 
    
         
            -
                      get :show, id: ' 
     | 
| 
      
 152 
     | 
    
         
            +
                      get :show, id: '1234', datastream_id: 'webm'
         
     | 
| 
       159 
153 
     | 
    
         
             
                      expect(response.body).to eq '1two2threfour'
         
     | 
| 
       160 
154 
     | 
    
         
             
                      expect(response.headers["Content-Range"]).to eq 'bytes 3-15/16'
         
     | 
| 
       161 
155 
     | 
    
         
             
                      expect(response.headers["Content-Length"]).to eq '13'
         
     | 
| 
       162 
156 
     | 
    
         
             
                    end
         
     | 
| 
       163 
157 
     | 
    
         
             
                    it "should get a range not ending at the end" do
         
     | 
| 
       164 
158 
     | 
    
         
             
                      request.env["HTTP_RANGE"] = 'bytes=4-11'
         
     | 
| 
       165 
     | 
    
         
            -
                      get :show, id: ' 
     | 
| 
      
 159 
     | 
    
         
            +
                      get :show, id: '1234', datastream_id: 'webm'
         
     | 
| 
       166 
160 
     | 
    
         
             
                      expect(response.body).to eq 'two2thre'
         
     | 
| 
       167 
161 
     | 
    
         
             
                      expect(response.headers["Content-Range"]).to eq 'bytes 4-11/16'
         
     | 
| 
       168 
162 
     | 
    
         
             
                      expect(response.headers["Content-Length"]).to eq '8'
         
     | 
| 
         @@ -181,10 +175,9 @@ describe DownloadsController do 
     | 
|
| 
       181 
175 
     | 
    
         
             
                  end
         
     | 
| 
       182 
176 
     | 
    
         
             
                  it "should use the custom param value to retrieve the asset" do
         
     | 
| 
       183 
177 
     | 
    
         
             
                    allow(controller).to receive(:asset_param_key).and_return(:object_id)
         
     | 
| 
       184 
     | 
    
         
            -
                    get  
     | 
| 
      
 178 
     | 
    
         
            +
                    get :show, object_id: obj
         
     | 
| 
       185 
179 
     | 
    
         
             
                    expect(response).to be_successful
         
     | 
| 
       186 
180 
     | 
    
         
             
                  end
         
     | 
| 
       187 
181 
     | 
    
         
             
                end
         
     | 
| 
       188 
     | 
    
         
            -
             
     | 
| 
       189 
182 
     | 
    
         
             
              end
         
     | 
| 
       190 
183 
     | 
    
         
             
            end
         
     |