cloudinary 1.6.0 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +39 -0
- data/lib/cloudinary/api.rb +21 -2
- data/lib/cloudinary/helper.rb +10 -7
- data/lib/cloudinary/uploader.rb +33 -3
- data/lib/cloudinary/utils.rb +30 -8
- data/lib/cloudinary/version.rb +1 -1
- data/spec/api_spec.rb +67 -5
- data/spec/archive_spec.rb +39 -14
- data/spec/auth_token_spec.rb +0 -3
- data/spec/cloudinary_helper_spec.rb +0 -2
- data/spec/spec_helper.rb +7 -2
- data/spec/uploader_spec.rb +105 -29
- data/spec/utils_spec.rb +10 -3
- data/vendor/assets/javascripts/cloudinary/jquery.cloudinary.js +471 -129
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 154b7abbf7ae3c462f1277f49dfed3cfdd4ef60c
|
4
|
+
data.tar.gz: 56a961c58cc636da0830ba4e1db3f486fe1dffd4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7fc132e944b87f3bd829f3e45a16609c7e4743a8fa331fad6d62a490a6f1625c533ea26b9eb50d1da71123abc5948166d5b606694b4765562877d255f54f93e9
|
7
|
+
data.tar.gz: 5a1ca4908473ea368ed4a2c1753852879fc75bf3dba22819f44637728de83c6a69f0a48482b5729e46d9f582a3c70748deeaad5dc683a8a2fa831ec784c3b302
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,43 @@
|
|
1
1
|
|
2
|
+
1.7.0 / 2017-04-09
|
3
|
+
==================
|
4
|
+
|
5
|
+
New functionality and features
|
6
|
+
------------------------------
|
7
|
+
|
8
|
+
* Added resource publishing API
|
9
|
+
* `Api.publish_by_prefix`
|
10
|
+
* `Api.publish_by_tag`
|
11
|
+
* `Api.publish_by_ids`
|
12
|
+
* Support remote URLs in `Uploader.upload_large` API
|
13
|
+
* Add missing parameters to generate-archive
|
14
|
+
* `skip_transformation_name`
|
15
|
+
* `allow_missing`
|
16
|
+
* Added context API methods
|
17
|
+
* `Api.add_context`
|
18
|
+
* `Api.remove_all_context`
|
19
|
+
* Added `Uploader.remove_all_tags` method
|
20
|
+
* Support URL SEO suffix for authenticated images
|
21
|
+
* Add support of "format" parameter to responsive-breakpoints hash
|
22
|
+
* Add notification_url to update API
|
23
|
+
|
24
|
+
|
25
|
+
Other Changes
|
26
|
+
-------------
|
27
|
+
|
28
|
+
* Remove tag from test
|
29
|
+
* Change test criteria from changing versions to bytes
|
30
|
+
* Use `TRAVIS_JOB_ID` if available or random. Move auth test constants to spec_helper.
|
31
|
+
* Add test for deleting public IDs which contain commas
|
32
|
+
* Move expression and replacement to constants
|
33
|
+
* Don't normalize negative numbers
|
34
|
+
* Added generic aliasing to methods named with image
|
35
|
+
* Added Private annotation to certain utility methods
|
36
|
+
* Add `encode_context` method to `Utils`
|
37
|
+
* Escape = and | characters in context values + test
|
38
|
+
* Add more complex eager test cases
|
39
|
+
* Switch alias_method_chain to alias_method to support Rails version >5.1
|
40
|
+
|
2
41
|
1.6.0 / 2017-03-08
|
3
42
|
==================
|
4
43
|
|
data/lib/cloudinary/api.rb
CHANGED
@@ -88,7 +88,7 @@ class Cloudinary::Api
|
|
88
88
|
uri = "resources/#{resource_type}/#{type}/#{public_id}"
|
89
89
|
update_options = {
|
90
90
|
:tags => options[:tags] && Cloudinary::Utils.build_array(options[:tags]).join(","),
|
91
|
-
:context => Cloudinary::Utils.
|
91
|
+
:context => Cloudinary::Utils.encode_context(options[:context]),
|
92
92
|
:face_coordinates => Cloudinary::Utils.encode_double_array(options[:face_coordinates]),
|
93
93
|
:custom_coordinates => Cloudinary::Utils.encode_double_array(options[:custom_coordinates]),
|
94
94
|
:moderation_status => options[:moderation_status],
|
@@ -98,7 +98,8 @@ class Cloudinary::Api
|
|
98
98
|
:detection => options[:detection],
|
99
99
|
:similarity_search => options[:similarity_search],
|
100
100
|
:background_removal => options[:background_removal],
|
101
|
-
:auto_tagging => options[:auto_tagging] && options[:auto_tagging].to_f
|
101
|
+
:auto_tagging => options[:auto_tagging] && options[:auto_tagging].to_f,
|
102
|
+
:notification_url => options[:notification_url]
|
102
103
|
}
|
103
104
|
call_api(:post, uri, update_options, options)
|
104
105
|
end
|
@@ -357,6 +358,24 @@ class Cloudinary::Api
|
|
357
358
|
transformation.is_a?(String) ? transformation : Cloudinary::Utils.generate_transformation_string(transformation.clone)
|
358
359
|
end
|
359
360
|
|
361
|
+
def self.publish_resources(options = {})
|
362
|
+
resource_type = options[:resource_type] || "image"
|
363
|
+
params = only(options, :public_ids, :prefix, :tag, :type, :overwrite, :invalidate)
|
364
|
+
call_api("post", "resources/#{resource_type}/publish_resources", params, options)
|
365
|
+
end
|
366
|
+
|
367
|
+
def self.publish_by_prefix(prefix, options = {})
|
368
|
+
return self.publish_resources(options.merge(:prefix => prefix))
|
369
|
+
end
|
370
|
+
|
371
|
+
def self.publish_by_tag(tag, options = {})
|
372
|
+
return self.publish_resources(options.merge(:tag => tag))
|
373
|
+
end
|
374
|
+
|
375
|
+
def self.publish_by_ids(publicIds, options = {})
|
376
|
+
return self.publish_resources(options.merge(:public_ids => publicIds))
|
377
|
+
end
|
378
|
+
|
360
379
|
def self.update_resources_access_mode(access_mode, by_key, value, options = {})
|
361
380
|
resource_type = options[:resource_type] || "image"
|
362
381
|
type = options[:type] || "upload"
|
data/lib/cloudinary/helper.rb
CHANGED
@@ -75,6 +75,7 @@ module CloudinaryHelper
|
|
75
75
|
url = cloudinary_url_internal(source, options)
|
76
76
|
image_path_without_cloudinary(url)
|
77
77
|
end
|
78
|
+
alias_method :cl_path, :cl_image_path
|
78
79
|
|
79
80
|
def image_tag_with_cloudinary(*args)
|
80
81
|
source, options = args
|
@@ -200,6 +201,7 @@ module CloudinaryHelper
|
|
200
201
|
def cl_unsigned_image_upload(object_name, method, upload_preset, options={})
|
201
202
|
cl_unsigned_image_upload_tag("#{object_name}[#{method}]", upload_preset, options)
|
202
203
|
end
|
204
|
+
alias_method :cl_unsigned_upload, :cl_unsigned_image_upload
|
203
205
|
|
204
206
|
def cl_upload_url(options={})
|
205
207
|
Cloudinary::Utils.cloudinary_api_url("upload", {:resource_type=>:auto}.merge(options))
|
@@ -236,6 +238,7 @@ module CloudinaryHelper
|
|
236
238
|
def cl_unsigned_image_upload_tag(field, upload_preset, options={})
|
237
239
|
cl_image_upload_tag(field, options.merge(:unsigned => true, :upload_preset => upload_preset))
|
238
240
|
end
|
241
|
+
alias_method :cl_unsigned_upload_tag, :cl_unsigned_image_upload_tag
|
239
242
|
|
240
243
|
def cl_private_download_url(public_id, format, options = {})
|
241
244
|
Cloudinary::Utils.private_download_url(public_id, format, options)
|
@@ -268,13 +271,12 @@ module CloudinaryHelper
|
|
268
271
|
if !method_defined?(:image_tag)
|
269
272
|
include ActionView::Helpers::AssetTagHelper
|
270
273
|
end
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
alias_method :
|
276
|
-
|
277
|
-
end
|
274
|
+
alias_method :image_tag_without_cloudinary, :image_tag unless public_method_defined? :image_tag_without_cloudinary
|
275
|
+
alias_method :image_path_without_cloudinary, :image_path unless public_method_defined? :image_path_without_cloudinary
|
276
|
+
if Cloudinary.config.enhance_image_tag
|
277
|
+
alias_method :image_tag, :image_tag_with_cloudinary
|
278
|
+
alias_method :image_path, :image_path_with_cloudinary
|
279
|
+
end
|
278
280
|
end
|
279
281
|
end
|
280
282
|
|
@@ -318,6 +320,7 @@ module Cloudinary::FormBuilder
|
|
318
320
|
def cl_unsigned_image_upload(method, upload_preset, options={})
|
319
321
|
@template.cl_unsigned_image_upload(@object_name, method, upload_preset, objectify_options(options))
|
320
322
|
end
|
323
|
+
alias_method :cl_unsigned_upload, :cl_unsigned_image_upload
|
321
324
|
end
|
322
325
|
|
323
326
|
if defined? ActionView::Helpers::AssetUrlHelper
|
data/lib/cloudinary/uploader.rb
CHANGED
@@ -4,6 +4,8 @@ require 'json'
|
|
4
4
|
|
5
5
|
class Cloudinary::Uploader
|
6
6
|
|
7
|
+
REMOTE_URL_REGEX = %r(^ftp:|^https?:|^s3:|^data:[^;]*;base64,([a-zA-Z0-9\/+\n=]+)$)
|
8
|
+
|
7
9
|
# @deprecated use {Cloudinary::Utils.build_eager} instead
|
8
10
|
def self.build_eager(eager)
|
9
11
|
Cloudinary::Utils.build_eager(eager)
|
@@ -25,7 +27,7 @@ class Cloudinary::Uploader
|
|
25
27
|
:callback => options[:callback],
|
26
28
|
:categorization => options[:categorization],
|
27
29
|
:colors => Cloudinary::Utils.as_safe_bool(options[:colors]),
|
28
|
-
:context => Cloudinary::Utils.
|
30
|
+
:context => Cloudinary::Utils.encode_context(options[:context]),
|
29
31
|
:custom_coordinates => Cloudinary::Utils.encode_double_array(options[:custom_coordinates]),
|
30
32
|
:detection => options[:detection],
|
31
33
|
:discard_original_filename => Cloudinary::Utils.as_safe_bool(options[:discard_original_filename]),
|
@@ -71,7 +73,7 @@ class Cloudinary::Uploader
|
|
71
73
|
params = build_upload_params(options)
|
72
74
|
if file.is_a?(Pathname)
|
73
75
|
params[:file] = File.open(file, "rb")
|
74
|
-
elsif file.respond_to?(:read) || file
|
76
|
+
elsif file.respond_to?(:read) || file.match(REMOTE_URL_REGEX)
|
75
77
|
params[:file] = file
|
76
78
|
else
|
77
79
|
params[:file] = File.open(file, "rb")
|
@@ -89,7 +91,9 @@ class Cloudinary::Uploader
|
|
89
91
|
public_id = public_id_or_options
|
90
92
|
options = old_options
|
91
93
|
end
|
92
|
-
if file.
|
94
|
+
if file.match(REMOTE_URL_REGEX)
|
95
|
+
return upload(file, options.merge(:public_id => public_id))
|
96
|
+
elsif file.is_a?(Pathname) || !file.respond_to?(:read)
|
93
97
|
filename = file
|
94
98
|
file = File.open(file, "rb")
|
95
99
|
else
|
@@ -255,6 +259,10 @@ class Cloudinary::Uploader
|
|
255
259
|
return self.call_tags_api(tag, "replace", public_ids, options)
|
256
260
|
end
|
257
261
|
|
262
|
+
def self.remove_all_tags(public_ids = [], options = {})
|
263
|
+
return self.call_tags_api(nil, "remove_all", public_ids, options)
|
264
|
+
end
|
265
|
+
|
258
266
|
private
|
259
267
|
|
260
268
|
def self.call_tags_api(tag, command, public_ids = [], options = {})
|
@@ -269,6 +277,28 @@ class Cloudinary::Uploader
|
|
269
277
|
end
|
270
278
|
end
|
271
279
|
|
280
|
+
def self.add_context(context, public_ids = [], options = {})
|
281
|
+
return self.call_context_api(context, "add", public_ids, options)
|
282
|
+
end
|
283
|
+
|
284
|
+
def self.remove_all_context(public_ids = [], options = {})
|
285
|
+
return self.call_context_api(nil, "remove_all", public_ids, options)
|
286
|
+
end
|
287
|
+
|
288
|
+
private
|
289
|
+
|
290
|
+
def self.call_context_api(context, command, public_ids = [], options = {})
|
291
|
+
return call_api("context", options) do
|
292
|
+
{
|
293
|
+
:timestamp => (options[:timestamp] || Time.now.to_i),
|
294
|
+
:context => Cloudinary::Utils.encode_hash(context),
|
295
|
+
:public_ids => Cloudinary::Utils.build_array(public_ids),
|
296
|
+
:command => command,
|
297
|
+
:type => options[:type]
|
298
|
+
}
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
272
302
|
def self.call_api(action, options)
|
273
303
|
options = options.clone
|
274
304
|
return_error = options.delete(:return_error)
|
data/lib/cloudinary/utils.rb
CHANGED
@@ -205,14 +205,14 @@ class Cloudinary::Utils
|
|
205
205
|
end
|
206
206
|
end
|
207
207
|
|
208
|
+
EXP_REGEXP = Regexp.new(PREDEFINED_VARS.keys.join("|")+'|('+CONDITIONAL_OPERATORS.keys.reverse.map { |k| Regexp.escape(k) }.join('|')+')(?=[ _])')
|
209
|
+
EXP_REPLACEMENT = PREDEFINED_VARS.merge(CONDITIONAL_OPERATORS)
|
210
|
+
|
208
211
|
def self.normalize_expression(expression)
|
209
212
|
if expression =~ /^!.+!$/ # quoted string
|
210
213
|
expression
|
211
214
|
else
|
212
|
-
expression.to_s.gsub(
|
213
|
-
Regexp.union(*PREDEFINED_VARS.keys, *CONDITIONAL_OPERATORS.keys.reverse),
|
214
|
-
PREDEFINED_VARS.merge(CONDITIONAL_OPERATORS)
|
215
|
-
).gsub(/[ _]+/, "_")
|
215
|
+
expression.to_s.gsub(EXP_REGEXP,EXP_REPLACEMENT).gsub(/[ _]+/, "_")
|
216
216
|
end
|
217
217
|
end
|
218
218
|
|
@@ -321,12 +321,13 @@ class Cloudinary::Utils
|
|
321
321
|
unless breakpoint_settings.nil?
|
322
322
|
breakpoint_settings = breakpoint_settings.clone
|
323
323
|
transformation = breakpoint_settings.delete(:transformation) || breakpoint_settings.delete("transformation")
|
324
|
+
format = breakpoint_settings.delete(:format) || breakpoint_settings.delete("format")
|
324
325
|
if transformation
|
325
|
-
|
326
|
+
transformation = Cloudinary::Utils.generate_transformation_string(transformation.clone, true)
|
326
327
|
end
|
328
|
+
breakpoint_settings[:transformation] = [transformation, format].compact.join("/")
|
327
329
|
end
|
328
330
|
breakpoint_settings
|
329
|
-
|
330
331
|
end.to_json
|
331
332
|
end
|
332
333
|
|
@@ -450,6 +451,9 @@ class Cloudinary::Utils
|
|
450
451
|
when resource_type.to_s == "image" && type.to_s == "private"
|
451
452
|
resource_type = "private_images"
|
452
453
|
type = nil
|
454
|
+
when resource_type.to_s == "image" && type.to_s == "authenticated"
|
455
|
+
resource_type = "authenticated_images"
|
456
|
+
type = nil
|
453
457
|
when resource_type.to_s == "raw" && type.to_s == "upload"
|
454
458
|
resource_type = "files"
|
455
459
|
type = nil
|
@@ -457,7 +461,7 @@ class Cloudinary::Utils
|
|
457
461
|
resource_type = "videos"
|
458
462
|
type = nil
|
459
463
|
else
|
460
|
-
raise(CloudinaryException, "URL Suffix only supported for image/upload, image/private and raw/upload")
|
464
|
+
raise(CloudinaryException, "URL Suffix only supported for image/upload, image/private, image/authenticated, video/upload and raw/upload")
|
461
465
|
end
|
462
466
|
end
|
463
467
|
if use_root_path
|
@@ -668,6 +672,10 @@ class Cloudinary::Utils
|
|
668
672
|
end
|
669
673
|
end
|
670
674
|
|
675
|
+
# encodes a hash into pipe-delimited key-value pairs string
|
676
|
+
# @hash [Hash] key-value hash to be encoded
|
677
|
+
# @return [String] a joined string of all keys and values separated by a pipe character
|
678
|
+
# @private
|
671
679
|
def self.encode_hash(hash)
|
672
680
|
case hash
|
673
681
|
when Hash then hash.map{|k,v| "#{k}=#{v}"}.join("|")
|
@@ -676,6 +684,18 @@ class Cloudinary::Utils
|
|
676
684
|
end
|
677
685
|
end
|
678
686
|
|
687
|
+
# Same like encode_hash, with additional escaping of | and = characters
|
688
|
+
# @hash [Hash] key-value hash to be encoded
|
689
|
+
# @return [String] a joined string of all keys and values properly escaped and separated by a pipe character
|
690
|
+
# @private
|
691
|
+
def self.encode_context(hash)
|
692
|
+
case hash
|
693
|
+
when Hash then hash.map{|k,v| "#{k}=#{v.gsub(/([=|])/, '\\\\\1')}"}.join("|")
|
694
|
+
when nil then ""
|
695
|
+
else hash
|
696
|
+
end
|
697
|
+
end
|
698
|
+
|
679
699
|
def self.encode_double_array(array)
|
680
700
|
array = build_array(array)
|
681
701
|
if array.length > 0 && array[0].is_a?(Array)
|
@@ -804,7 +824,9 @@ class Cloudinary::Utils
|
|
804
824
|
:public_ids=>options[:public_ids] && Cloudinary::Utils.build_array(options[:public_ids]),
|
805
825
|
:prefixes=>options[:prefixes] && Cloudinary::Utils.build_array(options[:prefixes]),
|
806
826
|
:expires_at=>options[:expires_at],
|
807
|
-
:transformations => build_eager(options[:transformations])
|
827
|
+
:transformations => build_eager(options[:transformations]),
|
828
|
+
:skip_transformation_name=>Cloudinary::Utils.as_safe_bool(options[:skip_transformation_name]),
|
829
|
+
:allow_missing=>Cloudinary::Utils.as_safe_bool(options[:allow_missing])
|
808
830
|
}
|
809
831
|
end
|
810
832
|
|
data/lib/cloudinary/version.rb
CHANGED
data/spec/api_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe Cloudinary::Api do
|
|
6
6
|
include_context "cleanup", TIMESTAMP_TAG
|
7
7
|
TEST_WIDTH = rand(1000)
|
8
8
|
TEST_TRANSFOMATION = "c_scale,w_#{TEST_WIDTH}"
|
9
|
-
prefix = "api_test_#{
|
9
|
+
prefix = "api_test_#{SUFFIX}"
|
10
10
|
test_id_1 = "#{prefix}_1"
|
11
11
|
test_id_2 = "#{prefix}_2"
|
12
12
|
test_id_3 = "#{prefix}_3"
|
@@ -157,9 +157,11 @@ describe Cloudinary::Api do
|
|
157
157
|
|
158
158
|
end
|
159
159
|
|
160
|
-
it "should allow deleting resources" do
|
160
|
+
it "should allow deleting multiple resources and comma inclusive public IDs", :focus => true do
|
161
161
|
expect(RestClient::Request).to receive(:execute).with(deep_hash_value( {[:payload, :public_ids] => ["apit_test", "test_id_2", "api_test3"]}))
|
162
162
|
@api.delete_resources(["apit_test", "test_id_2", "api_test3"])
|
163
|
+
expect(RestClient::Request).to receive(:execute).with(deep_hash_value( {[:payload, :public_ids] => "apit_test,test_id_2,api_test3"}))
|
164
|
+
@api.delete_resources("apit_test,test_id_2,api_test3")
|
163
165
|
end
|
164
166
|
|
165
167
|
it "should allow deleting resource transformations" do
|
@@ -352,9 +354,13 @@ describe Cloudinary::Api do
|
|
352
354
|
expect{Cloudinary::Api.update(result["public_id"], {:categorization => :illegal})}.to raise_error(Cloudinary::Api::BadRequest, /^Illegal value/)
|
353
355
|
end
|
354
356
|
|
355
|
-
it "should support requesting detection" do
|
356
|
-
|
357
|
-
|
357
|
+
it "should support requesting detection with server notification", :focus => true do
|
358
|
+
expected = {
|
359
|
+
[:payload, :detection] => "adv_face",
|
360
|
+
[:payload, :notification_url] => "http://example.com"
|
361
|
+
}
|
362
|
+
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
363
|
+
Cloudinary::Api.update("public_id", {:detection => "adv_face", :notification_url => "http://example.com"})
|
358
364
|
end
|
359
365
|
|
360
366
|
it "should support requesting auto_tagging" do
|
@@ -437,4 +443,60 @@ describe Cloudinary::Api do
|
|
437
443
|
expect(resource["access_mode"]).to eq('public')
|
438
444
|
end
|
439
445
|
end
|
446
|
+
|
447
|
+
context "resource of type authenticated" do
|
448
|
+
i = 0
|
449
|
+
bytes = nil
|
450
|
+
publicId = ""
|
451
|
+
publish_resource_tag = "publish_resource_tag"
|
452
|
+
before(:each) do
|
453
|
+
i += 1
|
454
|
+
result = Cloudinary::Uploader.upload TEST_IMG, type: "authenticated", tags: [TEST_TAG, TIMESTAMP_TAG, publish_resource_tag], transformation: {width: 100*i, crop: "scale"}
|
455
|
+
publicId = result["public_id"]
|
456
|
+
expect(result["type"]).to eq("authenticated")
|
457
|
+
end
|
458
|
+
|
459
|
+
it "should publish resources by ids" do
|
460
|
+
result = Cloudinary::Api.publish_by_ids( [publicId])
|
461
|
+
|
462
|
+
expect(result["published"]).to be_an_instance_of(Array)
|
463
|
+
expect(result["published"].length).to eq(1)
|
464
|
+
|
465
|
+
resource = result["published"][0]
|
466
|
+
|
467
|
+
expect(resource["public_id"]).to eq(publicId)
|
468
|
+
expect(resource["type"]).to eq('upload')
|
469
|
+
|
470
|
+
bytes = resource["bytes"]
|
471
|
+
end
|
472
|
+
it "should publish resources by prefix and overwrite" do
|
473
|
+
result = Cloudinary::Api.publish_by_prefix(publicId[0..-3], overwrite: true)
|
474
|
+
|
475
|
+
expect(result["published"]).to be_an_instance_of(Array)
|
476
|
+
expect(result["published"].length).to eq(1)
|
477
|
+
|
478
|
+
resource = result["published"][0]
|
479
|
+
|
480
|
+
expect(resource["public_id"]).to eq(publicId)
|
481
|
+
expect(resource["bytes"]).not_to eq(bytes)
|
482
|
+
expect(resource["type"]).to eq('upload')
|
483
|
+
|
484
|
+
bytes = resource["bytes"]
|
485
|
+
end
|
486
|
+
it "should publish resources by tag and overwrite" do
|
487
|
+
result = Cloudinary::Api.publish_by_tag(publish_resource_tag, overwrite: true)
|
488
|
+
|
489
|
+
expect(result["published"]).to be_an_instance_of(Array)
|
490
|
+
expect(result["published"].length).to eq(1)
|
491
|
+
|
492
|
+
resource = result["published"][0]
|
493
|
+
|
494
|
+
expect(resource["public_id"]).to eq(publicId)
|
495
|
+
expect(resource["bytes"]).not_to eq(bytes)
|
496
|
+
expect(resource["type"]).to eq('upload')
|
497
|
+
|
498
|
+
bytes = resource["bytes"]
|
499
|
+
end
|
500
|
+
|
501
|
+
end
|
440
502
|
end
|
data/spec/archive_spec.rb
CHANGED
@@ -22,6 +22,12 @@ RSpec.shared_context 'archive' do
|
|
22
22
|
:effect => :blackwhite
|
23
23
|
}
|
24
24
|
)
|
25
|
+
Cloudinary::Uploader.upload(
|
26
|
+
"http://res.cloudinary.com/demo/image/upload/sample.jpg",
|
27
|
+
:public_id => 'tag_sample_raw.jpg',
|
28
|
+
:resource_type => 'raw',
|
29
|
+
:tags => [TEST_TAG, TIMESTAMP_TAG],
|
30
|
+
)
|
25
31
|
end
|
26
32
|
include_context "cleanup", TIMESTAMP_TAG
|
27
33
|
end
|
@@ -62,20 +68,8 @@ describe Cloudinary::Uploader do
|
|
62
68
|
|
63
69
|
describe '.create_archive' do
|
64
70
|
let!(:target_public_id) {
|
65
|
-
"gem_test#{
|
66
|
-
}
|
67
|
-
let!(:archive_result) {
|
68
|
-
Cloudinary::Uploader.create_archive(
|
69
|
-
{
|
70
|
-
:target_public_id => target_public_id,
|
71
|
-
:public_ids => %w(tag_sample tag_samplebw),
|
72
|
-
:tags => [TEST_TAG, TIMESTAMP_TAG]
|
73
|
-
}.merge(options))
|
71
|
+
"gem_test#{ SUFFIX}"
|
74
72
|
}
|
75
|
-
let(:options) { { :mode => :create } }
|
76
|
-
it 'should return a Hash' do
|
77
|
-
expect(archive_result).to be_a(Hash)
|
78
|
-
end
|
79
73
|
expected_keys = %w(
|
80
74
|
resource_type
|
81
75
|
type
|
@@ -91,10 +85,41 @@ describe Cloudinary::Uploader do
|
|
91
85
|
resource_count
|
92
86
|
file_count
|
93
87
|
)
|
94
|
-
|
88
|
+
let!(:archive_result) {
|
89
|
+
Cloudinary::Uploader.create_archive(
|
90
|
+
{
|
91
|
+
:target_public_id => target_public_id,
|
92
|
+
:public_ids => %w(tag_sample tag_samplebw),
|
93
|
+
:tags => [TEST_TAG, TIMESTAMP_TAG],
|
94
|
+
:transformations => [{width: 100, height: 100, crop: "fill"},{effect: "grayscale"}],
|
95
|
+
:skip_transformation_name => true
|
96
|
+
}.merge(options))
|
97
|
+
}
|
98
|
+
let(:options) { { :mode => :create } }
|
99
|
+
it 'should return a Hash with suitable set of keys' do
|
100
|
+
expect(archive_result).to be_a(Hash)
|
95
101
|
expect(archive_result.keys).to include(*expected_keys)
|
96
102
|
end
|
97
103
|
end
|
104
|
+
describe 'create archive based on raw resources and missing public IDs' do
|
105
|
+
let!(:target_public_id) {
|
106
|
+
"gem_test#{ SUFFIX}"
|
107
|
+
}
|
108
|
+
let!(:archive_result) {
|
109
|
+
Cloudinary::Uploader.create_archive(
|
110
|
+
{
|
111
|
+
:target_public_id => target_public_id,
|
112
|
+
:public_ids => %w(tag_sample_raw.jpg non-wxisting-resource),
|
113
|
+
:resource_type => 'raw',
|
114
|
+
:allow_missing => true
|
115
|
+
}.merge(options))
|
116
|
+
}
|
117
|
+
let(:options) { { :mode => :create } }
|
118
|
+
it 'should skip missing public IDs and successfully generate the archive containing raw resources' do
|
119
|
+
expect(archive_result).to be_a(Hash)
|
120
|
+
expect(archive_result["resource_count"]).to equal(1)
|
121
|
+
end
|
122
|
+
end
|
98
123
|
describe '.create_zip' do
|
99
124
|
it 'should call create_archive with "zip" format' do
|
100
125
|
expect(Cloudinary::Uploader).to receive(:create_archive).with({ :tags => TEST_TAG }, "zip")
|