title: Shrine 3.7.0

New features

rb plugin :download_endpoint, prefix: "downloads", secret_key: "<your-secret-key>", expires_in: 5 * 60 # optional default; can be overridden per URL

rb uploaded_file.download_url # uses the default expires_in uploaded_file.download_url(expires_in: 10 * 60) # override per URL # => "https://example.com/downloads/<token>?signature=...&expires_at=..."

rb plugin :derivatives, keep_derivatives: true

rb attacher.derivatives #=> { thumb: #<Shrine::UploadedFile> } attacher.change(new_file) attacher.derivatives #=> { thumb: #<Shrine::UploadedFile> } # preserved

“‘rb uploaded_file.metadata[“custom”] = “stale value”

uploaded_file.refresh_metadata! # merge (default) uploaded_file.metadata[“custom”] #=> “stale value” (preserved)

uploaded_file.refresh_metadata!(replace: true) # replace uploaded_file.metadata[“custom”] #=> nil (removed) “‘

Other improvements

“‘rb Shrine::Attacher.promote_block do |attacher:, my_option:, **| # my_option was previously not forwarded here SomePromoteJob.perform_async(attacher.dump, my_option: my_option) end

attacher.promote_cached(my_option: “value”) # now forwarded correctly “‘

Backwards compatibility

rb gem "mini_magick" # or gem "ruby-vips"