Shrine 2.4.0
New features
- The
default_url_optionsplugin accepts a block for dynamically generating options.
plugin :default_url_options, store: ->(io, **options) do
{response_content_disposition: "attachment; filename=\"#{io.original_filename}\""}
end- The
activerecordplugin supports JSON and JSONB PostgreSQL columns.
Other improvements
The FileSystem storage doesn't raise an error when attempting to delete a file that doesn't exist anymore. This behaviour has also been added to the storage linter.
Fixed
copyplugin running file validations when assigning copied file, which makes it not work withversionsplugin.The S3 storage automatically sets the
Content-Dispositionheader with the original filename when uploading files.The
<attachment>_dataattribute name has been extracted intoAttacher#data_attribute, so that it's possible to override.The value conversion around the data attribute has been refactored into
#convert_before_writeand#convert_after_readon the Attacher, so that it can be easily overriden in ORM plugins.Work around aws-sdk gem failing if the
:content_dispositionupload option was passed to the S3 storage containing non-ASCII characters. This is also handled better when generating an URL or presign using the:response_content_dispositionoption, by URL-encoding the header value.The previous change also makes the
Content-Dispositionoption handle properly filenames with double quotes.UploadedFile#openandUploadedFile#downloaddon't swallow errors raised byStorage#openanymore.The
sequelplugin now uses less memory when creating large amount of records (see the Sequel commit for more details).The
download_endpointplugin uses Roda's streaming endpoint, which integrates better with EventMachine.Shrine::Attachment#to_shas been added for better introspection when listing model ancestors withputs.
Backwards compatibility
The
download_endpointplugin doesn't use the obsoleteStorage#streammethod anymore, and instead relies onStorage#opento implement streaming. All of the public Shrine storages plugins already support streaming#openfor some time, by usingDown::ChunkedIO.Shrine doesn't anymore explicitly unlink Tempfiles returned by
Storage#openafter closing them. All external storages already useDown::ChunkedIOfor quite some time, which automatically unlinks the underlying Tempfile when#closeis called. But even if your storage returns Tempfiles, these should be automatically unlinked on garbage collection by your Ruby implementation.The
:hostoption on FileSystem and S3 storage has been moved from a first-class storage option passed on#initializeto an URL option. The original:hostoption still works, but will be removed in Shrine 3.
# now deprecated
Shrine::Storage::S3.new(host: "http://abc123.cloudfront.net", **s3_options)
# can be passed to #url
s3 = Shrine::Storage::S3.new(**s3_options)
s3.url(host: "http://abc123.cloudfront.net")
# or can be set automatically using `default_url_options` plugin
Shrine.plugin :default_url_options, store: {host: "http://abc123.cloudfront.net"}- Accepting data in form of a JSON string by
Shrine.uploaded_filehas been deprecated,Attacher#uploaded_fileshould be used for it instead. Note thatShrine.uploaded_filewill still continue to accept Hash orUploadedFileobjects.