Hello,
I got the deprecation warning in the latest Shrine version telling me to change from using the "versions" plugin to using "derivatives". I have an uploader in a Rails app that looks like this:
require "image_processing/mini_magick"
class UserAvatarUploader < Shrine
  plugin :default_storage,
    cache: :user_avatar_cache,
    store: :user_avatar_store
  plugin :processing
  plugin :versions
  plugin :store_dimensions
  plugin :remote_url, max_size: 20*1024*1024 # 20MB
  plugin :delete_raw
  plugin :validation_helpers
  plugin :determine_mime_type
  Attacher.validate do
    validate_min_size 1, message: "must not be empty"
    validate_max_size 5*1024*1024, message: "is too large (max is 5 MB)"
    validate_mime_type_inclusion %w[image/jpeg image/png]
  end
  process(:store) do |io, context|
    versions = { original: io } # retain original
    # download the uploaded file from the temporary storage
    io.download do |original|
      pipeline = ImageProcessing::MiniMagick.source(original)
      versions[:"50"]  = pipeline.resize_to_fill!(50,  50, gravity: "Center")
      versions[:"100"] = pipeline.resize_to_fill!(100, 100, gravity: "Center")
      versions[:"200"] = pipeline.resize_to_fill!(200, 200, gravity: "Center")
      versions[:"400"] = pipeline.resize_to_fill!(400, 400, gravity: "Center")
    end
    versions
  end
end
Here's the Rails model that uses it:
class User < ApplicationRecord
  include UserAvatarUploader::Attachment(:avatar)
  # ...
I modified the uploader to use derivatives like so:
require "image_processing/mini_magick"
class UserAvatarUploader < Shrine
  plugin :default_storage,
    cache: :user_avatar_cache,
    store: :user_avatar_store
  plugin :store_dimensions
  plugin :remote_url, max_size: 20*1024*1024 # 20MB
  plugin :validation_helpers
  plugin :determine_mime_type
  Attacher.validate do
    validate_min_size 1, message: "must not be empty"
    validate_max_size 5*1024*1024, message: "is too large (max is 5 MB)"
    validate_mime_type_inclusion %w[image/jpeg image/png]
  end
  Attacher.derivatives do |original|
    magick = ImageProcessing::MiniMagick.source(original)
 
    { 
      :"50" =>  magick.resize_to_fill!( 50,  50, gravity: "Center"),
      :"100" => magick.resize_to_fill!(100, 100, gravity: "Center"),
      :"200" => magick.resize_to_fill!(200, 200, gravity: "Center"),
      :"400" => magick.resize_to_fill!(400, 400, gravity: "Center"),
    }
  end
end
However when I try to load the attacher on the Rails model, it says "isn't valid uploaded file data"
irb(main):010:0> User.last.avatar
Traceback (most recent call last):
        1: from (irb):10
Shrine::Error ({"50"=>{"id"=>"47f058aa5bb221865ecbc174e9ea8a43.jpg", "storage"=>"user_avatar_store", "metadata"=>{"size"=>1506, "width"=>50, "height"=>50, "filename"=>"image_processing20190805-29116-70z2zj.jpg", "mime_type"=>"image/jpeg"}}, "100"=>{"id"=>"a1ce120dd1ce311f8c7ccaefd6aeab02.jpg", "storage"=>"user_avatar_store", "metadata"=>{"size"=>3032, "width"=>100, "height"=>100, "filename"=>"image_processing20190805-29116-1cwlcfc.jpg", "mime_type"=>"image/jpeg"}}, "200"=>{"id"=>"f169756c5b77a5c2fb496a9cad9e48d7.jpg", "storage"=>"user_avatar_store", "metadata"=>{"size"=>5965, "width"=>200, "height"=>200, "filename"=>"image_processing20190805-29116-hvmc56.jpg", "mime_type"=>"image/jpeg"}}, "400"=>{"id"=>"4db360b3aec63452b382881c603a37e5.jpg", "storage"=>"user_avatar_store", "metadata"=>{"size"=>11670, "width"=>400, "height"=>400, "filename"=>"image_processing20190805-29116-h0sc22.jpg", "mime_type"=>"image/jpeg"}}, "original"=>{"id"=>"0e27c1adf559c1cdb573a9e484da406a", "storage"=>"user_avatar_store", "metadata"=>{"size"=>21527, "width"=>1024, "height"=>1024, "filename"=>nil, "mime_type"=>"image/png"}}} isn't valid uploaded file data)
irb(main):011:0> 
I also tried having both the versions and derivatives plugins set up on the attacher at the same time, then calling User.last.avatar_derivatives!, but that didn't work either:
irb(main):004:0> User.last.avatar_derivatives!
Traceback (most recent call last):
        2: from (irb):4
        1: from app/uploaders/user_avatar_uploader.rb:28:in `block in <class:UserAvatarUploader>'
ImageProcessing::Error (invalid source: {:"50"=>#<UserAvatarUploader::UploadedFile storage=:user_avatar_store id="47f058aa5bb221865ecbc174e9ea8a43.jpg" metadata={"size"=>1506, "width"=>50, "height"=>50, "filename"=>"image_processing20190805-29116-70z2zj.jpg", "mime_type"=>"image/jpeg"}>, :"100"=>#<UserAvatarUploader::UploadedFile storage=:user_avatar_store id="a1ce120dd1ce311f8c7ccaefd6aeab02.jpg" metadata={"size"=>3032, "width"=>100, "height"=>100, "filename"=>"image_processing20190805-29116-1cwlcfc.jpg", "mime_type"=>"image/jpeg"}>, :"200"=>#<UserAvatarUploader::UploadedFile storage=:user_avatar_store id="f169756c5b77a5c2fb496a9cad9e48d7.jpg" metadata={"size"=>5965, "width"=>200, "height"=>200, "filename"=>"image_processing20190805-29116-hvmc56.jpg", "mime_type"=>"image/jpeg"}>, :"400"=>#<UserAvatarUploader::UploadedFile storage=:user_avatar_store id="4db360b3aec63452b382881c603a37e5.jpg" metadata={"size"=>11670, "width"=>400, "height"=>400, "filename"=>"image_processing20190805-29116-h0sc22.jpg", "mime_type"=>"image/jpeg"}>, :original=>#<UserAvatarUploader::UploadedFile storage=:user_avatar_store id="0e27c1adf559c1cdb573a9e484da406a" metadata={"size"=>21527, "width"=>1024, "height"=>1024, "filename"=>nil, "mime_type"=>"image/png"}>})
What is the correct way to migrate?