cloudinary 1.8.3 → 1.9.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/lib/cloudinary/api.rb +1 -0
- data/lib/cloudinary/preloaded_file.rb +2 -2
- data/lib/cloudinary/uploader.rb +1 -0
- data/lib/cloudinary/utils.rb +14 -0
- data/lib/cloudinary/version.rb +1 -1
- data/spec/access_control_spec.rb +99 -0
- data/spec/uploader_spec.rb +1 -1
- data/spec/utils_methods_spec.rb +36 -0
- data/spec/utils_spec.rb +11 -0
- data/vendor/assets/javascripts/cloudinary/jquery.cloudinary.js +30 -19
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c78db40dfbd0f2a2fa579c3817208c11c89136be
|
4
|
+
data.tar.gz: c1f15ae49d99c4c1edb404cd6c49eb4a6c992a58
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8b61e2b1660f36ed2f4cb2b85a38010b8135455e1c1ad743dfe3f267c695c7f88195d038a7548fbe2f6c6d63a005dd458e396ba1f33370c937cf424f5ad14b0
|
7
|
+
data.tar.gz: dbec90b6f71bbad87e31740e419d225bd8804a012310ee55121661d93a48e4d136ae1b86e8ed80b86111d9f004dde54399c72e3f39138686b77616fc7624b92e
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,18 @@
|
|
1
1
|
|
2
|
+
1.9.0 / 2018-02-27
|
3
|
+
==================
|
4
|
+
|
5
|
+
New functionality and features
|
6
|
+
------------------------------
|
7
|
+
|
8
|
+
* Add `access_control` parameter to `upload` and `update`
|
9
|
+
* Add `format` to CarrierWave plug-in's `PreloadedFile`
|
10
|
+
|
11
|
+
Other Changes
|
12
|
+
-------------
|
13
|
+
|
14
|
+
* Fix upload categorization test
|
15
|
+
|
2
16
|
1.8.3 / 2018-02-04
|
3
17
|
==================
|
4
18
|
|
data/lib/cloudinary/api.rb
CHANGED
@@ -93,6 +93,7 @@ class Cloudinary::Api
|
|
93
93
|
type = options[:type] || "upload"
|
94
94
|
uri = "resources/#{resource_type}/#{type}/#{public_id}"
|
95
95
|
update_options = {
|
96
|
+
:access_control => Cloudinary::Utils.json_array_param(options[:access_control]),
|
96
97
|
:tags => options[:tags] && Cloudinary::Utils.build_array(options[:tags]).join(","),
|
97
98
|
:context => Cloudinary::Utils.encode_context(options[:context]),
|
98
99
|
:face_coordinates => Cloudinary::Utils.encode_double_array(options[:face_coordinates]),
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Cloudinary::PreloadedFile
|
2
2
|
PRELOADED_CLOUDINARY_PATH = /^([^\/]+)\/([^\/]+)\/v(\d+)\/([^#]+)#([^\/]+)$/
|
3
3
|
|
4
|
-
attr_reader :filename, :version, :public_id, :signature, :resource_type, :type
|
4
|
+
attr_reader :filename, :version, :public_id, :signature, :resource_type, :type, :format
|
5
5
|
def initialize(file_info)
|
6
6
|
@resource_type, @type, @version, @filename, @signature = file_info.scan(PRELOADED_CLOUDINARY_PATH).first
|
7
7
|
@public_id, @format = Cloudinary::PreloadedFile.split_format(@filename)
|
@@ -29,4 +29,4 @@ class Cloudinary::PreloadedFile
|
|
29
29
|
return [public_id, format]
|
30
30
|
end
|
31
31
|
|
32
|
-
end
|
32
|
+
end
|
data/lib/cloudinary/uploader.rb
CHANGED
@@ -18,6 +18,7 @@ class Cloudinary::Uploader
|
|
18
18
|
options.keys.each { |key| options[key.to_sym] = options.delete(key) if key.is_a?(String) }
|
19
19
|
|
20
20
|
params = {
|
21
|
+
:access_control => Cloudinary::Utils.json_array_param(options[:access_control]),
|
21
22
|
:access_mode => options[:access_mode],
|
22
23
|
:allowed_formats => Cloudinary::Utils.build_array(options[:allowed_formats]).join(","),
|
23
24
|
:async => Cloudinary::Utils.as_safe_bool(options[:async]),
|
data/lib/cloudinary/utils.rb
CHANGED
@@ -313,6 +313,20 @@ class Cloudinary::Utils
|
|
313
313
|
Digest::SHA1.hexdigest("#{to_sign}#{api_secret}")
|
314
314
|
end
|
315
315
|
|
316
|
+
# Returns a JSON array as String.
|
317
|
+
# Yields the array before it is converted to JSON format
|
318
|
+
# @api private
|
319
|
+
# @param [Hash|String|Array<Hash>] data
|
320
|
+
# @return [String|nil] a JSON array string or `nil` if data is `nil`
|
321
|
+
def self.json_array_param(data)
|
322
|
+
return nil if data.nil?
|
323
|
+
|
324
|
+
data = JSON.parse(data) if data.is_a?(String)
|
325
|
+
data = [data] unless data.is_a?(Array)
|
326
|
+
data = yield data if block_given?
|
327
|
+
JSON.generate(data)
|
328
|
+
end
|
329
|
+
|
316
330
|
def self.generate_responsive_breakpoints_string(breakpoints)
|
317
331
|
return nil if breakpoints.nil?
|
318
332
|
breakpoints = build_array(breakpoints)
|
data/lib/cloudinary/version.rb
CHANGED
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'cloudinary'
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'time'
|
5
|
+
|
6
|
+
# Calculates days as seconds
|
7
|
+
def days(n)
|
8
|
+
n * 3600 * 24
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "Access Control" do
|
12
|
+
let (:acl) {{
|
13
|
+
:access_type => 'anonymous',
|
14
|
+
:start => '2019-02-22 16:20:57 +0200',
|
15
|
+
:end => '2019-03-22 00:00 +0200'
|
16
|
+
}}
|
17
|
+
let (:acl_2) {{
|
18
|
+
:access_type => 'anonymous',
|
19
|
+
:start => '2019-02-22 16:20:57Z',
|
20
|
+
:end => '2019-03-22 00:00 +0200'
|
21
|
+
}}
|
22
|
+
let (:acl_string) {
|
23
|
+
'{"access_type":"anonymous","start":"2019-02-22 16:20:57 +0200","end":"2019-03-22 00:00 +0200"}'
|
24
|
+
}
|
25
|
+
let (:options) {{
|
26
|
+
:public_id => TIMESTAMP_TAG,
|
27
|
+
:tags => [TEST_TAG, TIMESTAMP_TAG, 'access_control_test']
|
28
|
+
}}
|
29
|
+
let(:resource ){
|
30
|
+
Cloudinary::Uploader.upload(
|
31
|
+
TEST_IMG,
|
32
|
+
options)
|
33
|
+
}
|
34
|
+
describe 'build_upload_params' do
|
35
|
+
it "should accept a Hash value" do
|
36
|
+
params = Cloudinary::Uploader.build_upload_params access_control: acl
|
37
|
+
expect(params).to have_key(:access_control)
|
38
|
+
expect(params[:access_control]).to be_a String
|
39
|
+
expect(params[:access_control]).to match(/^\[.+\]$/)
|
40
|
+
|
41
|
+
end
|
42
|
+
it "should accept an array of Hash values" do
|
43
|
+
params = Cloudinary::Uploader.build_upload_params access_control: [acl, acl_2]
|
44
|
+
expect(params).to have_key(:access_control)
|
45
|
+
expect(params[:access_control]).to be_a String
|
46
|
+
expect(params[:access_control]).to match(/^\[.+\]$/)
|
47
|
+
j = JSON.parse(params[:access_control])
|
48
|
+
expect(j.length).to be(2)
|
49
|
+
expect(j[0]["access_type"]).to eql(acl[:access_type])
|
50
|
+
expect(j[0]["start"]).to eql(acl[:start])
|
51
|
+
expect(j[0]["end"]).to eql(acl[:end])
|
52
|
+
end
|
53
|
+
it "should accept a JSON string" do
|
54
|
+
params = Cloudinary::Uploader.build_upload_params access_control: acl_string
|
55
|
+
expect(params).to have_key(:access_control)
|
56
|
+
expect(params[:access_control]).to be_a String
|
57
|
+
expect(params[:access_control]).to eql("[#{acl_string}]")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe 'upload' do
|
62
|
+
break puts("Please setup environment for api test to run") if Cloudinary.config.api_secret.blank?
|
63
|
+
include_context "cleanup", TIMESTAMP_TAG
|
64
|
+
|
65
|
+
it 'should allow the user to define ACL in the upload parameters' do
|
66
|
+
options[:access_control] = [acl]
|
67
|
+
expect(RestClient::Request).to receive(:execute).with(
|
68
|
+
deep_hash_value( {[:payload, :access_control] => "[#{acl_string}]"})
|
69
|
+
).and_call_original
|
70
|
+
expect(resource).to have_key('access_control')
|
71
|
+
response_acl = resource["access_control"]
|
72
|
+
expect(response_acl.length).to be(1)
|
73
|
+
expect(response_acl[0]["access_type"]).to eq("anonymous")
|
74
|
+
expect(Time.parse(response_acl[0]["start"])).to eq(Time.parse(acl[:start]))
|
75
|
+
expect(Time.parse(response_acl[0]["end"])).to eq(Time.parse(acl[:end]))
|
76
|
+
end
|
77
|
+
end
|
78
|
+
describe 'update' do
|
79
|
+
break puts("Please setup environment for api test to run") if Cloudinary.config.api_secret.blank?
|
80
|
+
include_context "cleanup", TIMESTAMP_TAG
|
81
|
+
|
82
|
+
it 'should allow the user to define ACL in the update parameters' do
|
83
|
+
resource # upload before setting the expect
|
84
|
+
expect(RestClient::Request).to receive(:execute).with(
|
85
|
+
deep_hash_value( {[:payload, :access_control] => "[#{acl_string}]"})
|
86
|
+
).and_call_original
|
87
|
+
result = Cloudinary::Api.update(
|
88
|
+
resource['public_id'],
|
89
|
+
:tags => [TEST_TAG, TIMESTAMP_TAG, 'access_control_test'],
|
90
|
+
:access_control => acl)
|
91
|
+
expect(result).to have_key('access_control')
|
92
|
+
response_acl = result["access_control"]
|
93
|
+
expect(response_acl.length).to be(1)
|
94
|
+
expect(response_acl[0]["access_type"]).to eq("anonymous")
|
95
|
+
expect(Time.parse(response_acl[0]["start"])).to eq(Time.parse(acl[:start]))
|
96
|
+
expect(Time.parse(response_acl[0]["end"])).to eq(Time.parse(acl[:end]))
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/spec/uploader_spec.rb
CHANGED
@@ -269,7 +269,7 @@ describe Cloudinary::Uploader do
|
|
269
269
|
end
|
270
270
|
|
271
271
|
it "should support requesting categorization" do
|
272
|
-
expect{Cloudinary::Uploader.upload(TEST_IMG, { :categorization => :illegal, :tags => [TEST_TAG, TIMESTAMP_TAG]})}.to raise_error(CloudinaryException, /Illegal value|not a valid|is
|
272
|
+
expect{Cloudinary::Uploader.upload(TEST_IMG, { :categorization => :illegal, :tags => [TEST_TAG, TIMESTAMP_TAG]})}.to raise_error(CloudinaryException, /Illegal value|not a valid|is not valid/)
|
273
273
|
end
|
274
274
|
|
275
275
|
it "should support requesting detection" do
|
data/spec/utils_methods_spec.rb
CHANGED
@@ -15,4 +15,40 @@ describe Utils do
|
|
15
15
|
it "should parse a percent range value" do
|
16
16
|
expect(Utils.instance_eval { norm_range_value("20p") }).to eq("20p")
|
17
17
|
end
|
18
|
+
describe "json_array_param" do
|
19
|
+
let (:data) {{:one => 1, :two => 2, "three" => 3}}
|
20
|
+
let (:data_s) {"{\"one\":1,\"two\":2,\"three\":3}"}
|
21
|
+
let (:data2) {{:foo => "bar"}}
|
22
|
+
let (:data2_s) {"{\"foo\":\"bar\"}"}
|
23
|
+
it "should convert a hash to json array" do
|
24
|
+
result = Utils.json_array_param(data)
|
25
|
+
expect(result).to match(/^\[.+\]$/)
|
26
|
+
end
|
27
|
+
it "should convert an array of hash to json array" do
|
28
|
+
result = Utils.json_array_param([data, data2])
|
29
|
+
expect(result).to eql("[#{data_s},#{data2_s}]")
|
30
|
+
end
|
31
|
+
it "should convert a json string to json array string" do
|
32
|
+
result = Utils.json_array_param(data_s)
|
33
|
+
expect(result).to eql("[#{data_s}]")
|
34
|
+
end
|
35
|
+
it "should accept a JSON array string and return it" do
|
36
|
+
result = Utils.json_array_param("[#{data_s},#{data2_s}]")
|
37
|
+
expect(result).to eql("[#{data_s},#{data2_s}]")
|
38
|
+
end
|
39
|
+
it "should throw an error if input string is not valid json string" do
|
40
|
+
expect{Utils.json_array_param("I'm not a JSON object!")}.to raise_error(JSON::ParserError)
|
41
|
+
end
|
42
|
+
it "should support a block" do
|
43
|
+
hash = {:block => "works"}
|
44
|
+
hash_s = '{"block":"works"}'
|
45
|
+
result = Utils.json_array_param(data) do |array|
|
46
|
+
array[0]['foo'] = 'foobar'
|
47
|
+
array.push(hash)
|
48
|
+
|
49
|
+
end
|
50
|
+
expect(result).to include(hash_s)
|
51
|
+
expect(result).to include('foobar')
|
52
|
+
end
|
53
|
+
end
|
18
54
|
end
|
data/spec/utils_spec.rb
CHANGED
@@ -727,6 +727,17 @@ describe Cloudinary::Utils do
|
|
727
727
|
signature = Cloudinary::Utils.api_sign_request({ :public_id => "folder/file", :version => "1234" }, Cloudinary.config.api_secret)
|
728
728
|
preloaded = Cloudinary::PreloadedFile.new("image/upload/v1234/folder/file.jpg#" + signature)
|
729
729
|
expect(preloaded).to be_valid
|
730
|
+
[
|
731
|
+
[:filename, 'folder/file.jpg'],
|
732
|
+
[:version, '1234'],
|
733
|
+
[:public_id, 'folder/file'],
|
734
|
+
[:signature, signature],
|
735
|
+
[:resource_type, 'image'],
|
736
|
+
[:type, 'upload'],
|
737
|
+
[:format, 'jpg']
|
738
|
+
].each do |attr,value|
|
739
|
+
expect(preloaded.send(attr)).to eq(value)
|
740
|
+
end
|
730
741
|
end
|
731
742
|
|
732
743
|
it "should escape public_ids" do
|
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
/**
|
3
|
-
* Cloudinary's JavaScript library - Version 2.
|
3
|
+
* Cloudinary's JavaScript library - Version 2.5.0
|
4
4
|
* Copyright Cloudinary
|
5
5
|
* see https://github.com/cloudinary/cloudinary_js
|
6
6
|
*
|
@@ -3460,9 +3460,9 @@ var slice = [].slice,
|
|
3460
3460
|
|
3461
3461
|
})(HtmlTag);
|
3462
3462
|
Cloudinary = (function() {
|
3463
|
-
var AKAMAI_SHARED_CDN, CF_SHARED_CDN, DEFAULT_POSTER_OPTIONS, DEFAULT_VIDEO_SOURCE_TYPES, OLD_AKAMAI_SHARED_CDN, SHARED_CDN, VERSION, absolutize, applyBreakpoints, cdnSubdomainNumber, closestAbove, cloudinaryUrlPrefix, defaultBreakpoints, finalizeResourceType, findContainerWidth, maxWidth, updateDpr;
|
3463
|
+
var AKAMAI_SHARED_CDN, CF_SHARED_CDN, DEFAULT_POSTER_OPTIONS, DEFAULT_VIDEO_SOURCE_TYPES, OLD_AKAMAI_SHARED_CDN, SEO_TYPES, SHARED_CDN, VERSION, absolutize, applyBreakpoints, cdnSubdomainNumber, closestAbove, cloudinaryUrlPrefix, defaultBreakpoints, finalizeResourceType, findContainerWidth, maxWidth, updateDpr;
|
3464
3464
|
|
3465
|
-
VERSION = "2.
|
3465
|
+
VERSION = "2.5.0";
|
3466
3466
|
|
3467
3467
|
CF_SHARED_CDN = "d3jpl91pxevbkh.cloudfront.net";
|
3468
3468
|
|
@@ -3479,6 +3479,14 @@ var slice = [].slice,
|
|
3479
3479
|
|
3480
3480
|
DEFAULT_VIDEO_SOURCE_TYPES = ['webm', 'mp4', 'ogv'];
|
3481
3481
|
|
3482
|
+
SEO_TYPES = {
|
3483
|
+
"image/upload": "images",
|
3484
|
+
"image/private": "private_images",
|
3485
|
+
"image/authenticated": "authenticated_images",
|
3486
|
+
"raw/upload": "files",
|
3487
|
+
"video/upload": "videos"
|
3488
|
+
};
|
3489
|
+
|
3482
3490
|
|
3483
3491
|
/**
|
3484
3492
|
* @const {Object} Cloudinary.DEFAULT_IMAGE_PARAMS
|
@@ -3586,7 +3594,13 @@ var slice = [].slice,
|
|
3586
3594
|
*/
|
3587
3595
|
|
3588
3596
|
finalizeResourceType = function(resourceType, type, urlSuffix, useRootPath, shorten) {
|
3589
|
-
var options;
|
3597
|
+
var key, options;
|
3598
|
+
if (resourceType == null) {
|
3599
|
+
resourceType = "image";
|
3600
|
+
}
|
3601
|
+
if (type == null) {
|
3602
|
+
type = "upload";
|
3603
|
+
}
|
3590
3604
|
if (Util.isPlainObject(resourceType)) {
|
3591
3605
|
options = resourceType;
|
3592
3606
|
resourceType = options.resource_type;
|
@@ -3599,17 +3613,17 @@ var slice = [].slice,
|
|
3599
3613
|
type = 'upload';
|
3600
3614
|
}
|
3601
3615
|
if (urlSuffix != null) {
|
3602
|
-
|
3603
|
-
|
3604
|
-
|
3605
|
-
|
3606
|
-
|
3607
|
-
|
3608
|
-
|
3609
|
-
|
3610
|
-
|
3611
|
-
|
3612
|
-
|
3616
|
+
resourceType = SEO_TYPES[resourceType + "/" + type];
|
3617
|
+
type = null;
|
3618
|
+
if (resourceType == null) {
|
3619
|
+
throw new Error("URL Suffix only supported for " + (((function() {
|
3620
|
+
var results;
|
3621
|
+
results = [];
|
3622
|
+
for (key in SEO_TYPES) {
|
3623
|
+
results.push(key);
|
3624
|
+
}
|
3625
|
+
return results;
|
3626
|
+
})()).join(', ')));
|
3613
3627
|
}
|
3614
3628
|
}
|
3615
3629
|
if (useRootPath) {
|
@@ -3674,9 +3688,6 @@ var slice = [].slice,
|
|
3674
3688
|
if (!options.cloud_name) {
|
3675
3689
|
throw 'Unknown cloud_name';
|
3676
3690
|
}
|
3677
|
-
if (options.url_suffix && !options.private_cdn) {
|
3678
|
-
throw 'URL Suffix only supported in private CDN';
|
3679
|
-
}
|
3680
3691
|
if (publicId.search('/') >= 0 && !publicId.match(/^v[0-9]+/) && !publicId.match(/^https?:\//) && !((ref = options.version) != null ? ref.toString() : void 0)) {
|
3681
3692
|
options.version = 1;
|
3682
3693
|
}
|
@@ -4702,7 +4713,7 @@ var slice = [].slice,
|
|
4702
4713
|
TextLayer: TextLayer,
|
4703
4714
|
SubtitlesLayer: SubtitlesLayer,
|
4704
4715
|
Cloudinary: Cloudinary,
|
4705
|
-
VERSION: "2.
|
4716
|
+
VERSION: "2.5.0",
|
4706
4717
|
CloudinaryJQuery: CloudinaryJQuery
|
4707
4718
|
};
|
4708
4719
|
return cloudinary;
|
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.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nadav Soferman
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2018-02-
|
13
|
+
date: 2018-02-27 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: aws_cf_signer
|
@@ -169,6 +169,7 @@ files:
|
|
169
169
|
- lib/cloudinary/version.rb
|
170
170
|
- lib/cloudinary/video_helper.rb
|
171
171
|
- lib/tasks/cloudinary.rake
|
172
|
+
- spec/access_control_spec.rb
|
172
173
|
- spec/api_spec.rb
|
173
174
|
- spec/archive_spec.rb
|
174
175
|
- spec/auth_token_spec.rb
|
@@ -230,6 +231,7 @@ signing_key:
|
|
230
231
|
specification_version: 4
|
231
232
|
summary: Client library for easily using the Cloudinary service
|
232
233
|
test_files:
|
234
|
+
- spec/access_control_spec.rb
|
233
235
|
- spec/api_spec.rb
|
234
236
|
- spec/archive_spec.rb
|
235
237
|
- spec/auth_token_spec.rb
|