cloudinary 1.12.0 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +42 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +21 -0
  4. data/CHANGELOG.md +62 -0
  5. data/cloudinary.gemspec +17 -4
  6. data/lib/active_storage/service/cloudinary_service.rb +58 -16
  7. data/lib/cloudinary.rb +22 -18
  8. data/lib/cloudinary/api.rb +3 -2
  9. data/lib/cloudinary/carrier_wave.rb +2 -1
  10. data/lib/cloudinary/carrier_wave/remote.rb +2 -2
  11. data/lib/cloudinary/cloudinary_controller.rb +2 -4
  12. data/lib/cloudinary/helper.rb +30 -3
  13. data/lib/cloudinary/railtie.rb +6 -2
  14. data/lib/cloudinary/uploader.rb +3 -2
  15. data/lib/cloudinary/utils.rb +12 -9
  16. data/lib/cloudinary/version.rb +1 -1
  17. data/vendor/assets/javascripts/cloudinary/jquery.cloudinary.js +2 -2
  18. metadata +12 -193
  19. data/spec/access_control_spec.rb +0 -102
  20. data/spec/active_storage/Gemfile +0 -12
  21. data/spec/active_storage/application_system_test_case.rb +0 -5
  22. data/spec/active_storage/database/create_users_migration.rb +0 -9
  23. data/spec/active_storage/database/setup.rb +0 -7
  24. data/spec/active_storage/dummy/Rakefile +0 -5
  25. data/spec/active_storage/dummy/app/assets/config/manifest.js +0 -3
  26. data/spec/active_storage/dummy/app/assets/javascripts/application.js +0 -13
  27. data/spec/active_storage/dummy/app/assets/stylesheets/application.css +0 -15
  28. data/spec/active_storage/dummy/app/controllers/application_controller.rb +0 -5
  29. data/spec/active_storage/dummy/app/helpers/application_helper.rb +0 -4
  30. data/spec/active_storage/dummy/app/jobs/application_job.rb +0 -4
  31. data/spec/active_storage/dummy/app/models/application_record.rb +0 -5
  32. data/spec/active_storage/dummy/app/views/layouts/application.html.erb +0 -14
  33. data/spec/active_storage/dummy/bin/bundle +0 -5
  34. data/spec/active_storage/dummy/bin/rails +0 -6
  35. data/spec/active_storage/dummy/bin/rake +0 -6
  36. data/spec/active_storage/dummy/bin/yarn +0 -11
  37. data/spec/active_storage/dummy/config.ru +0 -7
  38. data/spec/active_storage/dummy/config/application.rb +0 -22
  39. data/spec/active_storage/dummy/config/boot.rb +0 -7
  40. data/spec/active_storage/dummy/config/database.yml +0 -25
  41. data/spec/active_storage/dummy/config/environment.rb +0 -7
  42. data/spec/active_storage/dummy/config/environments/development.rb +0 -52
  43. data/spec/active_storage/dummy/config/environments/production.rb +0 -83
  44. data/spec/active_storage/dummy/config/environments/test.rb +0 -38
  45. data/spec/active_storage/dummy/config/initializers/application_controller_renderer.rb +0 -7
  46. data/spec/active_storage/dummy/config/initializers/assets.rb +0 -16
  47. data/spec/active_storage/dummy/config/initializers/backtrace_silencers.rb +0 -8
  48. data/spec/active_storage/dummy/config/initializers/cookies_serializer.rb +0 -7
  49. data/spec/active_storage/dummy/config/initializers/filter_parameter_logging.rb +0 -6
  50. data/spec/active_storage/dummy/config/initializers/inflections.rb +0 -17
  51. data/spec/active_storage/dummy/config/initializers/mime_types.rb +0 -5
  52. data/spec/active_storage/dummy/config/initializers/wrap_parameters.rb +0 -16
  53. data/spec/active_storage/dummy/config/routes.rb +0 -4
  54. data/spec/active_storage/dummy/config/secrets.yml +0 -32
  55. data/spec/active_storage/dummy/config/spring.rb +0 -8
  56. data/spec/active_storage/dummy/config/storage.yml +0 -3
  57. data/spec/active_storage/dummy/config/webpacker.yml +0 -72
  58. data/spec/active_storage/dummy/package.json +0 -5
  59. data/spec/active_storage/dummy/public/404.html +0 -67
  60. data/spec/active_storage/dummy/public/422.html +0 -67
  61. data/spec/active_storage/dummy/public/500.html +0 -66
  62. data/spec/active_storage/dummy/public/apple-touch-icon-precomposed.png +0 -0
  63. data/spec/active_storage/dummy/public/apple-touch-icon.png +0 -0
  64. data/spec/active_storage/dummy/public/favicon.ico +0 -0
  65. data/spec/active_storage/fixtures/files/colors.bmp +0 -0
  66. data/spec/active_storage/fixtures/files/empty_file.txt +0 -0
  67. data/spec/active_storage/fixtures/files/favicon.ico +0 -0
  68. data/spec/active_storage/fixtures/files/icon.psd +0 -0
  69. data/spec/active_storage/fixtures/files/icon.svg +0 -13
  70. data/spec/active_storage/fixtures/files/image.gif +0 -0
  71. data/spec/active_storage/fixtures/files/racecar.jpg +0 -0
  72. data/spec/active_storage/fixtures/files/racecar.tif +0 -0
  73. data/spec/active_storage/fixtures/files/racecar_rotated.jpg +0 -0
  74. data/spec/active_storage/fixtures/files/report.pdf +0 -0
  75. data/spec/active_storage/fixtures/files/rotated_video.mp4 +0 -0
  76. data/spec/active_storage/fixtures/files/video.mp4 +0 -0
  77. data/spec/active_storage/fixtures/files/video_with_rectangular_samples.mp4 +0 -0
  78. data/spec/active_storage/fixtures/files/video_with_undefined_display_aspect_ratio.mp4 +0 -0
  79. data/spec/active_storage/fixtures/files/video_without_video_stream.mp4 +0 -0
  80. data/spec/active_storage/service/cloudinary_service_spec.rb +0 -92
  81. data/spec/active_storage/service/configurations.yml +0 -4
  82. data/spec/active_storage/test_helper.rb +0 -43
  83. data/spec/api_spec.rb +0 -623
  84. data/spec/archive_spec.rb +0 -145
  85. data/spec/auth_token_spec.rb +0 -77
  86. data/spec/cache_spec.rb +0 -109
  87. data/spec/cloudinary_helper_spec.rb +0 -327
  88. data/spec/cloudinary_spec.rb +0 -56
  89. data/spec/data/sync_static/app/assets/javascripts/1.coffee +0 -1
  90. data/spec/data/sync_static/app/assets/javascripts/1.js +0 -1
  91. data/spec/data/sync_static/app/assets/stylesheets/1.css +0 -3
  92. data/spec/docx.docx +0 -0
  93. data/spec/favicon.ico +0 -0
  94. data/spec/image_spec.rb +0 -107
  95. data/spec/logo.png +0 -0
  96. data/spec/movie.mp4 +0 -0
  97. data/spec/rake_spec.rb +0 -160
  98. data/spec/sample_asset_file.tsv +0 -4
  99. data/spec/search_spec.rb +0 -109
  100. data/spec/spec_helper.rb +0 -273
  101. data/spec/storage_spec.rb +0 -44
  102. data/spec/streaminig_profiles_api_spec.rb +0 -74
  103. data/spec/support/helpers/temp_file_helpers.rb +0 -22
  104. data/spec/support/shared_contexts/rake.rb +0 -19
  105. data/spec/uploader_spec.rb +0 -409
  106. data/spec/utils_methods_spec.rb +0 -81
  107. data/spec/utils_spec.rb +0 -1052
  108. data/spec/video_tag_spec.rb +0 -253
  109. data/spec/video_url_spec.rb +0 -185
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f3837b9826e6f31a35e478b9d8bbf81027cee43ece65f7df161b748fd5c21dd9
4
- data.tar.gz: 3b47da18531bbfe2252f6cfe4a071bc5972c286c2f5777758d1b1a7e1a30b07e
3
+ metadata.gz: 8c4d1942e462293cb9a3cf7d73878104de63cc041ad6c9a82ae985e9ce1c6dd7
4
+ data.tar.gz: fd09572e0b1be22051a711fb7aacfc1f3f46856531b5c0a3caf50fea49eabae5
5
5
  SHA512:
