carrierwave 1.3.1 → 3.0.5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of carrierwave might be problematic. Click here for more details.

Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +238 -91
  3. data/lib/carrierwave/compatibility/paperclip.rb +4 -2
  4. data/lib/carrierwave/downloader/base.rb +101 -0
  5. data/lib/carrierwave/downloader/remote_file.rb +68 -0
  6. data/lib/carrierwave/locale/en.yml +9 -6
  7. data/lib/carrierwave/mount.rb +53 -61
  8. data/lib/carrierwave/mounter.rb +167 -77
  9. data/lib/carrierwave/orm/activerecord.rb +15 -55
  10. data/lib/carrierwave/processing/mini_magick.rb +108 -123
  11. data/lib/carrierwave/processing/rmagick.rb +20 -18
  12. data/lib/carrierwave/processing/vips.rb +284 -0
  13. data/lib/carrierwave/processing.rb +1 -0
  14. data/lib/carrierwave/sanitized_file.rb +66 -73
  15. data/lib/carrierwave/storage/abstract.rb +5 -5
  16. data/lib/carrierwave/storage/file.rb +6 -5
  17. data/lib/carrierwave/storage/fog.rb +101 -64
  18. data/lib/carrierwave/storage.rb +1 -0
  19. data/lib/carrierwave/test/matchers.rb +11 -7
  20. data/lib/carrierwave/uploader/cache.rb +40 -24
  21. data/lib/carrierwave/uploader/callbacks.rb +1 -1
  22. data/lib/carrierwave/uploader/configuration.rb +38 -19
  23. data/lib/carrierwave/uploader/content_type_allowlist.rb +62 -0
  24. data/lib/carrierwave/uploader/content_type_denylist.rb +62 -0
  25. data/lib/carrierwave/uploader/dimension.rb +66 -0
  26. data/lib/carrierwave/uploader/download.rb +2 -80
  27. data/lib/carrierwave/uploader/extension_allowlist.rb +63 -0
  28. data/lib/carrierwave/uploader/extension_denylist.rb +64 -0
  29. data/lib/carrierwave/uploader/file_size.rb +2 -2
  30. data/lib/carrierwave/uploader/mountable.rb +6 -0
  31. data/lib/carrierwave/uploader/processing.rb +42 -7
  32. data/lib/carrierwave/uploader/proxy.rb +17 -4
  33. data/lib/carrierwave/uploader/serialization.rb +1 -1
  34. data/lib/carrierwave/uploader/store.rb +47 -7
  35. data/lib/carrierwave/uploader/url.rb +7 -4
  36. data/lib/carrierwave/uploader/versions.rb +153 -105
  37. data/lib/carrierwave/uploader.rb +10 -17
  38. data/lib/carrierwave/utilities/file_name.rb +47 -0
  39. data/lib/carrierwave/utilities/uri.rb +14 -11
  40. data/lib/carrierwave/utilities.rb +1 -0
  41. data/lib/carrierwave/validations/active_model.rb +7 -9
  42. data/lib/carrierwave/version.rb +1 -1
  43. data/lib/carrierwave.rb +13 -17
  44. data/lib/generators/templates/{uploader.rb → uploader.rb.erb} +3 -3
  45. data/lib/generators/uploader_generator.rb +3 -3
  46. metadata +104 -38
  47. data/lib/carrierwave/uploader/content_type_blacklist.rb +0 -48
  48. data/lib/carrierwave/uploader/content_type_whitelist.rb +0 -48
  49. data/lib/carrierwave/uploader/extension_blacklist.rb +0 -51
  50. data/lib/carrierwave/uploader/extension_whitelist.rb +0 -52
data/lib/carrierwave.rb CHANGED
@@ -25,16 +25,7 @@ module CarrierWave
25
25
 
26
26
  end
27
27
 
28
- if defined?(Merb)
29
-
30
- CarrierWave.root = Merb.dir_for(:public)
31
- Merb::BootLoader.before_app_loads do
32
- # Setup path for uploaders and load all of them before classes are loaded
33
- Merb.push_path(:uploaders, Merb.root / 'app' / 'uploaders', '*.rb')
34
- Dir.glob(File.join(Merb.load_paths[:uploaders])).each {|f| require f }
35
- end
36
-
37
- elsif defined?(Jets)
28
+ if defined?(Jets)
38
29
 
