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.