cloudinary 1.0.70 → 1.0.71
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/CHANGELOG +7 -0
- data/lib/cloudinary/api.rb +24 -1
- data/lib/cloudinary/helper.rb +16 -1
- data/lib/cloudinary/uploader.rb +15 -3
- data/lib/cloudinary/utils.rb +5 -1
- data/lib/cloudinary/version.rb +1 -1
- data/spec/api_spec.rb +57 -8
- data/spec/uploader_spec.rb +11 -8
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
= Version 1.0.71 - 2014-04-15
|
2
|
+
* Upload preset support.
|
3
|
+
* Unsigned upload support.
|
4
|
+
* phash upload parameter support.
|
5
|
+
* Resource listing by start_at support.
|
6
|
+
* Updating to jQuery plugin v1.0.14.
|
7
|
+
|
1
8
|
= Version 1.0.70 - 2014-03-25
|
2
9
|
* Support upload_large without public_id.
|
3
10
|
* Remove public_id from method parameters.
|
data/lib/cloudinary/api.rb
CHANGED
@@ -36,7 +36,7 @@ class Cloudinary::Api
|
|
36
36
|
type = options[:type]
|
37
37
|
uri = "resources/#{resource_type}"
|
38
38
|
uri += "/#{type}" if !type.blank?
|
39
|
-
call_api(:get, uri, only(options, :next_cursor, :max_results, :prefix, :tags, :context, :moderations, :direction), options)
|
39
|
+
call_api(:get, uri, only(options, :next_cursor, :max_results, :prefix, :tags, :context, :moderations, :direction, :start_at), options)
|
40
40
|
end
|
41
41
|
|
42
42
|
def self.resources_by_tag(tag, options={})
|
@@ -147,6 +147,29 @@ class Cloudinary::Api
|
|
147
147
|
call_api(:post, "transformations/#{name}", {:transformation=>transformation_string(definition)}, options)
|
148
148
|
end
|
149
149
|
|
150
|
+
# upload presets
|
151
|
+
def self.upload_presets(options={})
|
152
|
+
call_api(:get, "upload_presets", only(options, :next_cursor, :max_results), options)
|
153
|
+
end
|
154
|
+
|
155
|
+
def self.upload_preset(name, options={})
|
156
|
+
call_api(:get, "upload_presets/#{name}", only(options, :max_results), options)
|
157
|
+
end
|
158
|
+
|
159
|
+
def self.delete_upload_preset(name, options={})
|
160
|
+
call_api(:delete, "upload_presets/#{name}", {}, options)
|
161
|
+
end
|
162
|
+
|
163
|
+
def self.update_upload_preset(name, options={})
|
164
|
+
params = Cloudinary::Uploader.build_upload_params(options)
|
165
|
+
call_api(:put, "upload_presets/#{name}", params.merge(only(options, :unsigned, :disallow_public_id)), options)
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.create_upload_preset(options={})
|
169
|
+
params = Cloudinary::Uploader.build_upload_params(options)
|
170
|
+
call_api(:post, "upload_presets", params.merge(only(options, :name, :unsigned, :disallow_public_id)), options)
|
171
|
+
end
|
172
|
+
|
150
173
|
protected
|
151
174
|
|
152
175
|
def self.call_api(method, uri, params, options)
|
data/lib/cloudinary/helper.rb
CHANGED
@@ -158,6 +158,10 @@ module CloudinaryHelper
|
|
158
158
|
cl_image_upload_tag("#{object_name}[#{method}]", options)
|
159
159
|
end
|
160
160
|
|
161
|
+
def cl_unsigned_image_upload(object_name, method, upload_preset, options={})
|
162
|
+
cl_unsigned_image_upload_tag("#{object_name}[#{method}]", upload_preset, options)
|
163
|
+
end
|
164
|
+
|
161
165
|
def cl_upload_url(options={})
|
162
166
|
Cloudinary::Utils.cloudinary_api_url("upload", {:resource_type=>:auto}.merge(options))
|
163
167
|
end
|
@@ -165,7 +169,11 @@ module CloudinaryHelper
|
|
165
169
|
def cl_upload_tag_params(options={})
|
166
170
|
cloudinary_params = Cloudinary::Uploader.build_upload_params(options)
|
167
171
|
cloudinary_params[:callback] = build_callback_url(options)
|
168
|
-
|
172
|
+
if options[:unsigned]
|
173
|
+
return cloudinary_params.reject{|k, v| Cloudinary::Utils.safe_blank?(v)}.to_json
|
174
|
+
else
|
175
|
+
return Cloudinary::Utils.sign_request(cloudinary_params, options).to_json
|
176
|
+
end
|
169
177
|
end
|
170
178
|
|
171
179
|
def cl_image_upload_tag(field, options={})
|
@@ -180,6 +188,10 @@ module CloudinaryHelper
|
|
180
188
|
content_tag("input", nil, tag_options)
|
181
189
|
end
|
182
190
|
|
191
|
+
def cl_unsigned_image_upload_tag(field, upload_preset, options={})
|
192
|
+
cl_image_upload_tag(field, options.merge(:unsigned => true, :upload_preset => upload_preset))
|
193
|
+
end
|
194
|
+
|
183
195
|
def cl_private_download_url(public_id, format, options = {})
|
184
196
|
Cloudinary::Utils.private_download_url(public_id, format, options)
|
185
197
|
end
|
@@ -243,6 +255,9 @@ module Cloudinary::FormBuilder
|
|
243
255
|
def cl_image_upload(method, options={})
|
244
256
|
@template.cl_image_upload(@object_name, method, objectify_options(options))
|
245
257
|
end
|
258
|
+
def cl_unsigned_image_upload(method, upload_preset, options={})
|
259
|
+
@template.cl_unsigned_image_upload(@object_name, method, upload_preset, objectify_options(options))
|
260
|
+
end
|
246
261
|
end
|
247
262
|
|
248
263
|
if defined? ActionView::Helpers::AssetUrlHelper
|
data/lib/cloudinary/uploader.rb
CHANGED
@@ -15,6 +15,10 @@ class Cloudinary::Uploader
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.build_upload_params(options)
|
18
|
+
#symbolize keys
|
19
|
+
options = options.clone
|
20
|
+
options.keys.each{|key| options[key.to_sym] = options.delete(key) if key.is_a?(String)}
|
21
|
+
|
18
22
|
params = {:timestamp=>Time.now.to_i,
|
19
23
|
:transformation => Cloudinary::Utils.generate_transformation_string(options.clone),
|
20
24
|
:public_id=> options[:public_id],
|
@@ -48,9 +52,15 @@ class Cloudinary::Uploader
|
|
48
52
|
:categorization => options[:categorization],
|
49
53
|
:detection => options[:detection],
|
50
54
|
:similarity_search => options[:similarity_search],
|
51
|
-
:auto_tagging => options[:auto_tagging] && options[:auto_tagging].to_f
|
55
|
+
:auto_tagging => options[:auto_tagging] && options[:auto_tagging].to_f,
|
56
|
+
:upload_preset => options[:upload_preset],
|
57
|
+
:phash => Cloudinary::Utils.as_safe_bool(options[:phash])}
|
52
58
|
params
|
53
59
|
end
|
60
|
+
|
61
|
+
def self.unsigned_upload(file, upload_preset, options={})
|
62
|
+
upload(file, options.merge(:unsigned => true, :upload_preset => upload_preset))
|
63
|
+
end
|
54
64
|
|
55
65
|
def self.upload(file, options={})
|
56
66
|
call_api("upload", options) do
|
@@ -258,8 +268,10 @@ class Cloudinary::Uploader
|
|
258
268
|
params, non_signable = yield
|
259
269
|
non_signable ||= []
|
260
270
|
|
261
|
-
|
262
|
-
|
271
|
+
unless options[:unsigned]
|
272
|
+
params[:signature] = Cloudinary::Utils.api_sign_request(params.reject{|k,v| non_signable.include?(k)}, api_secret)
|
273
|
+
params[:api_key] = api_key
|
274
|
+
end
|
263
275
|
|
264
276
|
result = nil
|
265
277
|
|
data/lib/cloudinary/utils.rb
CHANGED
@@ -186,7 +186,7 @@ class Cloudinary::Utils
|
|
186
186
|
def self.sign_request(params, options={})
|
187
187
|
api_key = options[:api_key] || Cloudinary.config.api_key || raise(CloudinaryException, "Must supply api_key")
|
188
188
|
api_secret = options[:api_secret] || Cloudinary.config.api_secret || raise(CloudinaryException, "Must supply api_secret")
|
189
|
-
params = params.reject{|k, v|
|
189
|
+
params = params.reject{|k, v| self.class.safe_blank?(v)}
|
190
190
|
params[:signature] = Cloudinary::Utils.api_sign_request(params, api_secret)
|
191
191
|
params[:api_key] = api_key
|
192
192
|
params
|
@@ -328,4 +328,8 @@ class Cloudinary::Utils
|
|
328
328
|
when FalseClass then 0
|
329
329
|
end
|
330
330
|
end
|
331
|
+
|
332
|
+
def self.safe_blank?(value)
|
333
|
+
value.nil? || value == "" || value == []
|
334
|
+
end
|
331
335
|
end
|
data/lib/cloudinary/version.rb
CHANGED
data/spec/api_spec.rb
CHANGED
@@ -13,6 +13,10 @@ describe Cloudinary::Api do
|
|
13
13
|
@api.delete_transformation("api_test_transformation") rescue nil
|
14
14
|
@api.delete_transformation("api_test_transformation2") rescue nil
|
15
15
|
@api.delete_transformation("api_test_transformation3") rescue nil
|
16
|
+
@api.delete_upload_preset("api_test_upload_preset") rescue nil
|
17
|
+
@api.delete_upload_preset("api_test_upload_preset2") rescue nil
|
18
|
+
@api.delete_upload_preset("api_test_upload_preset3") rescue nil
|
19
|
+
@api.delete_upload_preset("api_test_upload_preset4") rescue nil
|
16
20
|
end
|
17
21
|
|
18
22
|
it "should allow listing resource_types" do
|
@@ -65,6 +69,15 @@ describe Cloudinary::Api do
|
|
65
69
|
resources.map{|resource| resource["context"]}.should include({"custom" => {"key" => "value"}})
|
66
70
|
end
|
67
71
|
|
72
|
+
it "should allow listing resources by start date", :start_at => true do
|
73
|
+
sleep(2)
|
74
|
+
start_at = Time.now.to_s
|
75
|
+
sleep(2)
|
76
|
+
response = Cloudinary::Uploader.upload("spec/logo.png")
|
77
|
+
resources = @api.resources(:type=>"upload", :start_at=>start_at, :direction => "asc")["resources"]
|
78
|
+
resources.map{|resource| resource["public_id"]}.should == [response["public_id"]]
|
79
|
+
end
|
80
|
+
|
68
81
|
it "should allow listing resources in both directions" do
|
69
82
|
asc_resources = @api.resources(:type=>"upload", :prefix=>"api_test", :direction => "asc")["resources"]
|
70
83
|
desc_resources = @api.resources(:type=>"upload", :prefix=>"api_test", :direction => "desc")["resources"]
|
@@ -191,6 +204,47 @@ describe Cloudinary::Api do
|
|
191
204
|
lambda{@api.transformation("c_scale,w_100")}.should raise_error(Cloudinary::Api::NotFound)
|
192
205
|
end
|
193
206
|
|
207
|
+
it "should allow creating and listing upload_presets", :upload_preset => true do
|
208
|
+
@api.create_upload_preset(:name => "api_test_upload_preset", :folder => "folder")
|
209
|
+
@api.create_upload_preset(:name => "api_test_upload_preset2", :folder => "folder2")
|
210
|
+
@api.create_upload_preset(:name => "api_test_upload_preset3", :folder => "folder3")
|
211
|
+
@api.upload_presets["presets"].first(3).map{|p| p["name"]}.should == ["api_test_upload_preset3", "api_test_upload_preset2", "api_test_upload_preset"]
|
212
|
+
@api.delete_upload_preset("api_test_upload_preset")
|
213
|
+
@api.delete_upload_preset("api_test_upload_preset2")
|
214
|
+
@api.delete_upload_preset("api_test_upload_preset3")
|
215
|
+
end
|
216
|
+
|
217
|
+
it "should allow getting a single upload_preset", :upload_preset => true do
|
218
|
+
result = @api.create_upload_preset(:unsigned => true, :folder => "folder", :width => 100, :crop => :scale, :tags => ["a","b","c"], :context => {:a => "b", :c => "d"})
|
219
|
+
name = result["name"]
|
220
|
+
preset = @api.upload_preset(name)
|
221
|
+
preset["name"].should == name
|
222
|
+
preset["unsigned"].should == true
|
223
|
+
preset["settings"]["folder"].should == "folder"
|
224
|
+
preset["settings"]["transformation"].should == [{"width" => 100, "crop" => "scale"}]
|
225
|
+
preset["settings"]["context"].should == {"a" => "b", "c" => "d"}
|
226
|
+
preset["settings"]["tags"].should == ["a","b","c"]
|
227
|
+
@api.delete_upload_preset(name)
|
228
|
+
end
|
229
|
+
|
230
|
+
it "should allow deleting upload_presets", :upload_preset => true do
|
231
|
+
@api.create_upload_preset(:name => "api_test_upload_preset4", :folder => "folder")
|
232
|
+
preset = @api.upload_preset("api_test_upload_preset4")
|
233
|
+
@api.delete_upload_preset("api_test_upload_preset4")
|
234
|
+
lambda{preset = @api.upload_preset("api_test_upload_preset4")}.should raise_error
|
235
|
+
end
|
236
|
+
|
237
|
+
it "should allow updating upload_presets", :upload_preset => true do
|
238
|
+
name = @api.create_upload_preset(:folder => "folder")["name"]
|
239
|
+
preset = @api.upload_preset(name)
|
240
|
+
@api.update_upload_preset(name, preset["settings"].merge(:colors => true, :unsigned => true, :disallow_public_id => true))
|
241
|
+
preset = @api.upload_preset(name)
|
242
|
+
preset["name"].should == name
|
243
|
+
preset["unsigned"].should == true
|
244
|
+
preset["settings"].should == {"folder" => "folder", "colors" => true, "disallow_public_id" => true}
|
245
|
+
@api.delete_upload_preset(name)
|
246
|
+
end
|
247
|
+
|
194
248
|
# this test must be last because it deletes (potentially) all dependent transformations which some tests rely on. Excluded by default.
|
195
249
|
it "should allow deleting all resources", :delete_all=>true do
|
196
250
|
Cloudinary::Uploader.upload("spec/logo.png", :public_id=>"api_test5", :eager=>[:width=>101,:crop=>:scale])
|
@@ -211,15 +265,10 @@ describe Cloudinary::Api do
|
|
211
265
|
api_result["moderation"][0]["status"].should == "approved"
|
212
266
|
api_result["moderation"][0]["kind"].should == "manual"
|
213
267
|
end
|
214
|
-
|
215
|
-
it "should support requesting ocr info" do
|
216
|
-
result = Cloudinary::Uploader.upload("spec/logo.png")
|
217
|
-
lambda{Cloudinary::Api.update(result["public_id"], {:ocr => :illegal})}.should raise_error(Cloudinary::Api::BadRequest, /^Illegal value/)
|
218
|
-
end
|
219
|
-
|
268
|
+
|
220
269
|
it "should support requesting raw conversion" do
|
221
270
|
result = Cloudinary::Uploader.upload("spec/docx.docx", :resource_type => :raw)
|
222
|
-
lambda{Cloudinary::Api.update(result["public_id"], {:resource_type => :raw, :raw_convert => :illegal})}.should raise_error(Cloudinary::Api::BadRequest, /^Illegal value/)
|
271
|
+
lambda{Cloudinary::Api.update(result["public_id"], {:resource_type => :raw, :raw_convert => :illegal})}.should raise_error(Cloudinary::Api::BadRequest, /^Illegal value|not a valid/)
|
223
272
|
end
|
224
273
|
|
225
274
|
it "should support requesting categorization" do
|
@@ -232,7 +281,7 @@ describe Cloudinary::Api do
|
|
232
281
|
lambda{Cloudinary::Api.update(result["public_id"], {:detection => :illegal})}.should raise_error(Cloudinary::Api::BadRequest, /^Illegal value/)
|
233
282
|
end
|
234
283
|
|
235
|
-
it "should support requesting
|
284
|
+
it "should support requesting auto_tagging" do
|
236
285
|
result = Cloudinary::Uploader.upload("spec/logo.png")
|
237
286
|
lambda{Cloudinary::Api.update(result["public_id"], {:auto_tagging => 0.5})}.should raise_error(Cloudinary::Api::BadRequest, /^Must use/)
|
238
287
|
end
|
data/spec/uploader_spec.rb
CHANGED
@@ -113,21 +113,17 @@ describe Cloudinary::Uploader do
|
|
113
113
|
result["moderation"][0]["status"].should == "pending"
|
114
114
|
result["moderation"][0]["kind"].should == "manual"
|
115
115
|
end
|
116
|
-
|
117
|
-
it "should support requesting ocr info" do
|
118
|
-
lambda{Cloudinary::Uploader.upload("spec/logo.png", {:ocr => :illegal})}.should raise_error(CloudinaryException, /Illegal value/)
|
119
|
-
end
|
120
|
-
|
116
|
+
|
121
117
|
it "should support requesting raw conversion" do
|
122
|
-
lambda{Cloudinary::Uploader.upload("spec/docx.docx", {:resource_type => :raw, :raw_convert => :illegal})}.should raise_error(CloudinaryException, /Illegal value/)
|
118
|
+
lambda{Cloudinary::Uploader.upload("spec/docx.docx", {:resource_type => :raw, :raw_convert => :illegal})}.should raise_error(CloudinaryException, /Illegal value|not a valid/)
|
123
119
|
end
|
124
120
|
|
125
121
|
it "should support requesting categorization" do
|
126
|
-
lambda{Cloudinary::Uploader.upload("spec/logo.png", {:categorization => :illegal})}.should raise_error(CloudinaryException, /Illegal value/)
|
122
|
+
lambda{Cloudinary::Uploader.upload("spec/logo.png", {:categorization => :illegal})}.should raise_error(CloudinaryException, /Illegal value|not a valid/)
|
127
123
|
end
|
128
124
|
|
129
125
|
it "should support requesting detection" do
|
130
|
-
lambda{Cloudinary::Uploader.upload("spec/logo.png", {:detection => :illegal})}.should raise_error(CloudinaryException, /Illegal value/)
|
126
|
+
lambda{Cloudinary::Uploader.upload("spec/logo.png", {:detection => :illegal})}.should raise_error(CloudinaryException, /Illegal value|not a valid/)
|
131
127
|
end
|
132
128
|
|
133
129
|
it "should support requesting auto_tagging" do
|
@@ -138,4 +134,11 @@ describe Cloudinary::Uploader do
|
|
138
134
|
result = Cloudinary::Uploader.upload_large("spec/logo.png")
|
139
135
|
result["public_id"].should match(/^[a-z0-9]+.png$/)
|
140
136
|
end
|
137
|
+
|
138
|
+
it "should support unsigned uploading using presets", :upload_preset => true do
|
139
|
+
preset = Cloudinary::Api.create_upload_preset(:folder => "upload_folder", :unsigned => true)
|
140
|
+
result = Cloudinary::Uploader.unsigned_upload("spec/logo.png", preset["name"])
|
141
|
+
result["public_id"].should match(/^upload_folder\/[a-z0-9]+$/)
|
142
|
+
Cloudinary::Api.delete_upload_preset(preset["name"])
|
143
|
+
end
|
141
144
|
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.71
|
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: 2014-
|
14
|
+
date: 2014-04-15 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rest-client
|