module Shrine::Plugins::Versions::Utils

Public Instance Methods

deep_map(object, path = [], transform_keys:) { |path, object| ... } click to toggle source
# File lib/shrine/plugins/versions.rb, line 143
def deep_map(object, path = [], transform_keys:, &block)
  if object.is_a?(Hash)
    result = yield path, object

    return result if result

    object.inject({}) do |hash, (key, value)|
      key    = key.send(transform_keys)
      result = yield [*path, key], value

      hash.merge! key => (result || deep_map(value, [*path, key], transform_keys: transform_keys, &block))
    end
  elsif object.is_a?(Array)
    result = yield path, object

    return result if result

    object.map.with_index do |value, idx|
      result = yield [*path, idx], value

      result || deep_map(value, [*path, idx], transform_keys: transform_keys, &block)
    end
  else
    result = yield path, object
    result or fail Shrine::Error, "leaf reached"
  end
end
each_file(object) { |path, file| ... } click to toggle source
# File lib/shrine/plugins/versions.rb, line 122
def each_file(object)
  return enum_for(__method__, object) unless block_given?

  map_file(object) do |path, file|
    yield path, file
    file
  end
end
map_file(object, transform_keys: :to_sym) { |path, value| ... } click to toggle source
# File lib/shrine/plugins/versions.rb, line 131
def map_file(object, transform_keys: :to_sym)
  if object.is_a?(Hash) || object.is_a?(Array)
    deep_map(object, transform_keys: transform_keys) do |path, value|
      yield path, value unless value.is_a?(Hash) || value.is_a?(Array)
    end
  elsif object
    yield nil, object
  else
    object
  end
end