6
- metadata.gz: 34d0a6214325094a27683345da51e605b7ba6f6ba5761d4c64478dea618dbf3d4ce14a255bf69d513704d72dca6ef5a27ee4bc6e5e81d66e5548341f9e7c2e8c
7
- data.tar.gz: 383bbafb8b06b9bda3fdedbde2f6b7248bcee0bacd5576e98b8e9b79d9ff45cd7d1025056fe1edde412fbf4a04855ba4ea3af197c260374827026f7a0b883f55
6
+ metadata.gz: 66eea468a7816511382761d6ab667c39b4f90da2c765871d99a69d34091949a3fc8d4d2245cd3b53f18560a99eea59fdd2cdd0173d8e41e6ab8e040236d52dc4
7
+ data.tar.gz: 65c5d8536b106b88f6bf8de3a540df6ffed3f6fed39141d6dfbf47a5ae6b11f3ec37699722e5b20e8fe35c86f452f29ec0ba9b9f5edc776ce81efebbf8cd14f8
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: Bug report
3
+ about: Bug report for Cloudinary Ruby SDK
4
+ title: ''
5
+ labels: ''
6
+ assignees: const-cloudinary
7
+
8
+ ---
9
+
10
+ ## Bug report for Cloudinary Ruby SDK
11
+ Before proceeding, please update to latest version and test if the issue persists
12
+
13
+ ## Describe the bug in a sentence or two.
14
+
15
+
16
+ ## Issue Type (Can be multiple)
17
+ [ ] Build - Can’t install or import the SDK
18
+ [ ] Performance - Performance issues
19
+ [ ] Behaviour - Functions aren’t working as expected (Such as generate URL)
20
+ [ ] Documentation - Inconsistency between the docs and behaviour
21
+ [ ] Other (Specify)
22
+
23
+ ## Steps to reproduce
24
+ … if applicable
25
+
26
+ ## Error screenshots or Stack Trace (if applicable)
27
+
28
+
29
+ ## Operating System
30
+ [ ] Linux
31
+ [ ] Windows
32
+ [ ] OSX
33
+ [ ] All
34
+
35
+ ## Environment and Libraries (fill in the version numbers)
36
+ Cloudinary Ruby SDK version - 0.0.0
37
+ Ruby Version - 0.0.0
38
+ Rails Version - 0.0.0
39
+ Other Libraries (Carrierwave, ActiveStorage, etc) - 0.0.0
40
+
41
+ ## Repository
42
+ If possible, please provide a link to a reproducible repository that showcases the problem
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: Feature request
3
+ about: Feature request for Cloudinary Ruby SDK
4
+ title: ''
5
+ labels: ''
6
+ assignees: const-cloudinary
7
+
8
+ ---
9
+
10
+ ## Feature request for Cloudinary Ruby SDK
11
+ …(If your feature is for other SDKs, please request them there)
12
+
13
+
14
+ ## Explain your use case
15
+ … (A high level explanation of why you need this feature)
16
+
17
+ ## Describe the problem you’re trying to solve
18
+ … (A more technical view of what you’d like to accomplish, and how this feature will help you achieve it)
19
+
20
+ ## Do you have a proposed solution?
21
+ … (yes, no? Please elaborate if needed)
@@ -1,3 +1,65 @@
1
+
2
+ 1.15.0 / 2020-06-11
3
+ ===================
4
+
5
+ New functionality and features
6
+ ------------------------------
7
+
8
+ * Add support for `accessibility_analysis` parameter
9
+
10
+ Other Changes
11
+ -------------
12
+ * Fix `download` function in `Cloudinary::CarrierWave`
13
+ * Fix handling of empty value in `if` parameter
14
+ * Fix consumption of configuration from environment variables
15
+
16
+ 1.14.0 / 2020-05-06
17
+ ===================
18
+
19
+ New functionality and features
20
+ ------------------------------
21
+
22
+ * Add support of global folder in ActiveStorage
23
+ * Add duration to conditions in video
24
+
25
+ Other Changes
26
+ -------------
27
+
28
+ * Fix `URI.unescape is obsolete` warning
29
+ * Fix lingering Rails 6 autoload warnings
30
+ * Fix Ruby 1.9 CI build
31
+ * Allow setting uploader timeout to `nil`
32
+ * Update link to CarrierWave integration
33
+ * Update issue templates
34
+
35
+ 1.13.2 / 2020-01-19
36
+ ===================
37
+
38
+ * Fix asset extension detection in active storage service `url` method
39
+
40
+ 1.13.1 / 2019-11-24
41
+ ===================
42
+
43
+ * Remove `test_files` from `gemspec`
44
+ * Remove redundant binary files from `active_storage` spec
45
+ * Fix `rspec` deprecation warnings in Rails 6
46
+ * Add test for uploading IO
47
+
48
+ 1.13.0 / 2019-11-14
49
+ ===================
50
+
51
+ New functionality and features
52
+ ------------------------------
53
+ * Add `SassC` `cloudinary-url` function
54
+
55
+ Other Changes
56
+ -------------
57
+
58
+ * Fix ActiveStorage download not using `ssl` for `https`
59
+ * Fix resource type detection in ActiveStorage
60
+ * Fix `storage_type` instance method in `Cloudinary::CarrierWave` module
61
+ * Fix sample project, limit sqlite3 to a compatible version
62
+
1
63
  1.12.0 / 2019-10-02
