class Shrine::Storage::Cloudinary
Constants
- MIME_TYPES
Attributes
prefix[R]
resource_type[R]
type[R]
upload_options[R]
Public Class Methods
new(prefix: nil, resource_type: "image", type: "upload", store_data: nil, upload_options: {}, large: nil)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 10 def initialize(prefix: nil, resource_type: "image", type: "upload", store_data: nil, upload_options: {}, large: nil) @prefix = prefix @large = large @resource_type = resource_type @type = type @upload_options = upload_options @store_data = store_data end
Public Instance Methods
clear!(**options)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 55 def clear!(**options) if prefix api.delete_resources_by_prefix(prefix, **options) else api.delete_all_resources(**options) end end
delete(id)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 47 def delete(id) uploader.destroy(public_id(id)) end
exists?(id)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 42 def exists?(id) result = api.resources_by_ids([public_id(id)]) result.fetch("resources").any? end
open(id, **options)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 36 def open(id, **options) Down::Http.open(url(id, sign_url: true), **options) rescue Down::NotFound raise Shrine::FileNotFound, "file #{id.inspect} not found on storage" end
presign(id = nil, **presign_options)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 63 def presign(id = nil, **presign_options) options = id ? { public_id: public_id(id) } : { folder: prefix } options.merge!(@upload_options) options.merge!(presign_options) fields = ::Cloudinary::Uploader.build_upload_params(options) fields.reject! { |key, value| value.nil? || value == "" } fields[:signature] = ::Cloudinary::Utils.api_sign_request(fields, ::Cloudinary.config.api_secret) fields[:api_key] = ::Cloudinary.config.api_key url = utils.cloudinary_api_url("upload") { method: :post, url: url, fields: fields } end
update(id, **options)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 32 def update(id, **options) uploader.explicit(public_id(id), **options) end
upload(io, id, shrine_metadata: {}, **upload_options)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 19 def upload(io, id, shrine_metadata: {}, **upload_options) options = { public_id: public_id(id) } options.merge!(@upload_options) options.merge!(upload_options) result = store(io, **options) update_id!(result, id) update_metadata!(result, shrine_metadata) result end
url(id, **options)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 51 def url(id, **options) utils.cloudinary_url(path(id), secure: true, **options) end
Protected Instance Methods
path(id)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 88 def path(id) [*prefix, id].join("/") end
public_id(id)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 80 def public_id(id) if resource_type == "raw" path(id) else path(id).chomp(File.extname(id)) end end
Private Instance Methods
api()
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 109 def api; Delegator.new(::Cloudinary::Api, default_options); end
default_options()
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 120 def default_options { resource_type: resource_type, type: type } end
large?(io)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 116 def large?(io) io.size >= @large if @large end
remote?(io)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 112 def remote?(io) io.is_a?(UploadedFile) && io.url.to_s =~ /^ftp:|^https?:/ end
store(io, chunk_size: nil, **options)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 94 def store(io, chunk_size: nil, **options) if remote?(io) uploader.upload(io.url, **options) else Shrine.with_file(io) do |file| if large?(file) uploader.upload_large(file, chunk_size: chunk_size, **options) else uploader.upload(file, **options) end end end end
update_id!(result, id)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 124 def update_id!(result, id) uploaded_id = result.fetch("public_id") uploaded_id = uploaded_id.match("#{prefix}/").post_match if prefix uploaded_id += ".#{result["format"]}" if result["format"] id.replace(uploaded_id) end
update_metadata!(result, metadata)
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 132 def update_metadata!(result, metadata) retrieved_metadata = { "size" => result["bytes"], "mime_type" => MIME_TYPES[result["format"]], "width" => result["width"], "height" => result["height"], } retrieved_metadata["cloudinary"] = result if @store_data retrieved_metadata.reject! { |key, value| value.nil? } metadata.update(retrieved_metadata) end
uploader()
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 108 def uploader; Delegator.new(::Cloudinary::Uploader, default_options); end
utils()
click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 110 def utils; Delegator.new(::Cloudinary::Utils, default_options); end