Shrine 2.6.0
New plugins
- Added
signature
plugin which allows you to calculate a SHA{1,256,384,512}/MD5/CRC32 hash of a file, in raw, hex or base64 encoding.
Shrine.plugin :signature
Shrine.calculate_signature(io, :md5)
#=> "8c7dd922ad47494fc02c388e12c00eac"
Shrine.calculate_signature(io, :md5, format: :base64)
#=> "jH3ZIq1HSU/ALDiOEsAOrA==\n"
You can then easily create a new metadata field with the calculated hash:
Shrine.plugin :signature
Shrine.plugin :add_metadata
MyUploader.add_metadata :md5 do |io, context|
calculate_signature(io, :md5)
end
- Added
metadata_attibutes
plugin which allows you to sync attachment metadata to additional record attributes.
Shrine.plugin :metadata_attributes
# Syncs `size` metadata to `#<attachment>_size` record attribute, and
# `mime_type` metadata to `#<attachment>_type` record attribute.
Shrine::Attacher.metadata_attributes :size => :size, :mime_type => :type
# ...
user.avatar = image
user.avatar.metadata["size"] #=> 95724
user.avatar_size #=> 95724
user.avatar.metadata["mime_type"] #=> "image/jpeg"
user.avatar_type #=> "image/jpeg"
user.avatar = nil
user.avatar_size #=> nil
user.avatar_type #=> nil
- Added
refresh_metadata
plugin (extracted from therestore_cached_data
plugin) which allows you to re-extract metadata from an uploaded file.
Shrine.plugin :refresh_metadata
# ...
uploaded_file.refresh_metadata!
uploaded_file.metadata # re-extracted metadata
New features
- Added
Shrine.determine_mime_type
andShrine.mime_type_analyzers
methods todetermine_mime_type
plugin for extracting MIME type from a file.
Shrine.plugin :determine_mime_type
Shrine.determine_mime_type(io) # calls the defined analyzer
#=> "image/jpeg"
Shrine.mime_type_analyzers[:file].call(io) # calls a built-in analyzer
#=> "image/jpeg"
- Added
Shrine.extract_dimensions
andShrine.dimensions_analyzers
methods tostore_dimensions
plugin for extracting dimensions from a file.
Shrine.plugin :store_dimensions
Shrine.extract_dimensions(io) # calls the defined analyzer
#=> [300, 400]
Shrine.dimensions_analyzers[:fastimage].call(io) # calls a built-in analyzer
#=> [300, 400]
- Added
Shrine.data_uri
method todata_uri
plugin for converting a data URI into an IO object.
Shrine.plugin :data_uri
io = Shrine.data_uri("data:image/png;base64,9kfg07a80ihtiort87t85")
io.content_type #=> "image/png"
io.size #=> 482
- Added
Shrine.rack_file
method torack_file
plugin for converting the Rack uploaded file hash into an IO object.
Shrine.plugin :rack_file
file_hash #=>
# {
# :name => "file",
# :filename => "cats.png",
# :type => "image/png",
# :tempfile => #<Tempfile:/var/folders/3n/3asd/-Tmp-/RackMultipart201-1476-nfw2-0>,
# :head => "Content-Disposition: form-data; ...",
# }
io = Shrine.rack_file(file_hash)
io.original_filename #=> "cats.png"
io.content_type #=> "image/png"
io.size #=> 58342
Performance improvements
Improved performance of parsing data URIs up to 10x by switching from regex matching to
StringScanner
, and the intermediary base64-encoded content string is now deallocated after it's decoded.UploadedFile#base64
now deallocates the intermediary binary content string after converting it to base64 format indata_uri
plugin.The default multipart copy threshold for
Shrine::Storage::S3
has been bumped from 15MB to 100MB, which is about the size where parallelized multipart copy starts being faster.Uploading files from
FileSystem
storage toS3
storage will now utilize aws-sdk's parallelized multipart upload on files with 15MB or above, which is the scenario when your temporary storage isFileSystem
and permanent storage isS3
.Shrine::Storage::S3#download
now uses only one file descriptor.The
logging
plugin doesn't require thebenchmark
standard library anymore, which reduces the memory footprint.
Other improvements
Fixed wrong implementation of
FileSystem#clear!(older_than: expiration_date)
, where in common scenarios it wouldn't delete old files, or it would incorrectly delete files which still didn't pass the expiration date.The
delete_raw
plugin now deletes any uploaded IO objects that respond to#path
, not justTempfile
objects (this includesFile
,ActionDispatch::Http::UploadedFile
, andShrine::Plugins::RackFile::UploadedFile
objects).The
rack_file
plugin now works with Grape.The
data_uri
plugin now accepts URI-encoded raw data URIs.The
data_uri
plugin now accepts data URIs with additional media type params.Shrine::Storage::S3
now accepts separate multipart thresholds for uploading and for copying.Shrine::Storage::S3#object
is now public, which returns anAws::S3::Object
representing the file.
s3.object("image.jpg") #=> #<Aws::S3::Object bucket_name="your-bucket" key="image.jpg">
Added
Shrine::Storage::S3#client
method for quicker access to theAws::S3::Client
instance.The "S3" component of the
aws-sdk
gem is now eagerly loaded inlib/shrine/storage/s3.rb
, to remove possibility of autoloading causing errors in multi-threaded systems.Shrine::Storage::FileSystem#path
is now public, which returns aPathname
to the file.
filesystem.path("image.jpg") #=> #<Pathname:public/image.jpg>
Shrine now checks whether
Shrine#generate_location
happened to return nil, and raisesShrine::Error
.Attacher#finalize
can now be called even when the attachment hasn't changed.Added
Attacher#changed?
alias toAttacher#attached?
.The logic for rejecting attachments that are already the current attachment has been moved from
Attacher#assign
toAttacher#set
.The
remove_invalid
plugin will now only remove new invalid attachments.The
tempfile
standard library is now correctly required inlib/shrine.rb
.Improved default validation error messages in
validation_helpers
plugin.Blacklisted MIME types and extensions are now excluded from the default error message for security reasons.
The
add_metadata
plugin now also accepts hashes with symbol keys.The loaded plugin module is now returned when calling
Shrine.plugin
.Improved visibility of Shrine deprecation warnings.
Backwards compatibility
- Passing regexes to
validate_(mime_type|extension)_(inclusion|exclusion)
has been deprecated due to lack of usefulness and for security reasons, from now on you should always pass plain strings.
# deprecated
validate_mime_type_inclusion [/image\//]
validate_extension_inclusion [/jpe?g/]
# use strings instead
validate_mime_type_inclusion %w[image/jpeg image/png image/gif ...]
validate_extension_inclusion %w[jpg jpeg png gif ...]
- Previously the
validate_(max|min)_(width|height)
validations would ignorewidth
orheight
being nil, but this is now deprecated and in Shrine 3 this will return an error. You should make sure that the file is of the right type before validating dimensions.
if validate_mime_type_inclusion %w[image/jpeg image/png image/gif]
validate_max_width 1000
validate_max_height 1000
end
Passing a Rack uploaded file hash to
Shrine#upload
andShrine#store
is now deprecated inrack_file
plugin, useShrine.rack_file
to first convert the Rack hash into an IO object.Deprecated passing
:multipart_threshold
option as an integer inShrine::Storage::S3
, use a hash with:upload
and:copy
keys.Deprecated
Shrine::Storage::S3#s3
in favour ofShrine::Storage::S3#client
.The
Shrine::Plugins::DataUri::DataFile
isn't a subclass ofStringIO
anymore, instead it uses composition to delegate only a subset of IO methods to the underlyingStringIO
object. This shouldn't cause any backwards compatibility unless the user was relying on it to be a subclass ofStringIO
.