2
64
  =============
3
65
 
@@ -15,8 +15,7 @@ Gem::Specification.new do |s|
15
15
 
16
16
  s.rubyforge_project = "cloudinary"
17
17
 
18
- s.files = (`git ls-files`.split("\n") - `git ls-files samples`.split("\n")) + Dir.glob("vendor/assets/javascripts/*/*") + Dir.glob("vendor/assets/html/*")
19
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.files = (`git ls-files`.split("\n") - `git ls-files {test,spec,features,samples}/*`.split("\n")) + Dir.glob("vendor/assets/javascripts/*/*") + Dir.glob("vendor/assets/html/*")
20
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
20
  s.require_paths = ["lib"]
22
21
 
@@ -25,11 +24,25 @@ Gem::Specification.new do |s|
25
24
 
26
25
  s.add_development_dependency "actionpack"
27
26
  s.add_development_dependency "nokogiri"
28
- s.add_development_dependency "rake"
27
+
28
+ if RUBY_VERSION >= "2.2.0"
29
+ s.add_development_dependency "rake", ">= 13.0.1"
30
+ else
31
+ s.add_development_dependency "rake", "<= 12.2.1"
32
+ end
33
+
29
34
  s.add_development_dependency "sqlite3"
30
35
  s.add_development_dependency "rspec", '>=3.5'