39
30
  module CarrierWave
40
31
  class Turbine < Jets::Turbine
@@ -72,6 +63,10 @@ elsif defined?(Rails)
72
63
  require 'carrierwave/orm/activerecord'
73
64
  end
74
65
  end
66
+
67
+ config.before_eager_load do
68
+ CarrierWave::Storage::Fog.eager_load
69
+ end
75
70
  end
76
71
  end
77
72
 
@@ -80,13 +75,14 @@ elsif defined?(Sinatra)
80
75
  CarrierWave.root = File.join(PADRINO_ROOT, "public")
81
76
  else
82
77
 
83
- CarrierWave.root = if Sinatra::Application.respond_to?(:public_folder)
84
- # Sinatra >= 1.3
85
- Sinatra::Application.public_folder
86
- else
87
- # Sinatra < 1.3
88
- Sinatra::Application.public
89
- end
78
+ CarrierWave.root =
79
+ if Sinatra::Application.respond_to?(:public_folder)
80
+ # Sinatra >= 1.3
81
+ Sinatra::Application.public_folder
82
+ else
83
+ # Sinatra < 1.3
84
+ Sinatra::Application.public
85
+ end
90
86
  end
91
87
  end
92
88
 
@@ -33,15 +33,15 @@ class <%= class_name %>Uploader < CarrierWave::Uploader::Base
33
33
  # process resize_to_fit: [50, 50]
34
34
  # end
35
35
 
36
- # Add a white list of extensions which are allowed to be uploaded.
36
+ # Add an allowlist of extensions which are allowed to be uploaded.
37
37
  # For images you might use something like this:
38
- # def extension_whitelist
38
+ # def extension_allowlist
39
39
  # %w(jpg jpeg gif png)
40
40
  # end
41
41
 
42
42
  # Override the filename of the uploaded files:
43
43
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
44
44
  # def filename
45
- # "something.jpg" if original_filename
45
+ # "something.jpg"
46
46
  # end
47
47
  end
@@ -1,7 +1,7 @@
1
1
  class UploaderGenerator < Rails::Generators::NamedBase
2
- source_root File.expand_path("../templates", __FILE__)
2
+ source_root File.expand_path('templates', __dir__)
3
3
 
4
4
  def create_uploader_file
5
- template "uploader.rb", File.join('app/uploaders', class_path, "#{file_name}_uploader.rb")
5
+ template "uploader.rb.erb", File.join('app/uploaders', class_path, "#{file_name}_uploader.rb")
6
6
  end
7
- end
7
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carrierwave
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 3.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Nicklas
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-29 00:00:00.000000000 Z
11
+ date: 2023-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,70 +16,84 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.0.0
19
+ version: 6.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 4.0.0
26
+ version: 6.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activemodel
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 4.0.0
33
+ version: 6.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 4.0.0
40
+ version: 6.0.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: mime-types
42
+ name: image_processing
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.16'
47
+ version: '1.1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.16'
54
+ version: '1.1'
55
55
  - !ruby/object:Gem::Dependency
56
- name: pg
56
+ name: marcel
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
61
+ version: 1.0.0
62
+ type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 1.0.0
69
69
  - !ruby/object:Gem::Dependency
70
- name: rails
70
+ name: addressable
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 4.0.0
76
- type: :development
75
+ version: '2.6'
76
+ type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 4.0.0
82
+ version: '2.6'
83
+ - !ruby/object:Gem::Dependency
84
+ name: ssrf_filter
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: cucumber
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +122,34 @@ dependencies:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
124
  version: '3.4'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec-retry
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.28'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.28'
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: webmock
113
155
  requirement: !ruby/object:Gem::Requirement
@@ -142,14 +184,20 @@ dependencies:
142
184
  requirements:
143
185
  - - "~>"
144
186
  - !ruby/object:Gem::Version
145
- version: 1.7.1
187
+ version: '1.7'
188
+ - - "!="
189
+ - !ruby/object:Gem::Version
190
+ version: 1.12.1
146
191
  type: :development
