# Copyright Cloudinary
require'cloudinary/carrier_wave/process'require'cloudinary/carrier_wave/error'require'cloudinary/carrier_wave/remote'require'cloudinary/carrier_wave/preloaded'require'cloudinary/carrier_wave/storage'ifdefined?(::CarrierWave)# HACK
moduleCloudinary::CarrierWavedefself.included(base)base.storageCloudinary::CarrierWave::Storagebase.cache_storage=:fileifbase.cache_storage.blank?base.extendClassMethodsbase.class_attribute:metadatabase.class_attribute:storage_type,instance_reader: falseoverride_in_versions(base,:blank?,:full_public_id,:my_public_id,:all_versions_processors,:stored_version)enddefis_main_uploader?self.class.version_names.blank?enddefstored_version@stored_versionenddefretrieve_from_store!(identifier)# Workaround cloudinary-mongoid hack of setting column to _old_ before saving it.
mongoid_blank=defined?(Mongoid::Extensions::Object)&&self.is_a?(Mongoid::Extensions::Object)&&identifier=="_old_"ifidentifier.blank?||mongoid_blank@file=@stored_version=@stored_public_id=nilself.original_filename=nilelse@file=CloudinaryFile.new(identifier,self)@public_id=@stored_public_id=@file.public_id@stored_version=@file.versionself.original_filename=sanitize(@file.filename)endenddefurl(*args)ifargs.first&&!args.first.is_a?(Hash)superelseoptions=args.extract_options!ifself.blank?url=self.default_urlreturnurlif!url.blank?public_id=self.default_public_idreturnnilifpublic_id.nil?elsepublic_id=self.my_public_idoptions[:version]||=self.stored_versionendoptions=self.transformation.merge(options)ifself.version_name.present?Cloudinary::Utils.cloudinary_url(public_id,{:format=>self.format,:resource_type=>self.resource_type,:type=>self.storage_type}.merge(options))endenddeffull_public_idreturnnilifself.blank?returnself.my_public_idifself.stored_version.blank?return"v#{self.stored_version}/#{self.my_public_id}"enddeffilenamereturnnilifself.blank?return[self.full_public_id,self.format].reject(&:blank?).join(".")end# default public_id to use if no uploaded file. Override with public_id of an uploaded image if you want a default image.
defdefault_public_idnilend# public_id to use for uploaded file. Can be overridden by caller. Random public_id will be used otherwise.
defpublic_idnilend# If the user overrode public_id, that should be used, even if it's different from current public_id in the database.
# Otherwise, try to use public_id from the database.
# Otherwise, generate a new random public_id
defmy_public_id@public_id||=self.public_id@public_id||=@stored_public_id@public_id||=Cloudinary::Utils.random_public_idenddefrename(to_public_id=nil,overwrite=false)public_id_overwrite=self.public_idto_public_id||=public_id_overwriteifpublic_id_overwrite&&to_public_id!=public_id_overwriteraiseCloudinaryException,"The public_id method was overridden and returns #{public_id_overwrite} - can't rename to #{to_public_id}"elsifto_public_id.nil?raiseCloudinaryException,"No to_public_id given"endfrom_public_id=@stored_public_id||self.my_public_idreturniffrom_public_id==to_public_id@public_id=@stored_public_id=to_public_idifself.resource_type=='raw'from_public_id=[from_public_id,self.format].join(".")to_public_id=[to_public_id,self.format].join(".")endCloudinary::Uploader.rename(from_public_id,to_public_id,:type=>self.storage_type,:resource_type=>self.resource_type,:overwrite=>overwrite)storage.store_cloudinary_identifier(@stored_version,[@public_id,self.format].join("."))enddefrecreate_versions!# Do nothing
enddefcache_versions!(new_file=nil)# Do nothing
enddefprocess!(new_file=nil)# Do nothing
endSANITIZE_REGEXP=CarrierWave::SanitizedFile.respond_to?(:sanitize_regexp)?CarrierWave::SanitizedFile.sanitize_regexp:/[^a-zA-Z0-9\.\-\+_]/defsanitize(filename)returnniliffilename.nil?filename.gsub(SANITIZE_REGEXP,'_')end# Should removed files be removed from Cloudinary as well. Can be overridden.
defdelete_remote?trueend# Let Cloudinary download remote URLs directly
defcloudinary_should_handle_remote?trueend# Rename preloaded uploads if public_id was overridden
defauto_rename_preloaded?trueend# Use extended identifier format that includes resource type and storage type.
defuse_extended_identifier?trueendclassCloudinaryFileattr_reader:identifier,:public_id,:filename,:format,:version,:storage_type,:resource_typedefinitialize(identifier,uploader)@uploader=uploader@identifier=identifierif@identifier.match(%r(^(image|raw|video)/(upload|private|authenticated)(?:/v([0-9]+))?/(.*)))@resource_type=$1@storage_type=$2@version=$3.presence@filename=$4elsif@identifier.match(%r(^v([0-9]+)/(.*)))@version=$1@filename=$2else@filename=@identifier@version=nilend@storage_type||=uploader.class.storage_type@resource_type||=Cloudinary::Utils.resource_type_for_format(@filename)@public_id,@format=Cloudinary::PreloadedFile.split_format(@filename)enddefstorage_identifieridentifierenddefdeletepublic_id=@resource_type=="raw"?self.filename:self.public_idCloudinary::Uploader.destroy(public_id,:type=>self.storage_type,:resource_type=>self.resource_type)if@uploader.delete_remote?enddefexists?public_id=@resource_type=="raw"?self.filename:self.public_idCloudinary::Uploader.exists?(public_id,:version=>self.version,:type=>self.storage_type,:resource_type=>self.resource_type)enddefread(options={})parameters={:type=>self.storage_type,:resource_type=>self.resource_type}.merge(options)Cloudinary::Downloader.download(self.identifier,parameters)endenddefdefault_format"png"enddefstorage_type@file.respond_to?(:storage_type)?@file.storage_type:self.class.storage_typeenddefresource_type@file.respond_to?(:resource_type)?@file.resource_type:Cloudinary::Utils.resource_type_for_format(requested_format||original_filename||default_format)end# For the given methods - versions should call the main uploader method
defself.override_in_versions(base,*methods)methods.eachdo|method|base.send:define_method,methoddoreturnsuper()ifself.version_name.blank?uploader=self.model.send(self.mounted_as)uploader.send(method)endendendend