31
36
  s.add_development_dependency "rails", "~>5.2" if RUBY_VERSION >= "2.2.2"
37
+
38
+ s.add_development_dependency "railties", "<= 4.2.7" if RUBY_VERSION <= "1.9.3"
32
39
  s.add_development_dependency "rspec-rails"
40
+
33
41
  s.add_development_dependency "rubyzip", "<=1.2.0" # support testing Ruby 1.9
34
- s.add_development_dependency "simplecov"
42
+
43
+ if RUBY_VERSION <= "2.4.0"
44
+ s.add_development_dependency "simplecov", "<= 0.17.1" # support testing Ruby 1.9
45
+ else
46
+ s.add_development_dependency "simplecov", "> 0.18.0"
47
+ end
35
48
  end
@@ -12,6 +12,15 @@ unless ActiveStorage::Blob.method_defined? :original_key
12
12
  end
13
13
  end
14
14
 
15
+ module CloudinaryHelper
16
+ alias cloudinary_url_internal_original cloudinary_url_internal
17
+
18
+ def cloudinary_url_internal(source, options = {})
19
+ source = ActiveStorage::Blob.service.public_id(source) if defined? ActiveStorage::Blob.service.public_id
20
+ cloudinary_url_internal_original(source, options)
21
+ end
22
+ end
23
+
15
24
  module ActiveStorage