147
192
  prerelease: false
148
193
  version_requirements: !ruby/object:Gem::Requirement
149
194
  requirements:
150
195
  - - "~>"
151
196
  - !ruby/object:Gem::Version
152
- version: 1.7.1
197
+ version: '1.7'
198
+ - - "!="
199
+ - !ruby/object:Gem::Version
200
+ version: 1.12.1
153
201
  - !ruby/object:Gem::Dependency
154
202
  name: fog-local
155
203
  requirement: !ruby/object:Gem::Requirement
@@ -198,14 +246,14 @@ dependencies:
198
246
  requirements:
199
247
  - - ">="
200
248
  - !ruby/object:Gem::Version
201
- version: '0'
249
+ version: '2.16'
202
250
  type: :development
203
251
  prerelease: false
204
252
  version_requirements: !ruby/object:Gem::Requirement
205
253
  requirements:
206
254
  - - ">="
207
255
  - !ruby/object:Gem::Version
208
- version: '0'
256
+ version: '2.16'
209
257
  - !ruby/object:Gem::Dependency
210
258
  name: timecop
211
259
  requirement: !ruby/object:Gem::Requirement
@@ -248,6 +296,20 @@ dependencies:
248
296
  - - ">="
249
297
  - !ruby/object:Gem::Version
250
298
  version: '0'
299
+ - !ruby/object:Gem::Dependency
300
+ name: pry-byebug
301
+ requirement: !ruby/object:Gem::Requirement
302
+ requirements:
303
+ - - ">="
304
+ - !ruby/object:Gem::Version
305
+ version: '0'
306
+ type: :development
307
+ prerelease: false
308
+ version_requirements: !ruby/object:Gem::Requirement
309
+ requirements:
310
+ - - ">="
311
+ - !ruby/object:Gem::Version
312
+ version: '0'
251
313
  description: Upload files in your Ruby applications, map them to a range of ORMs,
252
314
  store them on different backends.
253
315
  email:
@@ -260,6 +322,8 @@ files:
260
322
  - README.md
261
323
  - lib/carrierwave.rb
262
324
  - lib/carrierwave/compatibility/paperclip.rb
325
+ - lib/carrierwave/downloader/base.rb
326
+ - lib/carrierwave/downloader/remote_file.rb
263
327
  - lib/carrierwave/error.rb
264
328
  - lib/carrierwave/locale/en.yml
265
329
  - lib/carrierwave/mount.rb
@@ -268,6 +332,7 @@ files:
268
332
  - lib/carrierwave/processing.rb
269
333
  - lib/carrierwave/processing/mini_magick.rb
270
334
  - lib/carrierwave/processing/rmagick.rb
335
+ - lib/carrierwave/processing/vips.rb
271
336
  - lib/carrierwave/sanitized_file.rb
272
337
  - lib/carrierwave/storage.rb
273
338
  - lib/carrierwave/storage/abstract.rb
@@ -278,12 +343,13 @@ files:
278
343
  - lib/carrierwave/uploader/cache.rb
279
344
  - lib/carrierwave/uploader/callbacks.rb
280
345
  - lib/carrierwave/uploader/configuration.rb
281
- - lib/carrierwave/uploader/content_type_blacklist.rb
282
- - lib/carrierwave/uploader/content_type_whitelist.rb
346
+ - lib/carrierwave/uploader/content_type_allowlist.rb
347
+ - lib/carrierwave/uploader/content_type_denylist.rb
283
348
  - lib/carrierwave/uploader/default_url.rb
349
+ - lib/carrierwave/uploader/dimension.rb
284
350
  - lib/carrierwave/uploader/download.rb
285
- - lib/carrierwave/uploader/extension_blacklist.rb
286
- - lib/carrierwave/uploader/extension_whitelist.rb
351
+ - lib/carrierwave/uploader/extension_allowlist.rb
352
+ - lib/carrierwave/uploader/extension_denylist.rb
287
353
  - lib/carrierwave/uploader/file_size.rb
288
354
  - lib/carrierwave/uploader/mountable.rb
289
355
  - lib/carrierwave/uploader/processing.rb
