cloudinary 1.10.1.pre.rc → 1.11.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 +23 -0
- data/README.md +3 -0
- data/lib/cloudinary.rb +1 -1
- data/lib/cloudinary/api.rb +21 -9
- data/lib/cloudinary/carrier_wave.rb +1 -1
- data/lib/cloudinary/{controller.rb → cloudinary_controller.rb} +2 -2
- data/lib/cloudinary/migrator.rb +3 -1
- data/lib/cloudinary/uploader.rb +2 -0
- data/lib/cloudinary/utils.rb +12 -1
- data/lib/cloudinary/version.rb +1 -1
- data/spec/api_spec.rb +15 -0
- data/spec/uploader_spec.rb +14 -0
- data/spec/utils_spec.rb +21 -0
- data/spec/video_url_spec.rb +19 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c1a428a9c1a34b4a9b89df196292b88396095867df660cc2c327d7427dab2d1f
|
4
|
+
data.tar.gz: 43a242c30de9e936d416b6cce0af16029456e913b31609e772631c02c2367409
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b17ad9f448a25c419ef19ea8df67d87d774fdf9fe03c48300a9575fd2efcd3cc0ce51990a1656db517334ad1aefadd1e3f4923a6c5bef539771f6c8fccdeee84
|
7
|
+
data.tar.gz: ae35973b12d626696eba7c41d631c36f30f9a3c8fb107fffeed37161959958b91dfa1d5e5682962c077f3db2314d82b2e802e0a65c55cbaa9d1f022e778013ed
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,27 @@
|
|
1
1
|
|
2
|
+
1.11.0 / 2018-12-12
|
3
|
+
===================
|
4
|
+
|
5
|
+
New functionality and features
|
6
|
+
------------------------------
|
7
|
+
|
8
|
+
* Support new parameters and values:
|
9
|
+
* `auto` keyword in the `start_offset`
|
10
|
+
* `art` artistic effect
|
11
|
+
* `fps`
|
12
|
+
* `quality_analysis`
|
13
|
+
* `quality_override`
|
14
|
+
* `pre` custom function transformation
|
15
|
+
* Add namespace to the cloudinary controller to avoiding conflicts (#319)
|
16
|
+
|
17
|
+
Other Changes
|
18
|
+
-------------
|
19
|
+
|
20
|
+
* Add "Join the Community"
|
21
|
+
* Merge pull request #290 from zenspider/fix_carrierwave_deps
|
22
|
+
* Fixed direct references to ::CarrierWave with `defined?` guards.
|
23
|
+
* Fix debugging output to use mutex so output isn't garbled.
|
24
|
+
|
2
25
|
1.10.1-rc / 2018-11-20
|
3
26
|
======================
|
4
27
|
|
data/README.md
CHANGED
@@ -266,6 +266,9 @@ Contact us [https://cloudinary.com/contact](https://cloudinary.com/contact)
|
|
266
266
|
|
267
267
|
Stay tuned for updates, tips and tutorials: [Blog](https://cloudinary.com/blog), [Twitter](https://twitter.com/cloudinary), [Facebook](https://www.facebook.com/Cloudinary).
|
268
268
|
|
269
|
+
## Join the Community ##########################################################
|
270
|
+
|
271
|
+
Impact the product, hear updates, test drive new features and more! Join [here](https://www.facebook.com/groups/CloudinaryCommunity).
|
269
272
|
|
270
273
|
## License #######################################################################
|
271
274
|
|
data/lib/cloudinary.rb
CHANGED
@@ -153,7 +153,7 @@ module Cloudinary
|
|
153
153
|
end
|
154
154
|
# Prevent require loop if included after Rails is already initialized.
|
155
155
|
require "cloudinary/helper" if defined?(::ActionView::Base)
|
156
|
-
require "cloudinary/
|
156
|
+
require "cloudinary/cloudinary_controller" if defined?(::ActionController::Base)
|
157
157
|
require "cloudinary/railtie" if defined?(Rails) && defined?(Rails::Railtie)
|
158
158
|
require "cloudinary/engine" if defined?(Rails) && defined?(Rails::Engine)
|
159
159
|
|
data/lib/cloudinary/api.rb
CHANGED
@@ -78,7 +78,18 @@ class Cloudinary::Api
|
|
78
78
|
resource_type = options[:resource_type] || "image"
|
79
79
|
type = options[:type] || "upload"
|
80
80
|
uri = "resources/#{resource_type}/#{type}/#{public_id}"
|
81
|
-
call_api(:get, uri,
|
81
|
+
call_api(:get, uri,
|
82
|
+
only(options,
|
83
|
+
:colors,
|
84
|
+
:coordinates,
|
85
|
+
:exif,
|
86
|
+
:faces,
|
87
|
+
:image_metadata,
|
88
|
+
:max_results,
|
89
|
+
:pages,
|
90
|
+
:phash,
|
91
|
+
:quality_analysis
|
92
|
+
), options)
|
82
93
|
end
|
83
94
|
|
84
95
|
def self.restore(public_ids, options={})
|
@@ -94,19 +105,20 @@ class Cloudinary::Api
|
|
94
105
|
uri = "resources/#{resource_type}/#{type}/#{public_id}"
|
95
106
|
update_options = {
|
96
107
|
:access_control => Cloudinary::Utils.json_array_param(options[:access_control]),
|
97
|
-
:
|
108
|
+
:auto_tagging => options[:auto_tagging] && options[:auto_tagging].to_f,
|
109
|
+
:background_removal => options[:background_removal],
|
110
|
+
:categorization => options[:categorization],
|
98
111
|
:context => Cloudinary::Utils.encode_context(options[:context]),
|
99
|
-
:face_coordinates => Cloudinary::Utils.encode_double_array(options[:face_coordinates]),
|
100
112
|
:custom_coordinates => Cloudinary::Utils.encode_double_array(options[:custom_coordinates]),
|
113
|
+
:detection => options[:detection],
|
114
|
+
:face_coordinates => Cloudinary::Utils.encode_double_array(options[:face_coordinates]),
|
101
115
|
:moderation_status => options[:moderation_status],
|
102
|
-
:
|
116
|
+
:notification_url => options[:notification_url],
|
117
|
+
:quality_override => options[:quality_override],
|
103
118
|
:ocr => options[:ocr],
|
104
|
-
:
|
105
|
-
:detection => options[:detection],
|
119
|
+
:raw_convert => options[:raw_convert],
|
106
120
|
:similarity_search => options[:similarity_search],
|
107
|
-
:
|
108
|
-
:auto_tagging => options[:auto_tagging] && options[:auto_tagging].to_f,
|
109
|
-
:notification_url => options[:notification_url]
|
121
|
+
:tags => options[:tags] && Cloudinary::Utils.build_array(options[:tags]).join(",")
|
110
122
|
}
|
111
123
|
call_api(:post, uri, update_options, options)
|
112
124
|
end
|
@@ -3,7 +3,7 @@ require 'cloudinary/carrier_wave/process'
|
|
3
3
|
require 'cloudinary/carrier_wave/error'
|
4
4
|
require 'cloudinary/carrier_wave/remote'
|
5
5
|
require 'cloudinary/carrier_wave/preloaded'
|
6
|
-
require 'cloudinary/carrier_wave/storage'
|
6
|
+
require 'cloudinary/carrier_wave/storage' if defined?(::CarrierWave) # HACK
|
7
7
|
|
8
8
|
module Cloudinary::CarrierWave
|
9
9
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module CloudinaryController
|
1
|
+
module Cloudinary::CloudinaryController
|
2
2
|
protected
|
3
3
|
|
4
4
|
def valid_cloudinary_response?
|
@@ -10,4 +10,4 @@ module CloudinaryController
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
ActionController::Base.send :include, CloudinaryController
|
13
|
+
ActionController::Base.send :include, Cloudinary::CloudinaryController
|
data/lib/cloudinary/migrator.rb
CHANGED
@@ -299,7 +299,9 @@ class Cloudinary::Migrator
|
|
299
299
|
|
300
300
|
def debug(message)
|
301
301
|
if @debug
|
302
|
-
|
302
|
+
mutex.synchronize{
|
303
|
+
$stderr.print "#{Time.now} Cloudinary::Migrator #{message}\n"
|
304
|
+
}
|
303
305
|
end
|
304
306
|
end
|
305
307
|
|
data/lib/cloudinary/uploader.rb
CHANGED
@@ -51,6 +51,8 @@ class Cloudinary::Uploader
|
|
51
51
|
:phash => Cloudinary::Utils.as_safe_bool(options[:phash]),
|
52
52
|
:proxy => options[:proxy],
|
53
53
|
:public_id => options[:public_id],
|
54
|
+
:quality_analysis => Cloudinary::Utils.as_safe_bool(options[:quality_analysis]),
|
55
|
+
:quality_override => options[:quality_override],
|
54
56
|
:raw_convert => options[:raw_convert],
|
55
57
|
:responsive_breakpoints => Cloudinary::Utils.generate_responsive_breakpoints_string(options[:responsive_breakpoints]),
|
56
58
|
:return_delete_token => Cloudinary::Utils.as_safe_bool(options[:return_delete_token]),
|
data/lib/cloudinary/utils.rb
CHANGED
@@ -85,6 +85,7 @@ class Cloudinary::Utils
|
|
85
85
|
end_offset
|
86
86
|
fetch_format
|
87
87
|
flags
|
88
|
+
fps
|
88
89
|
gravity
|
89
90
|
height
|
90
91
|
if
|
@@ -190,10 +191,14 @@ class Cloudinary::Utils
|
|
190
191
|
options[:start_offset], options[:end_offset] = split_range options.delete(:offset)
|
191
192
|
end
|
192
193
|
|
194
|
+
fps = options.delete(:fps)
|
195
|
+
fps = fps.join('-') if fps.is_a? Array
|
196
|
+
|
193
197
|
overlay = process_layer(options.delete(:overlay))
|
194
198
|
underlay = process_layer(options.delete(:underlay))
|
195
199
|
ifValue = process_if(options.delete(:if))
|
196
200
|
custom_function = process_custom_function(options.delete(:custom_function))
|
201
|
+
custom_pre_function = process_custom_pre_function(options.delete(:custom_pre_function))
|
197
202
|
|
198
203
|
params = {
|
199
204
|
:a => normalize_expression(angle),
|
@@ -205,7 +210,8 @@ class Cloudinary::Utils
|
|
205
210
|
:dpr => normalize_expression(dpr),
|
206
211
|
:e => normalize_expression(effect),
|
207
212
|
:fl => flags,
|
208
|
-
:fn => custom_function,
|
213
|
+
:fn => custom_function || custom_pre_function,
|
214
|
+
:fps => fps,
|
209
215
|
:h => normalize_expression(height),
|
210
216
|
:l => overlay,
|
211
217
|
:o => normalize_expression(options.delete(:opacity)),
|
@@ -1063,6 +1069,11 @@ class Cloudinary::Utils
|
|
1063
1069
|
end
|
1064
1070
|
private_class_method :process_video_params
|
1065
1071
|
|
1072
|
+
def self.process_custom_pre_function(param)
|
1073
|
+
value = process_custom_function(param)
|
1074
|
+
value ? "pre:#{value}" : NIL
|
1075
|
+
end
|
1076
|
+
|
1066
1077
|
def self.process_custom_function(param)
|
1067
1078
|
return param unless param.is_a? Hash
|
1068
1079
|
|
data/lib/cloudinary/version.rb
CHANGED
data/spec/api_spec.rb
CHANGED
@@ -130,6 +130,13 @@ describe Cloudinary::Api do
|
|
130
130
|
expect(resource["derived"].length).to eq(1)
|
131
131
|
end
|
132
132
|
|
133
|
+
it "should support the quality_analysis parameter" do
|
134
|
+
resource = @api.resource(test_id_1, :quality_analysis => true)
|
135
|
+
expect(resource).not_to be_blank
|
136
|
+
expect(resource).to have_key("quality_analysis")
|
137
|
+
expect(resource["quality_analysis"]).to have_key("focus")
|
138
|
+
end
|
139
|
+
|
133
140
|
it "should allow deleting derived resource" do
|
134
141
|
derived_resource_id = "derived_id"
|
135
142
|
expect(RestClient::Request).to receive(:execute).with(deep_hash_value( {[:payload, :derived_resource_ids] => derived_resource_id}))
|
@@ -375,6 +382,14 @@ describe Cloudinary::Api do
|
|
375
382
|
Cloudinary::Api.update("public_id", {:auto_tagging => 0.5})
|
376
383
|
end
|
377
384
|
|
385
|
+
it "should support quality_override" do
|
386
|
+
['auto:advanced', 'auto:best', '80:420', 'none'].each do |q|
|
387
|
+
expected = {[:payload, :quality_override] => q}
|
388
|
+
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
389
|
+
Cloudinary::Api.update Pathname.new(TEST_IMG), :quality_override => q
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
378
393
|
it "should support listing by moderation kind and value" do
|
379
394
|
expect(RestClient::Request).to receive(:execute).with(deep_hash_value([:url] => /.*manual\/approved$/, [:payload, :max_results] => 1000))
|
380
395
|
Cloudinary::Api.resources_by_moderation(:manual, :approved, :max_results => 1000)
|
data/spec/uploader_spec.rb
CHANGED
@@ -35,6 +35,20 @@ describe Cloudinary::Uploader do
|
|
35
35
|
expect(result["status"]).to eq("pending")
|
36
36
|
end
|
37
37
|
|
38
|
+
it "should support the quality_analysis parameter" do
|
39
|
+
result = Cloudinary::Uploader.upload(Pathname.new(TEST_IMG), :quality_analysis => true, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
40
|
+
expect(result).to have_key("quality_analysis")
|
41
|
+
expect(result["quality_analysis"]).to have_key("focus")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should support the quality_override parameter" do
|
45
|
+
['auto:advanced', 'auto:best', '80:420', 'none'].each do |q|
|
46
|
+
expected = {[:payload, :quality_override] => q}
|
47
|
+
expect(RestClient::Request).to receive(:execute).with(deep_hash_value(expected))
|
48
|
+
Cloudinary::Uploader.upload Pathname.new(TEST_IMG), :quality_override => q
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
38
52
|
describe '.rename' do
|
39
53
|
before(:all) do
|
40
54
|
@result = Cloudinary::Uploader.upload(TEST_IMG, :tags => [TEST_TAG, TIMESTAMP_TAG])
|
data/spec/utils_spec.rb
CHANGED
@@ -458,6 +458,12 @@ describe Cloudinary::Utils do
|
|
458
458
|
.and empty_options
|
459
459
|
end
|
460
460
|
|
461
|
+
it "should support artistic effect" do
|
462
|
+
expect(["test", { :effect => "art:incognito"}])
|
463
|
+
.to produce_url("#{upload_path}/e_art:incognito/test")
|
464
|
+
.and empty_options
|
465
|
+
end
|
466
|
+
|
461
467
|
it "should support keyframe_interval" do
|
462
468
|
expect(["test", { :keyframe_interval => 10 }])
|
463
469
|
.to produce_url("#{upload_path}/ki_10/test")
|
@@ -945,5 +951,20 @@ describe Cloudinary::Utils do
|
|
945
951
|
expect( actual).to eq("fn_#{custom_function_remote_str}")
|
946
952
|
|
947
953
|
end
|
954
|
+
|
955
|
+
it 'should accept a string value' do
|
956
|
+
actual = Cloudinary::Utils.generate_transformation_string :custom_pre_function => custom_function_wasm_str
|
957
|
+
expect( actual).to eq("fn_pre:#{custom_function_wasm_str}")
|
958
|
+
end
|
959
|
+
it 'should accept a hash of options' do
|
960
|
+
actual = Cloudinary::Utils.generate_transformation_string :custom_pre_function => custom_function_wasm
|
961
|
+
expect( actual).to eq("fn_pre:#{custom_function_wasm_str}")
|
962
|
+
end
|
963
|
+
it 'should base64 encoded URL for a remote function' do
|
964
|
+
actual = Cloudinary::Utils.generate_transformation_string :custom_pre_function => custom_function_remote
|
965
|
+
expect( actual).to eq("fn_pre:#{custom_function_remote_str}")
|
966
|
+
|
967
|
+
end
|
968
|
+
|
948
969
|
end
|
949
970
|
end
|
data/spec/video_url_spec.rb
CHANGED
@@ -106,6 +106,11 @@ describe Cloudinary::Utils do
|
|
106
106
|
.to produce_url("#{upload_path}/#{short}_35p/video_id")
|
107
107
|
.and empty_options
|
108
108
|
end
|
109
|
+
it 'should support the "auto" keyword' do
|
110
|
+
expect(["video_id", { :resource_type => 'video', long => 'auto' }])
|
111
|
+
.to produce_url("#{upload_path}/#{short}_auto/video_id")
|
112
|
+
.and empty_options
|
113
|
+
end
|
109
114
|
end
|
110
115
|
end
|
111
116
|
|
@@ -161,6 +166,20 @@ describe Cloudinary::Utils do
|
|
161
166
|
|
162
167
|
end
|
163
168
|
end
|
169
|
+
it "should support the fps parameter" do
|
170
|
+
[
|
171
|
+
['24-29.97', 'fps_24-29.97'],
|
172
|
+
[24, 'fps_24'],
|
173
|
+
[24.973, 'fps_24.973'],
|
174
|
+
['24', 'fps_24'],
|
175
|
+
['-24', 'fps_-24'],
|
176
|
+
['$v', 'fps_$v'],
|
177
|
+
[[24, 29.97], 'fps_24-29.97'],
|
178
|
+
[['24', '$v'], 'fps_24-$v']
|
179
|
+
].each do |value, param|
|
180
|
+
expect(Cloudinary::Utils.generate_transformation_string(:fps => value)).to eq(param)
|
181
|
+
end
|
182
|
+
end
|
164
183
|
end
|
165
184
|
|
166
185
|
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.
|
4
|
+
version: 1.11.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-
|
13
|
+
date: 2018-12-12 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: aws_cf_signer
|
@@ -171,7 +171,7 @@ files:
|
|
171
171
|
- lib/cloudinary/carrier_wave/process.rb
|
172
172
|
- lib/cloudinary/carrier_wave/remote.rb
|
173
173
|
- lib/cloudinary/carrier_wave/storage.rb
|
174
|
-
- lib/cloudinary/
|
174
|
+
- lib/cloudinary/cloudinary_controller.rb
|
175
175
|
- lib/cloudinary/downloader.rb
|
176
176
|
- lib/cloudinary/engine.rb
|
177
177
|
- lib/cloudinary/exceptions.rb
|
@@ -244,9 +244,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
244
244
|
version: '0'
|
245
245
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
246
246
|
requirements:
|
247
|
-
- - "
|
247
|
+
- - ">="
|
248
248
|
- !ruby/object:Gem::Version
|
249
|
-
version:
|
249
|
+
version: '0'
|
250
250
|
requirements: []
|
251
251
|
rubyforge_project: cloudinary
|
252
252
|
rubygems_version: 2.7.8
|