16
25
  class Service::CloudinaryService < Service
17
26
  module Headers
@@ -22,7 +31,6 @@ module ActiveStorage
22
31
 
23
32
  def initialize(**options)
24
33
  @options = options
25
- @helper = ActionView::Base.new
26
34
  end
27
35
 
28
36
  def upload(key, io, filename: nil, checksum: nil, **options)
@@ -32,7 +40,7 @@ module ActiveStorage
32
40
  options = @options.merge(options)
33
41
  Cloudinary::Uploader.upload(
34
42
  io,
35
- public_id: public_id(key),
43
+ public_id: public_id_internal(key),
36
44
  resource_type: resource_type(io, key),
37
45
  context: {active_storage_key: key, checksum: checksum},
38
46
  extra_headers: extra_headers,
@@ -49,9 +57,10 @@ module ActiveStorage
49
57
  url = Cloudinary::Utils.cloudinary_url(
50
58
  public_id(key),
51
59
  resource_type: resource_type(nil, key),
52
- format: ext_for_content_type(content_type),
60
+ format: ext_for_file(filename, content_type),
53
61
  **@options.merge(options.symbolize_keys)
54
62
  )
63
+
55
64
  payload[:url] = url
56
65
 
57
66
  url
@@ -61,7 +70,7 @@ module ActiveStorage
61
70
  def url_for_direct_upload(key, **options)
62
71
  instrument :url, key: key do |payload|
63
72
  options = {:resource_type => resource_type(nil, key)}.merge(@options.merge(options.symbolize_keys))
64
- options[:public_id] = public_id(key)
73
+ options[:public_id] = public_id_internal(key)
65
74
  options[:context] = {active_storage_key: key}
66
75
  options.delete(:file)
67
76
  payload[:url] = api_uri("upload", options)
@@ -102,12 +111,11 @@ module ActiveStorage
102
111
  uri = URI(url)
103
112
  if block_given?
104
113
  instrument :streaming_download, key: key do
105
- Net::HTTP.start(uri.host, uri.port) do |http|
114
+ Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
106
115
  request = Net::HTTP::Get.new uri
107
116
  http.request request do |response|
108
117
  response.read_body &block
109
118
  end
110
-
111
119
  end
112
120
  end
113
121
  else
@@ -130,7 +138,7 @@ module ActiveStorage
130
138
  else range.end
131
139
  end
132
140
  req['range'] = "bytes=#{[range.begin, range_end].join('-')}"
133
- res = Net::HTTP.start(uri.hostname, uri.port) do |http|
141
+ res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
134
142
  http.request(req)
135
143
  end
136
144
  res.body.force_encoding(Encoding::BINARY)
@@ -138,20 +146,41 @@ module ActiveStorage
138
146
 
139
147
  end
140
148
 
149
+ def public_id(key)
150
+ return key unless @options[:folder]
151
+
152
+ File.join(@options.fetch(:folder), public_id_internal(key))
153
+ end
154
+
141
155
  private
142
156
 
143
157
  def api_uri(action, options)
144
158
  base_url = Cloudinary::Utils.cloudinary_api_url(action, options)
145
159
  upload_params = Cloudinary::Uploader.build_upload_params(options)
146
160
 
147
- upload_params.reject! {|k, v| Cloudinary::Utils.safe_blank?(v)}
161
+ upload_params.reject! { |k, v| Cloudinary::Utils.safe_blank?(v) }
148
162
  unless options[:unsigned]
149
163
  upload_params = Cloudinary::Utils.sign_request(upload_params, options)
150
164
  end
151
165
  "#{base_url}?#{upload_params.to_query}"
152
166
  end
153
167
 
154
- def ext_for_content_type(content_type)
168
+ # Helper method for getting the filename extension.
169
+ #
170
+ # It does the best effort when original filename does not include extension, but we know the mime-type.
171
+ #
172
+ # @param [ActiveStorage::Filename] filename The original filename.
173
+ # @param [string] content_type The content type of the file.
174
+ #
175
+ # @return [string] The extension of the filename.
176
+ def ext_for_file(filename, content_type)
177
+ ext = filename.respond_to?(:extension_without_delimiter) ? filename.extension_without_delimiter : nil
178
+ return ext unless ext.blank?
179
+
180
+ # Raw files are not convertible, no extension guessing for them
181
+ return nil if content_type_to_resource_type(content_type).eql?('raw')
182
+
183
+ # Fallback when there is no extension.
155
184
  @formats ||= Hash.new do |h, key|
156
185
  ext = Rack::Mime::MIME_TYPES.invert[key]
157
186
  h[key] = ext.slice(1..-1) unless ext.nil?
@@ -159,23 +188,36 @@ module ActiveStorage
159
188
  @formats[content_type]
160
189
  end
161
190
 
162
- def public_id(key)
191
+ def public_id_internal(key)
163
192
  # TODO: Allow custom manipulation of key to obscure how we store in Cloudinary
164
193
  key
165
194
  end
166
195
 
167
- def resource_type(io, key = "")
168
- return 'image' unless key.respond_to? :attributes
169
- options = key.attributes
170
- content_type = options[:content_type] || (io.nil? ? '' : Marcel::MimeType.for(io))
171
- case content_type.split('/')[0]
172
- when 'video'
196
+ def content_type_to_resource_type(content_type)
197
+ type, subtype = content_type.split('/')
198
+ case type
199
+ when 'video', 'audio'
173
200
  'video'
174
201
  when 'text'
175
202
  'raw'
203
+ when 'application'
204
+ case subtype
205
+ when 'pdf', 'postscript'
206
+ 'image'
207
+ when 'vnd.apple.mpegurl', 'x-mpegurl', 'mpegurl' # m3u8
208
+ 'video'
209
+ else
210
+ 'raw'
211
+ end
176
212
  else
177
213
  'image'
178
214
  end
179
215
  end
216
+
217
+ def resource_type(io, key = "")
218
+ options = key.respond_to?(:attributes) ? key.attributes : {}
219
+ content_type = options[:content_type] || (io.nil? ? '' : Marcel::MimeType.for(io))
220
+ content_type_to_resource_type(content_type)
221
+ end
180
222
  end
181
223
  end
@@ -64,19 +64,7 @@ module Cloudinary
64
64
  first_time = @@config.nil?
65
65
  @@config ||= OpenStruct.new((YAML.load(ERB.new(IO.read(config_dir.join("cloudinary.yml"))).result)[config_env] rescue {}))
66
66
 
67
- # Heroku support
68
- if first_time && ENV["CLOUDINARY_CLOUD_NAME"]
69
- set_config(
70
- "cloud_name" => ENV["CLOUDINARY_CLOUD_NAME"],
71
- "api_key" => ENV["CLOUDINARY_API_KEY"],
72
- "api_secret" => ENV["CLOUDINARY_API_SECRET"],
73
- "secure_distribution" => ENV["CLOUDINARY_SECURE_DISTRIBUTION"],
74
- "private_cdn" => ENV["CLOUDINARY_PRIVATE_CDN"].to_s == 'true',
75
- "secure" => ENV["CLOUDINARY_SECURE"].to_s == 'true'
76
- )
77
- elsif first_time && ENV["CLOUDINARY_URL"]
78
- config_from_url(ENV["CLOUDINARY_URL"])
79
- end
67
+ config_from_env if first_time
80
68
 
81
69
  set_config(new_config) if new_config
82
70
  yield(@@config) if block_given?
@@ -105,7 +93,7 @@ module Cloudinary
105
93
  if isNestedKey? key
106
94
  putNestedKey key, value
107
95
  else
108
- set_config(key => URI.decode(value))
96
+ set_config(key => Utils.smart_unescape(value))
109
97
  end
110
98
  end
111
99
  end
@@ -140,18 +128,34 @@ module Cloudinary
140
128
  end
141
129
 
142
130
  private
143
-
131
+
132
+ def self.config_from_env
133
+ # Heroku support
134
+ if ENV["CLOUDINARY_CLOUD_NAME"]
135
+ config_keys = ENV.keys.select! { |key| key.start_with? "CLOUDINARY_" }
136
+ config_keys -= ["CLOUDINARY_URL"] # ignore it when explicit options are passed
137
+ config_keys.each do |full_key|
138
+ conf_key = full_key["CLOUDINARY_".length..-1].downcase # convert "CLOUDINARY_CONFIG_NAME" to "config_name"
139
+ conf_val = ENV[full_key]
140
+ conf_val = conf_val == 'true' if %w[true false].include?(conf_val) # cast relevant boolean values
141
+ set_config(conf_key => conf_val)
142
+ end
143
+ elsif ENV["CLOUDINARY_URL"]
144
+ config_from_url(ENV["CLOUDINARY_URL"])
145
+ end
146
+ end
147
+
144
148
  def self.config_env
145
149
  return ENV["CLOUDINARY_ENV"] if ENV["CLOUDINARY_ENV"]
146
150
  return Rails.env if defined? Rails::env
147
151
  nil
148
152
  end
149
-
153
+
150
154
  def self.config_dir
151
- return Pathname.new(ENV["CLOUDINARY_CONFIG_DIR"]) if ENV["CLOUDINARY_CONFIG_DIR"]
155
+ return Pathname.new(ENV["CLOUDINARY_CONFIG_DIR"]) if ENV["CLOUDINARY_CONFIG_DIR"]
152
156
  self.app_root.join("config")
153
157
  end
154
-
158
+
155
159
  def self.set_config(new_config)
156
160
  new_config.each{|k,v| @@config.send(:"#{k}=", v) if !v.nil?}
157
161
  end
@@ -78,7 +78,7 @@ 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
82
  only(options,
83
83
  :cinemagraph_analysis,
84
84
  :colors,
@@ -90,7 +90,8 @@ class Cloudinary::Api
90
90
  :pages,
91
91
  :phash,
92
92
  :quality_analysis,
93
- :derived_next_cursor
93
+ :derived_next_cursor,
94
+ :accessibility_analysis
94
95
  ), options)