@@ -294,16 +360,17 @@ files:
294
360
  - lib/carrierwave/uploader/url.rb
295
361
  - lib/carrierwave/uploader/versions.rb
296
362
  - lib/carrierwave/utilities.rb
363
+ - lib/carrierwave/utilities/file_name.rb
297
364
  - lib/carrierwave/utilities/uri.rb
298
365
  - lib/carrierwave/validations/active_model.rb
299
366
  - lib/carrierwave/version.rb
300
- - lib/generators/templates/uploader.rb
367
+ - lib/generators/templates/uploader.rb.erb
301
368
  - lib/generators/uploader_generator.rb
302
369
  homepage: https://github.com/carrierwaveuploader/carrierwave
303
370
  licenses:
304
371
  - MIT
305
372
  metadata: {}
306
- post_install_message:
373
+ post_install_message:
307
374
  rdoc_options:
308
375
  - "--main"
309
376
  require_paths:
@@ -312,16 +379,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
312
379
  requirements:
313
380
  - - ">="
314
381
  - !ruby/object:Gem::Version
315
- version: 2.0.0
382
+ version: 2.5.0
316
383
  required_rubygems_version: !ruby/object:Gem::Requirement
317
384
  requirements:
318
385
  - - ">="
319
386
  - !ruby/object:Gem::Version
320
387
  version: '0'
321
388
  requirements: []
322
- rubyforge_project:
323
- rubygems_version: 2.7.8
324
- signing_key:
389
+ rubygems_version: 3.4.10
390
+ signing_key:
325
391
  specification_version: 4
326
392
  summary: Ruby file upload library
327
393
  test_files: []
