module Shrine::Plugins::Derivatives::ClassMethods

Public Instance Methods

derivatives(object) click to toggle source

Converts data into a Hash of derivatives.

Shrine.derivatives('{"thumb":{"id":"foo","storage":"store","metadata":{}}}')
#=> { thumb: #<Shrine::UploadedFile id="foo" storage=:store metadata={}> }

Shrine.derivatives({ "thumb" => { "id" => "foo", "storage" => "store", "metadata" => {} } })
#=> { thumb: #<Shrine::UploadedFile id="foo" storage=:store metadata={}> }

Shrine.derivatives({ thumb: { id: "foo", storage: "store", metadata: {} } })
#=> { thumb: #<Shrine::UploadedFile id="foo" storage=:store metadata={}> }
# File lib/shrine/plugins/derivatives.rb, line 568
def derivatives(object)
  if object.is_a?(String)
    derivatives JSON.parse(object)
  elsif object.is_a?(Hash) || object.is_a?(Array)
    map_derivative(
      object,
      transform_keys: :to_sym,
      leaf: -> (value) { value.is_a?(Hash) && (value["id"] || value[:id]).is_a?(String) },
    ) { |_, value| uploaded_file(value) }
  else
    fail ArgumentError, "cannot convert #{object.inspect} to derivatives"
  end
end
derivatives_options() click to toggle source

Returns derivatives plugin options.

# File lib/shrine/plugins/derivatives.rb, line 613
def derivatives_options
  opts[:derivatives]
end
map_derivative(object, path = [], transform_keys: :to_sym, leaf: nil) { |path, object| ... } click to toggle source

Iterates over a nested collection, yielding on each part of the path. If the block returns a truthy value, that branch is terminated

# File lib/shrine/plugins/derivatives.rb, line 584
def map_derivative(object, path = [], transform_keys: :to_sym, leaf: nil, &block)
  return enum_for(__method__, object) unless block_given?

  if leaf && leaf.call(object)
    yield path, object
  elsif object.is_a?(Hash)
    object.inject({}) do |hash, (key, value)|
      key = key.send(transform_keys)

      hash.merge! key => map_derivative(
        value, [*path, key],
        transform_keys: transform_keys, leaf: leaf,
        &block
      )
    end
  elsif object.is_a?(Array)
    object.map.with_index do |value, idx|
      map_derivative(
        value, [*path, idx],
        transform_keys: transform_keys, leaf: leaf,
        &block
      )
    end
  else
    yield path, object
  end
end