cloudinary 1.0.37 → 1.0.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -0
- data/lib/cloudinary/api.rb +1 -1
- data/lib/cloudinary/carrier_wave.rb +14 -9
- data/lib/cloudinary/carrier_wave/storage.rb +2 -1
- data/lib/cloudinary/downloader.rb +13 -6
- data/lib/cloudinary/migrator.rb +2 -1
- data/lib/cloudinary/uploader.rb +6 -5
- data/lib/cloudinary/utils.rb +26 -9
- data/lib/cloudinary/version.rb +1 -1
- data/spec/utils_spec.rb +14 -0
- metadata +2 -2
data/.gitignore
CHANGED
data/lib/cloudinary/api.rb
CHANGED
@@ -40,7 +40,7 @@ class Cloudinary::Api
|
|
40
40
|
resource_type = options[:resource_type] || "image"
|
41
41
|
type = options[:type] || "upload"
|
42
42
|
uri = "resources/#{resource_type}/#{type}/#{public_id}"
|
43
|
-
call_api(:get, uri,
|
43
|
+
call_api(:get, uri, only(options, :colors, :exif, :faces), options)
|
44
44
|
end
|
45
45
|
|
46
46
|
def self.delete_resources(public_ids, options={})
|
@@ -46,12 +46,8 @@ module Cloudinary::CarrierWave
|
|
46
46
|
options = args.extract_options!
|
47
47
|
options = self.transformation.merge(options) if self.version_name.present?
|
48
48
|
|
49
|
-
resource_type = Cloudinary::Utils.resource_type_for_format(self.format)
|
50
|
-
|
51
|
-
Cloudinary::Utils.signed_download_url(public_id, {:format=>self.format, :resource_type=>resource_type}.merge(options))
|
52
|
-
else
|
53
|
-
Cloudinary::Utils.cloudinary_url(public_id, {:format=>self.format, :resource_type=>resource_type, :type=>self.class.storage_type}.merge(options))
|
54
|
-
end
|
49
|
+
resource_type = Cloudinary::Utils.resource_type_for_format(self.filename || self.format)
|
50
|
+
Cloudinary::Utils.cloudinary_url(public_id, {:format=>self.format, :resource_type=>resource_type, :type=>self.storage_type}.merge(options))
|
55
51
|
end
|
56
52
|
end
|
57
53
|
|
@@ -109,10 +105,11 @@ module Cloudinary::CarrierWave
|
|
109
105
|
end
|
110
106
|
|
111
107
|
class CloudinaryFile
|
112
|
-
attr_reader :identifier, :public_id, :filename, :format, :version, :storage_type
|
108
|
+
attr_reader :identifier, :public_id, :filename, :format, :version, :storage_type, :resource_type
|
113
109
|
def initialize(identifier, uploader)
|
114
110
|
@uploader = uploader
|
115
111
|
@identifier = identifier
|
112
|
+
|
116
113
|
if @identifier.include?("/")
|
117
114
|
version, @filename = @identifier.split("/")
|
118
115
|
@version = version[1..-1] # remove 'v' prefix
|
@@ -120,17 +117,25 @@ module Cloudinary::CarrierWave
|
|
120
117
|
@filename = @identifier
|
121
118
|
@version = nil
|
122
119
|
end
|
120
|
+
|
123
121
|
@storage_type = uploader.class.storage_type
|
122
|
+
@resource_type = Cloudinary::Utils.resource_type_for_format(@filename)
|
124
123
|
@public_id, @format = Cloudinary::CarrierWave.split_format(@filename)
|
125
124
|
end
|
126
125
|
|
127
126
|
def delete
|
128
|
-
Cloudinary::Uploader.destroy(self.public_id) if @uploader.delete_remote?
|
127
|
+
Cloudinary::Uploader.destroy(self.public_id, :type=>self.storage_type, :resource_type=>self.resource_type) if @uploader.delete_remote?
|
129
128
|
end
|
130
129
|
|
131
130
|
def exists?
|
132
|
-
Cloudinary::Uploader.exists?(self.identifier, :type=>self.storage_type)
|
131
|
+
Cloudinary::Uploader.exists?(self.identifier, :type=>self.storage_type, :resource_type=>self.resource_type)
|
133
132
|
end
|
133
|
+
|
134
|
+
def read(options={})
|
135
|
+
parameters={:type=>self.storage_type, :resource_type=>self.resource_type}.merge(options)
|
136
|
+
Cloudinary::Downloader.download(self.identifier, parameters)
|
137
|
+
end
|
138
|
+
|
134
139
|
end
|
135
140
|
|
136
141
|
def self.split_format(identifier)
|
@@ -25,6 +25,7 @@ class Cloudinary::CarrierWave::Storage < ::CarrierWave::Storage::Abstract
|
|
25
25
|
eager_versions = uploader.versions.values.select(&:eager)
|
26
26
|
params[:eager] = eager_versions.map{|version| [version.transformation, version.format]} if eager_versions.length > 0
|
27
27
|
params[:type]=uploader.class.storage_type
|
28
|
+
|
28
29
|
params[:resource_type] ||= :auto
|
29
30
|
|
30
31
|
uploader.metadata = Cloudinary::Uploader.upload(data, params)
|
@@ -58,5 +59,5 @@ class Cloudinary::CarrierWave::Storage < ::CarrierWave::Storage::Abstract
|
|
58
59
|
else
|
59
60
|
raise "Only ActiveRecord and Mongoid are supported at the moment!"
|
60
61
|
end
|
61
|
-
end
|
62
|
+
end
|
62
63
|
end
|
@@ -3,19 +3,26 @@ class Cloudinary::Downloader
|
|
3
3
|
|
4
4
|
def self.download(source, options={})
|
5
5
|
options = options.clone
|
6
|
+
|
6
7
|
if !source.match(/^https?:\/\//i)
|
7
|
-
source = Cloudinary::Utils.cloudinary_url(source, options)
|
8
|
+
source = Cloudinary::Utils.cloudinary_url(source, options)
|
8
9
|
end
|
9
|
-
|
10
|
-
|
10
|
+
|
11
|
+
|
12
|
+
url = URI.parse(source)
|
11
13
|
http = Net::HTTP.new(url.host, url.port)
|
12
|
-
req = Net::HTTP::Get.new(url.
|
14
|
+
req = Net::HTTP::Get.new(url.request_uri)
|
15
|
+
|
13
16
|
if url.port == 443
|
14
17
|
http.use_ssl=true
|
15
18
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
16
19
|
end
|
17
|
-
|
18
|
-
|
20
|
+
|
21
|
+
res = http.start{|agent|
|
22
|
+
agent.request(req)
|
23
|
+
}
|
24
|
+
|
25
|
+
return res.body
|
19
26
|
end
|
20
27
|
|
21
28
|
end
|
data/lib/cloudinary/migrator.rb
CHANGED
@@ -72,6 +72,7 @@ class Cloudinary::Migrator
|
|
72
72
|
public_id
|
73
73
|
)
|
74
74
|
"
|
75
|
+
|
75
76
|
if options[:reset_queue]
|
76
77
|
@db.execute("delete from queue")
|
77
78
|
end
|
@@ -262,7 +263,7 @@ class Cloudinary::Migrator
|
|
262
263
|
# Skip
|
263
264
|
elsif data.match(/^https?:/)
|
264
265
|
url = data
|
265
|
-
else
|
266
|
+
else
|
266
267
|
file = main.temporary_file(data, row["public_id"] || "cloudinaryfile")
|
267
268
|
end
|
268
269
|
end
|
data/lib/cloudinary/uploader.rb
CHANGED
@@ -53,12 +53,13 @@ class Cloudinary::Uploader
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def self.exists?(public_id, options={})
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
cloudinary_url = Cloudinary::Utils.cloudinary_url(public_id, options)
|
57
|
+
begin
|
58
|
+
RestClient::Request.execute(:method => :head, :url => cloudinary_url, :timeout=>5).code.to_s =~ /2\d{2}/
|
59
|
+
rescue RestClient::ResourceNotFound => e
|
60
|
+
return false
|
60
61
|
end
|
61
|
-
|
62
|
+
|
62
63
|
end
|
63
64
|
|
64
65
|
def self.explicit(public_id, options={})
|
data/lib/cloudinary/utils.rb
CHANGED
@@ -48,9 +48,14 @@ class Cloudinary::Utils
|
|
48
48
|
effect = options.delete(:effect)
|
49
49
|
effect = Array(effect).flatten.join(":") if effect.is_a?(Array) || effect.is_a?(Hash)
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
border = options.delete(:border)
|
52
|
+
if border.is_a?(Hash)
|
53
|
+
border = "#{border[:width] || 2}px_solid_#{(border[:color] || "black").sub(/^#/, 'rgb:')}"
|
54
|
+
end
|
55
|
+
|
56
|
+
params = {:w=>width, :h=>height, :t=>named_transformation, :c=>crop, :b=>background, :e=>effect, :a=>angle, :bo=>border}
|
57
|
+
{ :x=>:x, :y=>:y, :r=>:radius, :d=>:default_image, :g=>:gravity, :q=>:quality, :cs=>:color_space,
|
58
|
+
:p=>:prefix, :l=>:overlay, :u=>:underlay, :f=>:fetch_format, :dn=>:density, :pg=>:page, :dl=>:delay
|
54
59
|
}.each do
|
55
60
|
|param, option|
|
56
61
|
params[param] = options.delete(option)
|
@@ -72,7 +77,8 @@ class Cloudinary::Utils
|
|
72
77
|
end
|
73
78
|
|
74
79
|
# Warning: options are being destructively updated!
|
75
|
-
def self.
|
80
|
+
def self.unsigned_download_url(source, options = {})
|
81
|
+
|
76
82
|
type = options.delete(:type)
|
77
83
|
|
78
84
|
options[:fetch_format] ||= options.delete(:format) if type == :fetch
|
@@ -81,7 +87,6 @@ class Cloudinary::Utils
|
|
81
87
|
resource_type = options.delete(:resource_type) || "image"
|
82
88
|
version = options.delete(:version)
|
83
89
|
format = options.delete(:format)
|
84
|
-
|
85
90
|
cloud_name = options.delete(:cloud_name) || Cloudinary.config.cloud_name || raise("Must supply cloud_name in tag or in configuration")
|
86
91
|
secure = options.delete(:secure)
|
87
92
|
ssl_detected = options.delete(:ssl_detected)
|
@@ -94,6 +99,7 @@ class Cloudinary::Utils
|
|
94
99
|
|
95
100
|
original_source = source
|
96
101
|
return original_source if source.blank?
|
102
|
+
source = source.to_s
|
97
103
|
if !force_remote
|
98
104
|
return original_source if (type.nil? || type == :asset) && source.match(%r(^https?:/)i)
|
99
105
|
if source.start_with?("/")
|
@@ -120,7 +126,7 @@ class Cloudinary::Utils
|
|
120
126
|
elsif !format.blank?
|
121
127
|
source = "#{source}.#{format}"
|
122
128
|
end
|
123
|
-
|
129
|
+
|
124
130
|
if cloud_name.start_with?("/")
|
125
131
|
prefix = "/res" + cloud_name
|
126
132
|
else
|
@@ -178,11 +184,20 @@ class Cloudinary::Utils
|
|
178
184
|
authenticated_distribution = options[:authenticated_distribution] || Cloudinary.config.authenticated_distribution || raise("Must supply authenticated_distribution")
|
179
185
|
@signers ||= Hash.new{|h,k| path, id = k; h[k] = AwsCfSigner.new(path, id)}
|
180
186
|
signer = @signers[[aws_private_key_path, aws_key_pair_id]]
|
181
|
-
url = Cloudinary::Utils.
|
187
|
+
url = Cloudinary::Utils.unsigned_download_url(public_id, {:type=>:authenticated}.merge(options).merge(:secure=>true, :secure_distribution=>authenticated_distribution, :private_cdn=>true))
|
182
188
|
expires_at = options[:expires_at] || (Time.now+3600)
|
183
189
|
signer.sign(url, :ending => expires_at)
|
184
190
|
end
|
185
191
|
|
192
|
+
def self.cloudinary_url(public_id, options = {})
|
193
|
+
if options[:type].to_s == 'authenticated'
|
194
|
+
result = signed_download_url(public_id, options)
|
195
|
+
else
|
196
|
+
result = unsigned_download_url(public_id, options)
|
197
|
+
end
|
198
|
+
return result
|
199
|
+
end
|
200
|
+
|
186
201
|
def self.asset_file_name(path)
|
187
202
|
data = Rails.root.join(path).read(:mode=>"rb")
|
188
203
|
ext = path.extname
|
@@ -232,10 +247,12 @@ class Cloudinary::Utils
|
|
232
247
|
end
|
233
248
|
end
|
234
249
|
|
235
|
-
IMAGE_FORMATS = %w(bmp png tif tiff jpg jpeg gif pdf ico)
|
250
|
+
IMAGE_FORMATS = %w(bmp png tif tiff jpg jpeg gif pdf ico eps)
|
236
251
|
|
237
252
|
def self.supported_image_format?(format)
|
238
|
-
|
253
|
+
format = format.to_s.downcase
|
254
|
+
extension = format =~ /\./ ? format.split('.').last : format
|
255
|
+
IMAGE_FORMATS.include?(extension)
|
239
256
|
end
|
240
257
|
|
241
258
|
def self.resource_type_for_format(format)
|
data/lib/cloudinary/version.rb
CHANGED
data/spec/utils_spec.rb
CHANGED
@@ -310,4 +310,18 @@ describe Cloudinary::Utils do
|
|
310
310
|
result.should == "http://res.cloudinary.com/test123/image/upload/e_sepia:10/test"
|
311
311
|
end
|
312
312
|
|
313
|
+
it "should support border" do
|
314
|
+
options = {"border"=>{:width=>5}}
|
315
|
+
result = Cloudinary::Utils.cloudinary_url("test", options)
|
316
|
+
options.should == {}
|
317
|
+
result.should == "http://res.cloudinary.com/test123/image/upload/bo_5px_solid_black/test"
|
318
|
+
options = {"border"=>{:width=>5, :color=>"#ffaabbdd"}}
|
319
|
+
result = Cloudinary::Utils.cloudinary_url("test", options)
|
320
|
+
options.should == {}
|
321
|
+
result.should == "http://res.cloudinary.com/test123/image/upload/bo_5px_solid_rgb:ffaabbdd/test"
|
322
|
+
options = {"border"=>"1px_solid_blue"}
|
323
|
+
result = Cloudinary::Utils.cloudinary_url("test", options)
|
324
|
+
options.should == {}
|
325
|
+
result.should == "http://res.cloudinary.com/test123/image/upload/bo_1px_solid_blue/test"
|
326
|
+
end
|
313
327
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cloudinary
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.38
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-
|
14
|
+
date: 2012-10-02 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rest-client
|