class Shrine::Storage::Fog

Attributes

connection[R]
directory[R]
prefix[R]

Public Class Methods

new(directory:, prefix: nil, connection: nil, upload_options: {}, **options) click to toggle source
# File lib/shrine/storage/fog.rb, line 10
def initialize(directory:, prefix: nil, connection: nil, upload_options: {}, **options)
  @connection = connection || ::Fog::Storage.new(options)
  @directory = @connection.directories.new(key: directory)
  @prefix = prefix
  @upload_options = upload_options
end

Public Instance Methods

clear!() click to toggle source
# File lib/shrine/storage/fog.rb, line 51
def clear!
  list.each(&:destroy)
end
delete(id) click to toggle source
# File lib/shrine/storage/fog.rb, line 35
def delete(id)
  file(id).destroy
end
exists?(id) click to toggle source
# File lib/shrine/storage/fog.rb, line 31
def exists?(id)
  !!head(id)
end
open(id, **options) click to toggle source
# File lib/shrine/storage/fog.rb, line 25
def open(id, **options)
  Down::Http.open(url(id), **options)
rescue Down::NotFound
  raise Shrine::FileNotFound, "file #{id.inspect} not found on storage"
end
upload(io, id, **upload_options) click to toggle source
# File lib/shrine/storage/fog.rb, line 17
def upload(io, id, **upload_options)
  if copyable?(io)
    copy(io, id, **upload_options)
  else
    put(io, id, **upload_options)
  end
end
url(id, public: false, expires: 3600, **options) click to toggle source
# File lib/shrine/storage/fog.rb, line 39
def url(id, public: false, expires: 3600, **options)
  signed_url = file(id).url(Time.now.utc + expires, *[**options])

  if public
    uri = URI.parse(signed_url)
    uri.query = nil
    uri.to_s
  else
    signed_url
  end
end

Protected Instance Methods

file(id) click to toggle source
# File lib/shrine/storage/fog.rb, line 57
def file(id)
  directory.files.new(key: path(id))
end
get(id, &block) click to toggle source
# File lib/shrine/storage/fog.rb, line 61
def get(id, &block)
  directory.files.get(path(id), &block)
end
head(id) click to toggle source
# File lib/shrine/storage/fog.rb, line 65
def head(id)
  directory.files.head(path(id))
end
provider() click to toggle source
# File lib/shrine/storage/fog.rb, line 69
def provider
  connection.class
end

Private Instance Methods

copy(io, id, **upload_options) click to toggle source
# File lib/shrine/storage/fog.rb, line 91
def copy(io, id, **upload_options)
  io.storage.head(io.id).copy(directory.key, path(id))
end
copyable?(io) click to toggle source
# File lib/shrine/storage/fog.rb, line 95
def copyable?(io)
  io.respond_to?(:storage) &&
  io.storage.is_a?(Storage::Fog) &&
  io.storage.provider == provider
end
list() click to toggle source
# File lib/shrine/storage/fog.rb, line 75
def list
  directory.files.select { |file| file.key.start_with?(prefix.to_s) }
end
path(id) click to toggle source
# File lib/shrine/storage/fog.rb, line 79
def path(id)
  [*prefix, id].join("/")
end
put(io, id, shrine_metadata: {}, **upload_options) click to toggle source
# File lib/shrine/storage/fog.rb, line 83
def put(io, id, shrine_metadata: {}, **upload_options)
  options = { content_type: shrine_metadata["mime_type"] }
  options.update(@upload_options)
  options.update(upload_options)

  directory.files.create(key: path(id), body: io, **options)
end