New features
-
Added delete_promoted plugin for deleting files that have been promoted, which applies to any cached files that have been uploaded to store.
-
Added
:fallbacksoption to versions plugin, which allows specifying fallback URLs for versions which haven't finished processing yet.
class ImageUploader < Shrine
plugin :versions, fallbacks: {:thumb_2x => :thumb, :large_2x => :large}
end# ... (background job is working)
user.avatar_url(:thumb_2x) # returns :thumb URL until :thumb_2x becomes available
user.avatar_url(:large_2x) # returns :large URL until :large_2x becomes available- Added ability to do custom backgrounding via
Attacher.dumpandAttacher.load.
class Record < Sequel::Model
def after_commit
if something_happened?
data = Shrine::Attacher.dump(image_attacher)
SomethingJob.perform_async(data)
end
end
endclass SomethingJob
include Sidekiq::Worker
def perform(data)
attacher = Shrine::Attacher.load(data)
# ...
end
end- Added
:presign_locationto direct_upload plugin for generating the location for presigned upload.
plugin :direct_upload, presign: true, presign_location: ->(r) { "${filename}" }- Added
:filenameto data_uri for generating filenames based on content type of the data URI, in order for filename's extension to be automatically used in uploaded file's location.
require "mime/types"
plugin :data_uri, filename: ->(content_type) do
extension = MIME::Types[content_type].first.preferred_extension
"data_uri.#{extension}"
endOther improvements
-
The download_endpoint now sets the
Content-Lengthresponse header, if the size of the uploaded file is available (S3 now supports it). -
It's now possible to swap S3 storage with FileSystem when using presigns in direct_upload plugin, without changing any code, which is very useful in tests.
-
The backup plugin now waits for the record to be saved with stored files before it starts uploading to backup storage.
-
The logging plugin now logs both number of input and output files for processing.
-
The migration_helpers now has a
:delegateoption, which when set to false doesn't add any additional methods to the model. -
In restore_cached_data plugin the cached file is now closed after the metadata has been extracted.
-
Attacher#promotecan now accept a phase, which makes it more generic and can now be used for securely reuploading stored files (no processing, aborts if attachment changes, old file is deleted with delete_promoted plugin), which is useful for moving to new location. -
The
:presign_optionsnow accepts a static hash in addition to a block. -
The direct_upload endpoint has now been refactored into methods, which means its now easier to override parts of its behaviour.
-
The user-defined hooks will now happen outside logging, regardless of the load order of logging and hooks plugins.
-
The parallelize plugin doesn't depend on the thread gem anymore, it now uses threads directly.
-
Improved the storage linter; it now accounts for some subtleties which could potentially make some storages error, it fails fast, and it tests the content length in streaming.
-
The
before_*andafter_*hooks now always happen aroundaround_*hooks. -
The IO is now automatically rewinded when custom analyzer is used with determine_mime_type and store_dimensions plugins.
Bug fixes
-
Fixed logger not being inherited in the logging plugin.
-
In validation_helpers plugin the dimensions validations now don't do anything when dimensions are missing from metadata (previously they were erroring).
-
The keep_files plugin doesn't spawn delete background jobs anymore for files that are to be kept.
-
Deleting backed up files now actually works with backgrounding plugin.
-
Shrine now ignores validations when promoting, which means it will work when saving the record when it is invalid (but validations are skipped).
-
S3 storage now properly encodes the URL when
:hostoption is used, which would previously cause errors if location contained URL-unsafe characters. -
Eliminate a tiny chance of a race condition during promoting, which could happen with subsequent attachment updates on the same record when using the backgrounding plugin.
-
S3 storage now uses an assigned SSL certificate when downloading.
Backwards compatibility
-
The restore_cached plugin has been renamed to "restore_cached_data". The plugin will stop being loadable with the old name in Shrine 2.
-
In direct_upload presign options are now accepted via
:presign_options(instead of:presign). Accepting them via:presignwill stop working in Shrine 2. -
The direct_upload's endpoint has now been changed from
/:storage/:nameto/:storage/upload. The old endpoint is still accessible and will stay in Shrine 2, but will be removed in Shrine 3. -
The
:delegateoption is now mandatory to pass for migration_helpers, until Shrine 2 where it will default to false. -
The delete_uploaded plugin has been renamed to "delete_raw". The plugin can still be loaded via "delete_uploaded", but this won't be possible anymore in Shrine 2.
-
The moving plugin now deprecates "fake" moving, where in case the storage didn't support moving the file would be uploaded and deleted. In Shrine 2 the file won't be deleted anymore (you can use the delete_raw plugin for this functionality).
-
The
Shrine.versions!andShrine.versionsmethods have been removed, as they were part of internal API of versions plugin, but accidentally made public.