cloudinary 1.11.1 → 1.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +6 -1
- data/.travis.yml +12 -6
- data/CHANGELOG.md +30 -0
- data/cloudinary.gemspec +2 -0
- data/lib/active_storage/blob_key.rb +20 -0
- data/lib/active_storage/service/cloudinary_service.rb +181 -0
- data/lib/cloudinary.rb +9 -4
- data/lib/cloudinary/api.rb +17 -4
- data/lib/cloudinary/auth_token.rb +6 -4
- data/lib/cloudinary/uploader.rb +4 -4
- data/lib/cloudinary/utils.rb +62 -29
- data/lib/cloudinary/version.rb +1 -1
- data/spec/active_storage/Gemfile +12 -0
- data/spec/active_storage/application_system_test_case.rb +5 -0
- data/spec/active_storage/database/create_users_migration.rb +9 -0
- data/spec/active_storage/database/setup.rb +7 -0
- data/spec/active_storage/dummy/Rakefile +5 -0
- data/spec/active_storage/dummy/app/assets/config/manifest.js +3 -0
- data/spec/active_storage/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/active_storage/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/active_storage/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/active_storage/dummy/app/helpers/application_helper.rb +4 -0
- data/spec/active_storage/dummy/app/jobs/application_job.rb +4 -0
- data/spec/active_storage/dummy/app/models/application_record.rb +5 -0
- data/spec/active_storage/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/active_storage/dummy/bin/bundle +5 -0
- data/spec/active_storage/dummy/bin/rails +6 -0
- data/spec/active_storage/dummy/bin/rake +6 -0
- data/spec/active_storage/dummy/bin/yarn +11 -0
- data/spec/active_storage/dummy/config.ru +7 -0
- data/spec/active_storage/dummy/config/application.rb +22 -0
- data/spec/active_storage/dummy/config/boot.rb +7 -0
- data/spec/active_storage/dummy/config/database.yml +25 -0
- data/spec/active_storage/dummy/config/environment.rb +7 -0
- data/spec/active_storage/dummy/config/environments/development.rb +52 -0
- data/spec/active_storage/dummy/config/environments/production.rb +83 -0
- data/spec/active_storage/dummy/config/environments/test.rb +38 -0
- data/spec/active_storage/dummy/config/initializers/application_controller_renderer.rb +7 -0
- data/spec/active_storage/dummy/config/initializers/assets.rb +16 -0
- data/spec/active_storage/dummy/config/initializers/backtrace_silencers.rb +8 -0
- data/spec/active_storage/dummy/config/initializers/cookies_serializer.rb +7 -0
- data/spec/active_storage/dummy/config/initializers/filter_parameter_logging.rb +6 -0
- data/spec/active_storage/dummy/config/initializers/inflections.rb +17 -0
- data/spec/active_storage/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/active_storage/dummy/config/initializers/wrap_parameters.rb +16 -0
- data/spec/active_storage/dummy/config/routes.rb +4 -0
- data/spec/active_storage/dummy/config/secrets.yml +32 -0
- data/spec/active_storage/dummy/config/spring.rb +8 -0
- data/spec/active_storage/dummy/config/storage.yml +3 -0
- data/spec/active_storage/dummy/config/webpacker.yml +72 -0
- data/spec/active_storage/dummy/package.json +5 -0
- data/spec/active_storage/dummy/public/404.html +67 -0
- data/spec/active_storage/dummy/public/422.html +67 -0
- data/spec/active_storage/dummy/public/500.html +66 -0
- data/spec/active_storage/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/active_storage/dummy/public/apple-touch-icon.png +0 -0
- data/spec/active_storage/dummy/public/favicon.ico +0 -0
- data/spec/active_storage/fixtures/files/colors.bmp +0 -0
- data/spec/active_storage/fixtures/files/empty_file.txt +0 -0
- data/spec/active_storage/fixtures/files/favicon.ico +0 -0
- data/spec/active_storage/fixtures/files/icon.psd +0 -0
- data/spec/active_storage/fixtures/files/icon.svg +13 -0
- data/spec/active_storage/fixtures/files/image.gif +0 -0
- data/spec/active_storage/fixtures/files/racecar.jpg +0 -0
- data/spec/active_storage/fixtures/files/racecar.tif +0 -0
- data/spec/active_storage/fixtures/files/racecar_rotated.jpg +0 -0
- data/spec/active_storage/fixtures/files/report.pdf +0 -0
- data/spec/active_storage/fixtures/files/rotated_video.mp4 +0 -0
- data/spec/active_storage/fixtures/files/video.mp4 +0 -0
- data/spec/active_storage/fixtures/files/video_with_rectangular_samples.mp4 +0 -0
- data/spec/active_storage/fixtures/files/video_with_undefined_display_aspect_ratio.mp4 +0 -0
- data/spec/active_storage/fixtures/files/video_without_video_stream.mp4 +0 -0
- data/spec/active_storage/service/cloudinary_service_spec.rb +92 -0
- data/spec/active_storage/service/configurations.yml +4 -0
- data/spec/active_storage/test_helper.rb +43 -0
- data/spec/api_spec.rb +68 -12
- data/spec/archive_spec.rb +17 -1
- data/spec/cloudinary_helper_spec.rb +2 -0
- data/spec/cloudinary_spec.rb +30 -6
- data/spec/movie.mp4 +0 -0
- data/spec/spec_helper.rb +9 -2
- data/spec/uploader_spec.rb +20 -3
- data/spec/utils_methods_spec.rb +29 -2
- data/spec/utils_spec.rb +93 -11
- data/vendor/assets/javascripts/cloudinary/jquery.cloudinary.js +31 -1
- data/vendor/assets/javascripts/cloudinary/jquery.fileupload.js +24 -4
- data/vendor/assets/javascripts/cloudinary/jquery.ui.widget.js +741 -561
- data/vendor/assets/javascripts/cloudinary/load-image.all.min.js +1 -1
- metadata +161 -3
data/spec/movie.mp4
ADDED
Binary file
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
+
SUFFIX = ENV['TRAVIS_JOB_ID'] || rand(999999999).to_s
|
2
|
+
|
1
3
|
require 'rspec'
|
2
4
|
require 'rexml/parsers/ultralightparser'
|
3
5
|
require 'nokogiri'
|
4
6
|
require 'rspec/version'
|
5
7
|
require 'rest_client'
|
8
|
+
require 'active_storage/test_helper' if RUBY_VERSION >= '2.2.2'
|
6
9
|
require 'cloudinary'
|
7
10
|
|
8
11
|
Cloudinary.config.enhance_image_tag = true
|
@@ -10,11 +13,15 @@ Cloudinary.config.enhance_image_tag = true
|
|
10
13
|
DUMMY_CLOUD = "test123"
|
11
14
|
TEST_IMAGE_URL = "http://cloudinary.com/images/old_logo.png"
|
12
15
|
TEST_IMG = "spec/logo.png"
|
16
|
+
TEST_VIDEO = "spec/movie.mp4"
|
17
|
+
TEST_RAW = "spec/docx.docx"
|
13
18
|
TEST_IMG_W = 241
|
14
19
|
TEST_IMG_H = 51
|
15
|
-
SUFFIX = ENV['TRAVIS_JOB_ID'] || rand(999999999).to_s
|
16
20
|
TEST_TAG = 'cloudinary_gem_test'
|
17
21
|
TIMESTAMP_TAG = "#{TEST_TAG}_#{SUFFIX}_#{RUBY_VERSION}_#{ defined? Rails::version ? Rails::version : 'no_rails'}"
|
22
|
+
UNIQUE_TEST_FOLDER = "#{TEST_TAG}_#{SUFFIX}_folder"
|
23
|
+
NEXT_CURSOR = "db27cfb02b3f69cb39049969c23ca430c6d33d5a3a7c3ad1d870c54e1a54ee0faa5acdd9f6d288666986001711759d10"
|
24
|
+
GENERIC_FOLDER_NAME = "some_folder"
|
18
25
|
|
19
26
|
# Auth token
|
20
27
|
KEY = "00112233FF99"
|
@@ -263,4 +270,4 @@ module Cloudinary
|
|
263
270
|
end
|
264
271
|
|
265
272
|
private_class_method :arrays_match?, :hashes_match?
|
266
|
-
end
|
273
|
+
end
|
data/spec/uploader_spec.rb
CHANGED
@@ -49,6 +49,24 @@ describe Cloudinary::Uploader do
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
it "should support the cinemagraph_analysis parameter for upload" do
|
53
|
+
expected = {
|
54
|
+
[:payload, :cinemagraph_analysis] => 1,
|
55
|
+
[:method] => :post
|
56
|
+
}
|
57
|
+
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
58
|
+
Cloudinary::Uploader.upload(Pathname.new(TEST_IMG), :cinemagraph_analysis => true, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should support the cinemagraph_analysis parameter for explicit" do
|
62
|
+
expected = {
|
63
|
+
[:payload, :cinemagraph_analysis] => 1,
|
64
|
+
[:method] => :post
|
65
|
+
}
|
66
|
+
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
67
|
+
Cloudinary::Uploader.explicit('sample', :type => "upload", :cinemagraph_analysis => true, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
68
|
+
end
|
69
|
+
|
52
70
|
describe '.rename' do
|
53
71
|
before(:all) do
|
54
72
|
@result = Cloudinary::Uploader.upload(TEST_IMG, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
@@ -105,7 +123,7 @@ describe Cloudinary::Uploader do
|
|
105
123
|
expect(RestClient::Request).to receive(:execute).with(deep_hash_value( [:payload, :public_id] => "sample", [:payload, :eager] => "c_scale,w_2.0"))
|
106
124
|
result = Cloudinary::Uploader.explicit("sample", :type=>"upload", :eager=>[{:crop=>"scale", :width=>"2.0"}])
|
107
125
|
end
|
108
|
-
|
126
|
+
|
109
127
|
it "should support eager" do
|
110
128
|
result = Cloudinary::Uploader.upload(TEST_IMG, :eager =>[{ :crop =>"scale", :width =>"2.0"}], :tags => [TEST_TAG, TIMESTAMP_TAG])
|
111
129
|
expect(result["eager"].length).to be(1)
|
@@ -286,7 +304,7 @@ describe Cloudinary::Uploader do
|
|
286
304
|
end
|
287
305
|
|
288
306
|
it "should support requesting raw conversion" do
|
289
|
-
expect{Cloudinary::Uploader.upload(
|
307
|
+
expect{Cloudinary::Uploader.upload(TEST_RAW, {:resource_type => :raw, :raw_convert => :illegal, :tags => [TEST_TAG, TIMESTAMP_TAG]})}.to raise_error(CloudinaryException, /Illegal value|not a valid|is invalid/)
|
290
308
|
end
|
291
309
|
|
292
310
|
it "should support requesting categorization" do
|
@@ -380,7 +398,6 @@ describe Cloudinary::Uploader do
|
|
380
398
|
|
381
399
|
|
382
400
|
describe 'explicit' do
|
383
|
-
|
384
401
|
context ":invalidate" do
|
385
402
|
it 'should pass the invalidate value to the server' do
|
386
403
|
expect(RestClient::Request).to receive(:execute).with(deep_hash_value( [:payload, :invalidate] => 1))
|
data/spec/utils_methods_spec.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'rspec'
|
2
2
|
require 'spec_helper'
|
3
3
|
require 'cloudinary'
|
4
|
-
|
5
4
|
include Cloudinary
|
6
5
|
|
7
6
|
describe Utils do
|
@@ -51,4 +50,32 @@ describe Utils do
|
|
51
50
|
expect(result).to include('foobar')
|
52
51
|
end
|
53
52
|
end
|
54
|
-
|
53
|
+
describe 'is_remote_url' do
|
54
|
+
it 'should identify remote URLs correctly' do
|
55
|
+
[
|
56
|
+
"ftp://ftp.cloudinary.com/images/old_logo.png",
|
57
|
+
"http://cloudinary.com/images/old_logo.png",
|
58
|
+
"https://cloudinary.com/images/old_logo.png",
|
59
|
+
"s3://s3-us-west-2.amazonaws.com/cloudinary/images/old_logo.png",
|
60
|
+
"gs://cloudinary/images/old_logo.png",
|
61
|
+
"data:image/gif;charset=utf8;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
|
62
|
+
"data:image/gif;param1=value1;param2=value2;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
|
63
|
+
].each do |url|
|
64
|
+
expect(Cloudinary::Utils.is_remote?(url)).to eq(true), url
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
describe "resource_type per format" do
|
69
|
+
it "should return the correct resource_type per format" do
|
70
|
+
format_to_resource_type = {
|
71
|
+
"jpg" => "image",
|
72
|
+
"mp4" => "video",
|
73
|
+
"txt" => "raw",
|
74
|
+
"mp3" => "video",
|
75
|
+
}
|
76
|
+
format_to_resource_type.each do |format, resource_type|
|
77
|
+
expect(Cloudinary::Utils.resource_type_for_format(format)).to eq(resource_type)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/spec/utils_spec.rb
CHANGED
@@ -319,40 +319,48 @@ describe Cloudinary::Utils do
|
|
319
319
|
end
|
320
320
|
|
321
321
|
describe ":transformation" do
|
322
|
-
it "should support named
|
322
|
+
it "should support named transformation" do
|
323
323
|
expect(["test", { :transformation => "blip" }])
|
324
324
|
.to produce_url("#{upload_path}/t_blip/test")
|
325
325
|
.and empty_options
|
326
326
|
end
|
327
327
|
|
328
|
-
it "should support array of named
|
328
|
+
it "should support array of named transformation" do
|
329
329
|
expect(["test", { :transformation => ["blip", "blop"] }])
|
330
330
|
.to produce_url("#{upload_path}/t_blip.blop/test")
|
331
331
|
.and empty_options
|
332
332
|
end
|
333
333
|
|
334
|
-
it "should support base
|
334
|
+
it "should support base transformation" do
|
335
335
|
expect(["test", { :transformation => { :x => 100, :y => 100, :crop => :fill }, :crop => :crop, :width => 100 }])
|
336
336
|
.to produce_url("#{upload_path}/c_fill,x_100,y_100/c_crop,w_100/test")
|
337
337
|
.and mutate_options_to({ :width => 100 })
|
338
338
|
end
|
339
339
|
|
340
|
-
it "should support array of base
|
340
|
+
it "should support array of base transformation" do
|
341
341
|
expect(["test", { :transformation => [{ :x => 100, :y => 100, :width => 200, :crop => :fill }, { :radius => 10 }], :crop => :crop, :width => 100 }])
|
342
342
|
.to produce_url("#{upload_path}/c_fill,w_200,x_100,y_100/r_10/c_crop,w_100/test")
|
343
343
|
.and mutate_options_to({ :width => 100 })
|
344
344
|
end
|
345
345
|
|
346
|
-
it "should support array of
|
346
|
+
it "should support array of transformation" do
|
347
347
|
result = Cloudinary::Utils.generate_transformation_string([{ :x => 100, :y => 100, :width => 200, :crop => :fill }, { :radius => 10 }])
|
348
348
|
expect(result).to eq("c_fill,w_200,x_100,y_100/r_10")
|
349
349
|
end
|
350
350
|
|
351
|
-
it "should not include empty
|
351
|
+
it "should not include empty transformation" do
|
352
352
|
expect(["test", { :transformation => [{}, { :x => 100, :y => 100, :crop => :fill }, {}] }])
|
353
353
|
.to produce_url("#{upload_path}/c_fill,x_100,y_100/test")
|
354
354
|
.and empty_options
|
355
355
|
end
|
356
|
+
|
357
|
+
describe "should support and translate arithmetic operators" do
|
358
|
+
it "should support * / + - ^" do
|
359
|
+
t = [{:width => 'initial_width * 2 / 3 ^ 2', :height => 'initial_height + 2 - 3', :crop => 'scale'}]
|
360
|
+
expected_trans = "c_scale,h_ih_add_2_sub_3,w_iw_mul_2_div_3_pow_2"
|
361
|
+
expect(Cloudinary::Utils.cloudinary_url('sample', :transformation => t)).to eq("#{upload_path}/#{expected_trans}/sample")
|
362
|
+
end
|
363
|
+
end
|
356
364
|
end
|
357
365
|
|
358
366
|
|
@@ -428,6 +436,34 @@ describe Cloudinary::Utils do
|
|
428
436
|
.and empty_options
|
429
437
|
end
|
430
438
|
|
439
|
+
it "should process the radius correctly when given valid values" do
|
440
|
+
valid_radius_test_values = [
|
441
|
+
[10, 'r_10'],
|
442
|
+
['10', 'r_10'],
|
443
|
+
['$v', 'r_$v'],
|
444
|
+
[[10, 20, 30], 'r_10:20:30'],
|
445
|
+
[[10, 20, '$v'], 'r_10:20:$v'],
|
446
|
+
[[10, 20, '$v', 40], 'r_10:20:$v:40'],
|
447
|
+
[['10:20'], 'r_10:20'],
|
448
|
+
[['10:20:$v:40'], 'r_10:20:$v:40']
|
449
|
+
]
|
450
|
+
valid_radius_test_values.each do |options, expected|
|
451
|
+
expect(["test", { :transformation => { :radius => options } }])
|
452
|
+
.to produce_url("#{root_path}/image/upload/#{expected}/test") .and empty_options
|
453
|
+
end
|
454
|
+
end
|
455
|
+
|
456
|
+
it "should throw an error when the radius is given invalid values" do
|
457
|
+
invalid_radius_test_values = [
|
458
|
+
[],
|
459
|
+
[10,20,30,40,50]
|
460
|
+
]
|
461
|
+
invalid_radius_test_values.each do |options|
|
462
|
+
expect{Cloudinary::Utils.cloudinary_url("test", {:transformation => {:radius => options}})}
|
463
|
+
.to raise_error(CloudinaryException)
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
431
467
|
it "should support format for fetch urls" do
|
432
468
|
expect(["http://cloudinary.com/images/logo.png", { :format => "jpg", :type => :fetch }])
|
433
469
|
.to produce_url("#{root_path}/image/fetch/f_jpg/http://cloudinary.com/images/logo.png")
|
@@ -578,6 +614,8 @@ describe Cloudinary::Utils do
|
|
578
614
|
["text parameter", { :public_id => "test_text", :text => text_layer }, "text:test_text:#{text_encoded}"],
|
579
615
|
["text with font family and size parameters", { :text => text_layer, :font_family => "Arial", :font_size => "18" }, "text:Arial_18:#{text_encoded}"],
|
580
616
|
["text with text style parameter", { :text => text_layer, :font_family => "Arial", :font_size => "18", :font_weight => "bold", :font_style => "italic", :letter_spacing => 4, :line_spacing => 2 }, "text:Arial_18_bold_italic_letter_spacing_4_line_spacing_2:#{text_encoded}"],
|
617
|
+
["text with antialiasing and font hinting", { :text => "Hello World, Nice to meet you?", :font_family => "Arial", :font_size => "18", :font_antialiasing => "best", :font_hinting => "medium"}, "text:Arial_18_antialias_best_hinting_medium:Hello%20World%252C%20Nice%20to%20meet%20you%3F"],
|
618
|
+
["text with text style parameter (explicit)", "text:Arial_18_antialias_best_hinting_medium:Hello%20World%252C%20Nice%20to%20meet%20you%3F", "text:Arial_18_antialias_best_hinting_medium:Hello%20World%252C%20Nice%20to%20meet%20you%3F"],
|
581
619
|
["subtitles", { :resource_type => "subtitles", :public_id => "subtitles.srt" }, "subtitles:subtitles.srt"],
|
582
620
|
["subtitles with font family and size", { :resource_type => "subtitles", :public_id => "subtitles.srt", :font_family => "Arial", :font_size => "40" }, "subtitles:Arial_40:subtitles.srt"],
|
583
621
|
["image of type fetch", { :public_id => "http://res.cloudinary.com/demo/image/upload/ci", :type => "fetch" }, "fetch:aHR0cDovL3Jlcy5jbG91ZGluYXJ5LmNvbS9kZW1vL2ltYWdlL3VwbG9hZC9jaQ=="]
|
@@ -732,6 +770,51 @@ describe Cloudinary::Utils do
|
|
732
770
|
.and empty_options
|
733
771
|
end
|
734
772
|
|
773
|
+
it "should default force_version to True if no value is given" do
|
774
|
+
expect(["folder/test", {}])
|
775
|
+
.to produce_url("#{upload_path}/v1/folder/test")
|
776
|
+
.and empty_options
|
777
|
+
end
|
778
|
+
|
779
|
+
it "should exclude the version if resource is stored in a folder and force_version is False" do
|
780
|
+
expect(["folder/test", {:force_version => false}])
|
781
|
+
.to produce_url("#{upload_path}/folder/test")
|
782
|
+
.and empty_options
|
783
|
+
end
|
784
|
+
|
785
|
+
it "should include the version if given explicitly regardless of force_verison (without folder)" do
|
786
|
+
expect(["test", {:force_version => false, :version => 12345}])
|
787
|
+
.to produce_url("#{upload_path}/v12345/test")
|
788
|
+
.and empty_options
|
789
|
+
end
|
790
|
+
|
791
|
+
it "should include the version if given explicitly regardless of force_verison (with folder)" do
|
792
|
+
expect(["folder/test", {:force_version => false, :version => 12345}])
|
793
|
+
.to produce_url("#{upload_path}/v12345/folder/test")
|
794
|
+
.and empty_options
|
795
|
+
end
|
796
|
+
|
797
|
+
it "should use the force_version option if set in the global config" do
|
798
|
+
Cloudinary.config(:force_version => false)
|
799
|
+
expect(["folder/test", {}])
|
800
|
+
.to produce_url("#{upload_path}/folder/test")
|
801
|
+
.and empty_options
|
802
|
+
end
|
803
|
+
|
804
|
+
it "should ignore the global force_version config if version is set explicitly in the options" do
|
805
|
+
Cloudinary.config(:force_version => false)
|
806
|
+
expect(["folder/test", {:version => 12345}])
|
807
|
+
.to produce_url("#{upload_path}/v12345/folder/test")
|
808
|
+
.and empty_options
|
809
|
+
end
|
810
|
+
|
811
|
+
it "should override global config option if force_version is given within options" do
|
812
|
+
Cloudinary.config(:force_version => false)
|
813
|
+
expect(["folder/test", {:force_version => true}])
|
814
|
+
.to produce_url("#{upload_path}/v1/folder/test")
|
815
|
+
.and empty_options
|
816
|
+
end
|
817
|
+
|
735
818
|
it "should allow to shorted image/upload urls" do
|
736
819
|
expect(["test", { :shorten => true }])
|
737
820
|
.to produce_url("#{root_path}/iu/test")
|
@@ -875,11 +958,9 @@ describe Cloudinary::Utils do
|
|
875
958
|
:effect =>"grayscale"])
|
876
959
|
.to produce_url("#{upload_path}/#{all_operators}/sample")
|
877
960
|
end
|
878
|
-
|
879
961
|
end
|
880
|
-
end
|
881
962
|
|
882
|
-
|
963
|
+
describe "variables" do
|
883
964
|
it "array should define a set of variables" do
|
884
965
|
options = {
|
885
966
|
:if => "face_count > 2",
|
@@ -909,7 +990,7 @@ describe Cloudinary::Utils do
|
|
909
990
|
end
|
910
991
|
end
|
911
992
|
|
912
|
-
|
993
|
+
describe "context" do
|
913
994
|
it 'should escape pipe and backslash characters' do
|
914
995
|
context = {"caption" => "different = caption", "alt2" => "alt|alternative"}
|
915
996
|
result = Cloudinary::Utils.encode_context(context)
|
@@ -925,7 +1006,7 @@ describe Cloudinary::Utils do
|
|
925
1006
|
end
|
926
1007
|
end
|
927
1008
|
|
928
|
-
|
1009
|
+
describe "customFunction" do
|
929
1010
|
custom_function_wasm = {
|
930
1011
|
:function_type => 'wasm',
|
931
1012
|
:source => 'blur.wasm'
|
@@ -967,4 +1048,5 @@ describe Cloudinary::Utils do
|
|
967
1048
|
end
|
968
1049
|
|
969
1050
|
end
|
1051
|
+
end
|
970
1052
|
end
|
@@ -802,7 +802,7 @@ var slice = [].slice,
|
|
802
802
|
function TextLayer(options) {
|
803
803
|
var keys;
|
804
804
|
TextLayer.__super__.constructor.call(this, options);
|
805
|
-
keys = ["resourceType", "resourceType", "fontFamily", "fontSize", "fontWeight", "fontStyle", "textDecoration", "textAlign", "stroke", "letterSpacing", "lineSpacing", "text"];
|
805
|
+
keys = ["resourceType", "resourceType", "fontFamily", "fontSize", "fontWeight", "fontStyle", "textDecoration", "textAlign", "stroke", "letterSpacing", "lineSpacing", "fontHinting", "fontAntialiasing", "text"];
|
806
806
|
if (options != null) {
|
807
807
|
keys.forEach((function(_this) {
|
808
808
|
return function(key) {
|
@@ -871,6 +871,16 @@ var slice = [].slice,
|
|
871
871
|
return this;
|
872
872
|
};
|
873
873
|
|
874
|
+
TextLayer.prototype.fontAntialiasing = function(fontAntialiasing){
|
875
|
+
this.options.fontAntialiasing = fontAntialiasing;
|
876
|
+
return this;
|
877
|
+
};
|
878
|
+
|
879
|
+
TextLayer.prototype.fontHinting = function(fontHinting ){
|
880
|
+
this.options.fontHinting = fontHinting ;
|
881
|
+
return this;
|
882
|
+
};
|
883
|
+
|
874
884
|
TextLayer.prototype.text = function(text) {
|
875
885
|
this.options.text = text;
|
876
886
|
return this;
|
@@ -932,6 +942,12 @@ var slice = [].slice,
|
|
932
942
|
if (!(Util.isEmpty(this.options.lineSpacing) && !Util.isNumberLike(this.options.lineSpacing))) {
|
933
943
|
components.push("line_spacing_" + this.options.lineSpacing);
|
934
944
|
}
|
945
|
+
if (this.options.fontAntialiasing !== "none") {
|
946
|
+
components.push("antialias_"+this.options.fontAntialiasing);
|
947
|
+
}
|
948
|
+
if (this.options.fontHinting !== "none") {
|
949
|
+
components.push("hinting_"+this.options.fontHinting);
|
950
|
+
}
|
935
951
|
if (!Util.isEmpty(Util.compact(components))) {
|
936
952
|
if (Util.isEmpty(this.options.fontFamily)) {
|
937
953
|
throw "Must supply fontFamily. " + components;
|
@@ -2780,6 +2796,20 @@ var slice = [].slice,
|
|
2780
2796
|
return this.param(value, "gravity", "g");
|
2781
2797
|
};
|
2782
2798
|
|
2799
|
+
Transformation.prototype.fps = function(value) {
|
2800
|
+
return this.param(value, "fps", "fps", (function(_this) {
|
2801
|
+
return function(fps) {
|
2802
|
+
if (Util.isString(fps)) {
|
2803
|
+
return fps;
|
2804
|
+
} else if (Util.isArray(fps)) {
|
2805
|
+
return fps.join("-");
|
2806
|
+
} else {
|
2807
|
+
return fps;
|
2808
|
+
}
|
2809
|
+
};
|
2810
|
+
})(this));
|
2811
|
+
};
|
2812
|
+
|
2783
2813
|
Transformation.prototype.height = function(value) {
|
2784
2814
|
return this.param(value, "height", "h", (function(_this) {
|
2785
2815
|
return function() {
|
@@ -43,7 +43,7 @@
|
|
43
43
|
'|(Kindle/(1\\.0|2\\.[05]|3\\.0))'
|
44
44
|
).test(window.navigator.userAgent) ||
|
45
45
|
// Feature detection for all other devices:
|
46
|
-
$('<input type="file"
|
46
|
+
$('<input type="file"/>').prop('disabled'));
|
47
47
|
|
48
48
|
// The FileReader API is not actually used, but works as feature detection,
|
49
49
|
// as some Safari versions (5?) support XHR file uploads via the FormData API,
|
@@ -261,6 +261,9 @@
|
|
261
261
|
// Callback for dragover events of the dropZone(s):
|
262
262
|
// dragover: function (e) {}, // .bind('fileuploaddragover', func);
|
263
263
|
|
264
|
+
// Callback before the start of each chunk upload request (before form data initialization):
|
265
|
+
// chunkbeforesend: function (e, data) {}, // .bind('fileuploadchunkbeforesend', func);
|
266
|
+
|
264
267
|
// Callback for the start of each chunk upload request:
|
265
268
|
// chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);
|
266
269
|
|
@@ -434,6 +437,13 @@
|
|
434
437
|
}
|
435
438
|
},
|
436
439
|
|
440
|
+
_deinitProgressListener: function (options) {
|
441
|
+
var xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr();
|
442
|
+
if (xhr.upload) {
|
443
|
+
$(xhr.upload).unbind('progress');
|
444
|
+
}
|
445
|
+
},
|
446
|
+
|
437
447
|
_isInstanceOf: function (type, obj) {
|
438
448
|
// Cross-frame instanceof check
|
439
449
|
return Object.prototype.toString.call(obj) === '[object ' + type + ']';
|
@@ -453,7 +463,7 @@
|
|
453
463
|
}
|
454
464
|
if (!multipart || options.blob || !this._isInstanceOf('File', file)) {
|
455
465
|
options.headers['Content-Disposition'] = 'attachment; filename="' +
|
456
|
-
encodeURI(file.name) + '"';
|
466
|
+
encodeURI(file.uploadName || file.name) + '"';
|
457
467
|
}
|
458
468
|
if (!multipart) {
|
459
469
|
options.contentType = file.type || 'application/octet-stream';
|
@@ -489,7 +499,11 @@
|
|
489
499
|
});
|
490
500
|
}
|
491
501
|
if (options.blob) {
|
492
|
-
formData.append(
|
502
|
+
formData.append(
|
503
|
+
paramName,
|
504
|
+
options.blob,
|
505
|
+
file.uploadName || file.name
|
506
|
+
);
|
493
507
|
} else {
|
494
508
|
$.each(options.files, function (index, file) {
|
495
509
|
// This check allows the tests to run with
|
@@ -762,6 +776,8 @@
|
|
762
776
|
// Expose the chunk bytes position range:
|
763
777
|
o.contentRange = 'bytes ' + ub + '-' +
|
764
778
|
(ub + o.chunkSize - 1) + '/' + fs;
|
779
|
+
// Trigger chunkbeforesend to allow form data to be updated for this chunk
|
780
|
+
that._trigger('chunkbeforesend', null, o);
|
765
781
|
// Process the upload data (the blob and potential form data):
|
766
782
|
that._initXHRData(o);
|
767
783
|
// Add progress listeners for this chunk upload:
|
@@ -808,6 +824,9 @@
|
|
808
824
|
o.context,
|
809
825
|
[jqXHR, textStatus, errorThrown]
|
810
826
|
);
|
827
|
+
})
|
828
|
+
.always(function () {
|
829
|
+
that._deinitProgressListener(o);
|
811
830
|
});
|
812
831
|
};
|
813
832
|
this._enhancePromise(promise);
|
@@ -909,6 +928,7 @@
|
|
909
928
|
}).fail(function (jqXHR, textStatus, errorThrown) {
|
910
929
|
that._onFail(jqXHR, textStatus, errorThrown, options);
|
911
930
|
}).always(function (jqXHRorResult, textStatus, jqXHRorError) {
|
931
|
+
that._deinitProgressListener(options);
|
912
932
|
that._onAlways(
|
913
933
|
jqXHRorResult,
|
914
934
|
textStatus,
|
@@ -1126,7 +1146,7 @@
|
|
1126
1146
|
dirReader = entry.createReader();
|
1127
1147
|
readEntries();
|
1128
1148
|
} else {
|
1129
|
-
// Return an
|
1149
|
+
// Return an empty list for file system items
|
1130
1150
|
// other than files or directories:
|
1131
1151
|
dfd.resolve([]);
|
1132
1152
|
}
|