95
96
  end
96
97
 
@@ -10,7 +10,8 @@ module Cloudinary::CarrierWave
10
10
  def self.included(base)
11
11
  base.storage Cloudinary::CarrierWave::Storage
12
12
  base.extend ClassMethods
13
- base.class_attribute :storage_type, :metadata
13
+ base.class_attribute :metadata
14
+ base.class_attribute :storage_type, instance_reader: false
14
15
  override_in_versions(base, :blank?, :full_public_id, :my_public_id, :all_versions_processors, :stored_version)
15
16
  end
16
17
 
@@ -1,10 +1,10 @@
1
1
  module Cloudinary::CarrierWave
2
2
  def download!(uri, *args)
3
- return super if !self.cloudinary_should_handle_remote?
3
+ return super unless self.cloudinary_should_handle_remote?
4
4
  if respond_to?(:process_uri)
5
5
  uri = process_uri(uri)
6
6
  else # Backward compatibility with old CarrierWave
7
- uri = URI.parse(URI.escape(URI.unescape(uri)))
7
+ uri = URI.parse(Cloudinary::Utils.smart_escape(Cloudinary::Utils.smart_unescape(uri)))
8
8
  end
9
9
  return if uri.to_s.blank?
10
10
  self.original_filename = @cache_id = @filename = File.basename(uri.path).gsub(/[^a-zA-Z0-9\.\-\+_]/, '')