@@ -1,48 +0,0 @@
1
- module CarrierWave
2
- module Uploader
3
- module ContentTypeBlacklist
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- before :cache, :check_content_type_blacklist!
8
- end
9
-
10
- ##
11
- # Override this method in your uploader to provide a blacklist of files content types
12
- # which are not allowed to be uploaded.
13
- # Not only strings but Regexp are allowed as well.
14
- #
15
- # === Returns
16
- #
17
- # [NilClass, String, Regexp, Array[String, Regexp]] a blacklist of content types which are not allowed to be uploaded
18
- #
19
- # === Examples
20
- #
21
- # def content_type_blacklist
22
- # %w(text/json application/json)
23
- # end
24
- #
25
- # Basically the same, but using a Regexp:
26
- #
27
- # def content_type_blacklist
28
- # [/(text|application)\/json/]
29
- # end
30
- #
31
- def content_type_blacklist; end
32
-
33
- private
34
-
35
- def check_content_type_blacklist!(new_file)
36
- content_type = new_file.content_type
37
- if content_type_blacklist && blacklisted_content_type?(content_type)
38
- raise CarrierWave::IntegrityError, I18n.translate(:"errors.messages.content_type_blacklist_error", content_type: content_type)
39
- end
40
- end
41
-
42
- def blacklisted_content_type?(content_type)
43
- Array(content_type_blacklist).any? { |item| content_type =~ /#{item}/ }
44
- end
45
-
46
- end # ContentTypeBlacklist
47
- end # Uploader
48
- end # CarrierWave
@@ -1,48 +0,0 @@
1
- module CarrierWave
2
- module Uploader
3
- module ContentTypeWhitelist
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- before :cache, :check_content_type_whitelist!
8
- end
9
-
10
- ##
11
- # Override this method in your uploader to provide a whitelist of files content types
12
- # which are allowed to be uploaded.
13
- # Not only strings but Regexp are allowed as well.
14
- #
15
- # === Returns
16
- #
17
- # [NilClass, String, Regexp, Array[String, Regexp]] a whitelist of content types which are allowed to be uploaded
18
- #
19
- # === Examples
20
- #
21
- # def content_type_whitelist
22
- # %w(text/json application/json)
23
- # end
24
- #
25
- # Basically the same, but using a Regexp:
26
- #
27
- # def content_type_whitelist
28
- # [/(text|application)\/json/]
29
- # end
30
- #
31
- def content_type_whitelist; end
32
-
33
- private
34
-
35
- def check_content_type_whitelist!(new_file)
36
- content_type = new_file.content_type
37
- if content_type_whitelist && !whitelisted_content_type?(content_type)
38
- raise CarrierWave::IntegrityError, I18n.translate(:"errors.messages.content_type_whitelist_error", content_type: content_type, allowed_types: Array(content_type_whitelist).join(", "))
39
- end
40
- end
41
-
42
- def whitelisted_content_type?(content_type)
43
- Array(content_type_whitelist).any? { |item| content_type =~ /#{item}/ }
44
- end
45
-
46
- end # ContentTypeWhitelist
47
- end # Uploader
48
- end # CarrierWave
@@ -1,51 +0,0 @@
1
- module CarrierWave
2
- module Uploader
3
- module ExtensionBlacklist
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- before :cache, :check_extension_blacklist!
8
- end
9
-
10
- ##
11
- # Override this method in your uploader to provide a black list of extensions which
12
- # are prohibited to be uploaded. Compares the file's extension case insensitive.
13
- # Furthermore, not only strings but Regexp are allowed as well.
14
- #
15
- # When using a Regexp in the black list, `\A` and `\z` are automatically added to
16
- # the Regexp expression, also case insensitive.
17
- #
18
- # === Returns
19
-
20
- # [NilClass, String, Regexp, Array[String, Regexp]] a black list of extensions which are prohibited to be uploaded
21
- #
22
- # === Examples
23
- #
24
- # def extension_blacklist
25
- # %w(swf tiff)
26
- # end
27
- #
28
- # Basically the same, but using a Regexp:
29
- #
30
- # def extension_blacklist
31
- # [/swf/, 'tiff']
32
- # end
33
- #
34
-
35
- def extension_blacklist; end
36
-
37
- private
38
-
39
- def check_extension_blacklist!(new_file)
40
- extension = new_file.extension.to_s
41
- if extension_blacklist && blacklisted_extension?(extension)
42
- raise CarrierWave::IntegrityError, I18n.translate(:"errors.messages.extension_blacklist_error", extension: new_file.extension.inspect, prohibited_types: Array(extension_blacklist).join(", "))
43
- end
44
- end
45
-
46
- def blacklisted_extension?(extension)
47
- Array(extension_blacklist).any? { |item| extension =~ /\A#{item}\z/i }
48
- end
49
- end
50
- end
51
- end
@@ -1,52 +0,0 @@
1
- module CarrierWave
2
- module Uploader
3
- module ExtensionWhitelist
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- before :cache, :check_extension_whitelist!
8
- end
9
-
10
- ##
11
- # Override this method in your uploader to provide a white list of extensions which
12
- # are allowed to be uploaded. Compares the file's extension case insensitive.
13
- # Furthermore, not only strings but Regexp are allowed as well.
14
- #
15
- # When using a Regexp in the white list, `\A` and `\z` are automatically added to
16
- # the Regexp expression, also case insensitive.
17
- #
18
- # === Returns
19
- #
20
- # [NilClass, String, Regexp, Array[String, Regexp]] a white list of extensions which are allowed to be uploaded
21
- #
22
- # === Examples
23
- #
24
- # def extension_whitelist
25
- # %w(jpg jpeg gif png)
26
- # end
27
- #
28
- # Basically the same, but using a Regexp:
29
- #
30
- # def extension_whitelist
31
- # [/jpe?g/, 'gif', 'png']
32
- # end
33
- #
34
- def extension_whitelist; end
35
-
36
- private
37
-
38
- def check_extension_whitelist!(new_file)
39
- extension = new_file.extension.to_s
40
- if extension_whitelist && !whitelisted_extension?(extension)
41
- raise CarrierWave::IntegrityError, I18n.translate(:"errors.messages.extension_whitelist_error", extension: new_file.extension.inspect, allowed_types: Array(extension_whitelist).join(", "))
42
- end
43
- end
44
-
45
- def whitelisted_extension?(extension)
46
- downcase_extension = extension.downcase
47
- Array(extension_whitelist).any? { |item| downcase_extension =~ /\A#{item}\z/i }
48
- end
49
-
50
- end # ExtensionWhitelist
51
- end # Uploader
52
- end # CarrierWave