carrierwave 1.3.2 → 2.2.2

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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +117 -43
  3. data/lib/carrierwave.rb +4 -0
  4. data/lib/carrierwave/downloader/base.rb +87 -0
  5. data/lib/carrierwave/downloader/remote_file.rb +65 -0
  6. data/lib/carrierwave/locale/en.yml +5 -4
  7. data/lib/carrierwave/mount.rb +25 -19
  8. data/lib/carrierwave/mounter.rb +71 -48
  9. data/lib/carrierwave/orm/activerecord.rb +14 -8
  10. data/lib/carrierwave/processing.rb +1 -0
  11. data/lib/carrierwave/processing/mini_magick.rb +100 -117
  12. data/lib/carrierwave/processing/rmagick.rb +2 -2
  13. data/lib/carrierwave/processing/vips.rb +284 -0
  14. data/lib/carrierwave/sanitized_file.rb +38 -16
  15. data/lib/carrierwave/storage.rb +1 -0
  16. data/lib/carrierwave/storage/file.rb +2 -2
  17. data/lib/carrierwave/storage/fog.rb +44 -13
  18. data/lib/carrierwave/uploader.rb +0 -9
  19. data/lib/carrierwave/uploader/cache.rb +24 -16
  20. data/lib/carrierwave/uploader/configuration.rb +28 -15
  21. data/lib/carrierwave/uploader/content_type_blacklist.rb +17 -8
  22. data/lib/carrierwave/uploader/content_type_whitelist.rb +20 -8
  23. data/lib/carrierwave/uploader/download.rb +2 -123
  24. data/lib/carrierwave/uploader/extension_blacklist.rb +18 -10
  25. data/lib/carrierwave/uploader/extension_whitelist.rb +19 -10
  26. data/lib/carrierwave/uploader/mountable.rb +6 -0
  27. data/lib/carrierwave/uploader/proxy.rb +2 -2
  28. data/lib/carrierwave/uploader/serialization.rb +1 -1
  29. data/lib/carrierwave/uploader/store.rb +5 -3
  30. data/lib/carrierwave/uploader/url.rb +6 -3
  31. data/lib/carrierwave/uploader/versions.rb +43 -13
  32. data/lib/carrierwave/validations/active_model.rb +3 -3
  33. data/lib/carrierwave/version.rb +1 -1
  34. data/lib/generators/templates/uploader.rb +2 -2
  35. metadata +99 -20
@@ -8,43 +8,51 @@ module CarrierWave
8
8
  end
9
9
 
10
10
  ##
11
- # Override this method in your uploader to provide a black list of extensions which
11
+ # Override this method in your uploader to provide a denylist of extensions which
12
12
  # are prohibited to be uploaded. Compares the file's extension case insensitive.
13
13
  # Furthermore, not only strings but Regexp are allowed as well.
14
14
  #
15
- # When using a Regexp in the black list, `\A` and `\z` are automatically added to
15
+ # When using a Regexp in the denylist, `\A` and `\z` are automatically added to
16
16
  # the Regexp expression, also case insensitive.
17
17
  #
18
18
  # === Returns
19
19
 
20
- # [NilClass, String, Regexp, Array[String, Regexp]] a black list of extensions which are prohibited to be uploaded
20
+ # [NilClass, String, Regexp, Array[String, Regexp]] a deny list of extensions which are prohibited to be uploaded
21
21
  #
22
22
  # === Examples
23
23
  #
24
- # def extension_blacklist
24
+ # def extension_denylist
25
25
  # %w(swf tiff)
26
26
  # end
27
27
  #
28
28
  # Basically the same, but using a Regexp:
29
29
  #
30
- # def extension_blacklist
30
+ # def extension_denylist
31
31
  # [/swf/, 'tiff']
32
32
  # end
33
33
  #
34
-
35
- def extension_blacklist; end
34
+ def extension_denylist
35
+ if respond_to?(:extension_blacklist)
36
+ ActiveSupport::Deprecation.warn "#extension_blacklist is deprecated, use #extension_denylist instead." unless instance_variable_defined?(:@extension_blacklist_warned)
37
+ @extension_blacklist_warned = true
38
+ extension_blacklist
39
+ end
40
+ end
36
41
 
37
42
  private
38
43
 
39
44
  def check_extension_blacklist!(new_file)
45
+ return unless extension_denylist
46
+
40
47
  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(", "))
48
+ if blacklisted_extension?(extension)
49
+ raise CarrierWave::IntegrityError, I18n.translate(:"errors.messages.extension_blacklist_error", extension: new_file.extension.inspect,
50
+ prohibited_types: Array(extension_denylist).join(", "), default: :"errors.messages.extension_denylist_error")
43
51
  end
44
52
  end
45
53
 
46
54
  def blacklisted_extension?(extension)
47
- Array(extension_blacklist).any? { |item| extension =~ /\A#{item}\z/i }
55
+ Array(extension_denylist).any? { |item| extension =~ /\A#{item}\z/i }
48
56
  end
49
57
  end
50
58
  end
@@ -8,45 +8,54 @@ module CarrierWave
8
8
  end
9
9
 
10
10
  ##
11
- # Override this method in your uploader to provide a white list of extensions which
11
+ # Override this method in your uploader to provide an allowlist of extensions which
12
12
  # are allowed to be uploaded. Compares the file's extension case insensitive.
13
13
  # Furthermore, not only strings but Regexp are allowed as well.
14
14
  #
15
- # When using a Regexp in the white list, `\A` and `\z` are automatically added to
15
+ # When using a Regexp in the allowlist, `\A` and `\z` are automatically added to
16
16
  # the Regexp expression, also case insensitive.
17
17
  #
18
18
  # === Returns
19
19
  #
20
- # [NilClass, String, Regexp, Array[String, Regexp]] a white list of extensions which are allowed to be uploaded
20
+ # [NilClass, String, Regexp, Array[String, Regexp]] an allowlist of extensions which are allowed to be uploaded
21
21
  #
22
22
  # === Examples
23
23
  #
24
- # def extension_whitelist
24
+ # def extension_allowlist
25
25
  # %w(jpg jpeg gif png)
26
26
  # end
27
27
  #
28
28
  # Basically the same, but using a Regexp:
29
29
  #
30
- # def extension_whitelist
30
+ # def extension_allowlist
31
31
  # [/jpe?g/, 'gif', 'png']
32
32
  # end
33
33
  #
34
- def extension_whitelist; end
34
+ def extension_allowlist
35
+ if respond_to?(:extension_whitelist)
36
+ ActiveSupport::Deprecation.warn "#extension_whitelist is deprecated, use #extension_allowlist instead." unless instance_variable_defined?(:@extension_whitelist_warned)
37
+ @extension_whitelist_warned = true
38
+ extension_whitelist
39
+ end
40
+ end
35
41
 
36
42
  private
37
43
 
38
44
  def check_extension_whitelist!(new_file)
45
+ return unless extension_allowlist
46
+
39
47
  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(", "))
48
+ if !whitelisted_extension?(extension)
49
+ # Look for whitelist first, then fallback to allowlist
50
+ raise CarrierWave::IntegrityError, I18n.translate(:"errors.messages.extension_whitelist_error", extension: new_file.extension.inspect,
51
+ allowed_types: Array(extension_allowlist).join(", "), default: :"errors.messages.extension_allowlist_error")
42
52
  end
43
53
  end
44
54
 
45
55
  def whitelisted_extension?(extension)
46
56
  downcase_extension = extension.downcase
47
- Array(extension_whitelist).any? { |item| downcase_extension =~ /\A#{item}\z/i }
57
+ Array(extension_allowlist).any? { |item| downcase_extension =~ /\A#{item}\z/i }
48
58
  end
49
-
50
59
  end # ExtensionWhitelist
51
60
  end # Uploader
52
61
  end # CarrierWave
@@ -33,6 +33,12 @@ module CarrierWave
33
33
  @mounted_as = mounted_as
34
34
  end
35
35
 
36
+ ##
37
+ # Returns array index of given uploader within currently mounted uploaders
38
+ #
39
+ def index
40
+ model.__send__(:_mounter, mounted_as).uploaders.index(self)
41
+ end
36
42
  end # Mountable
37
43
  end # Uploader
38
44
  end # CarrierWave
@@ -23,14 +23,14 @@ module CarrierWave
23
23
  alias_method :path, :current_path
24
24
 
25
25
  ##
26
- # Returns a string that uniquely identifies the last stored file
26
+ # Returns a string that uniquely identifies the retrieved or last stored file
27
27
  #
28
28
  # === Returns
29
29
  #
30
30
  # [String] uniquely identifies a file
31
31
  #
32
32
  def identifier
33
- storage.try(:identifier)
33
+ @identifier || storage.try(:identifier)
34
34
  end
35
35
 
36
36
  ##
@@ -7,7 +7,7 @@ module CarrierWave
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  def serializable_hash(options = nil)
10
- {"url" => url}.merge Hash[versions.map { |name, version| [name, { "url" => version.url }] }]
10
+ {"url" => url}.merge Hash[versions.map { |name, version| [name.to_s, { "url" => version.url }] }]
11
11
  end
12
12
 
13
13
  def as_json(options=nil)
@@ -11,7 +11,7 @@ module CarrierWave
11
11
  prepend Module.new {
12
12
  def initialize(*)
13
13
  super
14
- @file, @filename, @cache_id = nil
14
+ @file, @filename, @cache_id, @identifier = nil
15
15
  end
16
16
  }
17
17
  end
@@ -61,7 +61,7 @@ module CarrierWave
61
61
  #
62
62
  def store!(new_file=nil)
63
63
  cache!(new_file) if new_file && ((@cache_id != parent_cache_id) || @cache_id.nil?)
64
- if !cache_only and @file and @cache_id
64
+ if !cache_only && @file && @cache_id
65
65
  with_callbacks(:store, new_file) do
66
66
  new_file = storage.store!(@file)
67
67
  if delete_tmp_file_after_storage
@@ -69,7 +69,8 @@ module CarrierWave
69
69
  cache_storage.delete_dir!(cache_path(nil))
70
70
  end
71
71
  @file = new_file
72
- @cache_id = nil
72
+ @cache_id = @identifier = nil
73
+ @staged = false
73
74
  end
74
75
  end
75
76
  end
@@ -84,6 +85,7 @@ module CarrierWave
84
85
  def retrieve_from_store!(identifier)
85
86
  with_callbacks(:retrieve_from_store, identifier) do
86
87
  @file = storage.retrieve!(identifier)
88
+ @identifier = identifier
87
89
  end
88
90
  end
89
91
 
@@ -15,9 +15,12 @@ module CarrierWave
15
15
  # [String] the location where this file is accessible via a url
16
16
  #
17
17
  def url(options = {})
18
- if file.respond_to?(:url) and not (tmp_url = file.url).blank?
19
- file.method(:url).arity == 0 ? tmp_url : file.url(options)
20
- elsif file.respond_to?(:path)
18
+ if file.respond_to?(:url)
19
+ tmp_url = file.method(:url).arity.zero? ? file.url : file.url(options)
20
+ return tmp_url if tmp_url.present?
21
+ end
22
+
23
+ if file.respond_to?(:path)
21
24
  path = encode_path(file.path.sub(File.expand_path(root), ''))
22
25
 
23
26
  if host = asset_host
@@ -23,7 +23,7 @@ module CarrierWave
23
23
  prepend Module.new {
24
24
  def initialize(*)
25
25
  super
26
- @versions = nil
26
+ @versions, @versions_to_cache, @versions_to_store = nil
27
27
  end
28
28
  }
29
29
  end
@@ -220,16 +220,18 @@ module CarrierWave
220
220
  # Recreate versions and reprocess them. This can be used to recreate
221
221
  # versions if their parameters somehow have changed.
222
222
  #
223
- def recreate_versions!(*versions)
223
+ def recreate_versions!(*names)
224
224
  # Some files could possibly not be stored on the local disk. This
225
225
  # doesn't play nicely with processing. Make sure that we're only
226
226
  # processing a cached file
227
227
  #
228
228
  # The call to store! will trigger the necessary callbacks to both
229
229
  # process this version and all sub-versions
230
- if versions.any?
231
- file = sanitized_file if !cached?
232
- store_versions!(file, versions)
230
+
231
+ if names.any?
232
+ set_versions_to_cache_and_store(names)
233
+ store!(file)
234
+ reset_versions_to_cache_and_store
233
235
  else
234
236
  cache! if !cached?
235
237
  store!
@@ -237,6 +239,39 @@ module CarrierWave
237
239
  end
238
240
 
239
241
  private
242
+
243
+ def set_versions_to_cache_and_store(names)
244
+ @versions_to_cache = source_versions_of(names)
245
+ @versions_to_store = active_versions_with_names_in(@versions_to_cache + names)
246
+ end
247
+
248
+ def reset_versions_to_cache_and_store
249
+ @versions_to_cache, @versions_to_store = nil, nil
250
+ end
251
+
252
+ def versions_to_cache
253
+ @versions_to_cache || dependent_versions
254
+ end
255
+
256
+ def versions_to_store
257
+ @versions_to_store || active_versions
258
+ end
259
+
260
+ def source_versions_of(requested_names)
261
+ versions.inject([]) do |sources, (name, uploader)|
262
+ next sources unless requested_names.include?(name)
263
+ next sources unless source_name = uploader.class.version_options[:from_version]
264
+
265
+ sources << [source_name, versions[source_name]]
266
+ end.uniq
267
+ end
268
+
269
+ def active_versions_with_names_in(names)
270
+ active_versions.select do |pretendent_name, uploader|
271
+ names.include?(pretendent_name)
272
+ end
273
+ end
274
+
240
275
  def assign_parent_cache_id(file)
241
276
  active_versions.each do |name, uploader|
242
277
  uploader.parent_cache_id = @cache_id
@@ -270,19 +305,14 @@ module CarrierWave
270
305
  end
271
306
 
272
307
  def cache_versions!(new_file)
273
- dependent_versions.each do |name, v|
308
+ versions_to_cache.each do |name, v|
274
309
  v.send(:cache_id=, @cache_id)
275
310
  v.cache!(new_file)
276
311
  end
277
312
  end
278
313
 
279
- def store_versions!(new_file, versions=nil)
280
- if versions
281
- active = Hash[active_versions]
282
- versions.each { |v| active[v].try(:store!, new_file) } unless active.empty?
283
- else
284
- active_versions.each { |name, v| v.store!(new_file) }
285
- end
314
+ def store_versions!(new_file)
315
+ versions_to_store.each { |name, v| v.store!(new_file) }
286
316
  end
287
317
 
288
318
  def remove_versions!
@@ -11,7 +11,7 @@ module CarrierWave
11
11
  class ProcessingValidator < ::ActiveModel::EachValidator
12
12
 
13
13
  def validate_each(record, attribute, value)
14
- if e = record.__send__("#{attribute}_processing_error")
14
+ record.__send__("#{attribute}_processing_errors").each do |e|
15
15
  message = (e.message == e.class.to_s) ? :carrierwave_processing_error : e.message
16
16
  record.errors.add(attribute, message)
17
17
  end
@@ -21,7 +21,7 @@ module CarrierWave
21
21
  class IntegrityValidator < ::ActiveModel::EachValidator
22
22
 
23
23
  def validate_each(record, attribute, value)
24
- if e = record.__send__("#{attribute}_integrity_error")
24
+ record.__send__("#{attribute}_integrity_errors").each do |e|
25
25
  message = (e.message == e.class.to_s) ? :carrierwave_integrity_error : e.message
26
26
  record.errors.add(attribute, message)
27
27
  end
@@ -31,7 +31,7 @@ module CarrierWave
31
31
  class DownloadValidator < ::ActiveModel::EachValidator
32
32
 
33
33
  def validate_each(record, attribute, value)
34
- if e = record.__send__("#{attribute}_download_error")
34
+ record.__send__("#{attribute}_download_errors").each do |e|
35
35
  message = (e.message == e.class.to_s) ? :carrierwave_download_error : e.message
36
36
  record.errors.add(attribute, message)
37
37
  end
@@ -1,3 +1,3 @@
1
1
  module CarrierWave
2
- VERSION = "1.3.2"
2
+ VERSION = "2.2.2"
3
3
  end
@@ -33,9 +33,9 @@ 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
 
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.2
4
+ version: 2.2.2
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: 2021-02-08 00:00:00.000000000 Z
11
+ date: 2021-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,42 +16,84 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.0.0
19
+ version: 5.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: 5.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: 5.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: 5.0.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: mime-types
42
+ name: mini_mime
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '1.16'
47
+ version: 0.1.3
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: 0.1.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: image_processing
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: marcel
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.0.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.0.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: addressable
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.6'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.6'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: ssrf_filter
57
99
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +128,14 @@ dependencies:
86
128
  requirements:
87
129
  - - ">="
88
130
  - !ruby/object:Gem::Version
89
- version: 4.0.0
131
+ version: 5.0.0
90
132
  type: :development
91
133
  prerelease: false
92
134
  version_requirements: !ruby/object:Gem::Requirement
93
135
  requirements:
94
136
  - - ">="
95
137
  - !ruby/object:Gem::Version
96
- version: 4.0.0
138
+ version: 5.0.0
97
139
  - !ruby/object:Gem::Dependency
98
140
  name: cucumber
99
141
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +164,20 @@ dependencies:
122
164
  - - "~>"
123
165
  - !ruby/object:Gem::Version
124
166
  version: '3.4'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rspec-retry
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
125
181
  - !ruby/object:Gem::Dependency
126
182
  name: webmock
127
183
  requirement: !ruby/object:Gem::Requirement
@@ -156,14 +212,20 @@ dependencies:
156
212
  requirements:
157
213
  - - "~>"
158
214
  - !ruby/object:Gem::Version
159
- version: 1.7.1
215
+ version: '1.7'
216
+ - - "!="
217
+ - !ruby/object:Gem::Version
218
+ version: 1.12.1
160
219
  type: :development
161
220
  prerelease: false
162
221
  version_requirements: !ruby/object:Gem::Requirement
163
222
  requirements:
164
223
  - - "~>"
165
224
  - !ruby/object:Gem::Version
166
- version: 1.7.1
225
+ version: '1.7'
226
+ - - "!="
227
+ - !ruby/object:Gem::Version
228
+ version: 1.12.1
167
229
  - !ruby/object:Gem::Dependency
168
230
  name: fog-local
169
231
  requirement: !ruby/object:Gem::Requirement
@@ -210,14 +272,14 @@ dependencies:
210
272
  name: rmagick
211
273
  requirement: !ruby/object:Gem::Requirement
212
274
  requirements:
213
- - - "~>"
275
+ - - ">="
214
276
  - !ruby/object:Gem::Version
215
277
  version: '2.16'
216
278
  type: :development
217
279
  prerelease: false
218
280
  version_requirements: !ruby/object:Gem::Requirement
219
281
  requirements:
220
- - - "~>"
282
+ - - ">="
221
283
  - !ruby/object:Gem::Version
222
284
  version: '2.16'
223
285
  - !ruby/object:Gem::Dependency
@@ -262,6 +324,20 @@ dependencies:
262
324
  - - ">="
263
325
  - !ruby/object:Gem::Version
264
326
  version: '0'
327
+ - !ruby/object:Gem::Dependency
328
+ name: pry-byebug
329
+ requirement: !ruby/object:Gem::Requirement
330
+ requirements:
331
+ - - ">="
332
+ - !ruby/object:Gem::Version
333
+ version: '0'
334
+ type: :development
335
+ prerelease: false
336
+ version_requirements: !ruby/object:Gem::Requirement
337
+ requirements:
338
+ - - ">="
339
+ - !ruby/object:Gem::Version
340
+ version: '0'
265
341
  description: Upload files in your Ruby applications, map them to a range of ORMs,
266
342
  store them on different backends.
267
343
  email:
@@ -274,6 +350,8 @@ files:
274
350
  - README.md
275
351
  - lib/carrierwave.rb
276
352
  - lib/carrierwave/compatibility/paperclip.rb
353
+ - lib/carrierwave/downloader/base.rb
354
+ - lib/carrierwave/downloader/remote_file.rb
277
355
  - lib/carrierwave/error.rb
278
356
  - lib/carrierwave/locale/en.yml
279
357
  - lib/carrierwave/mount.rb
@@ -282,6 +360,7 @@ files:
282
360
  - lib/carrierwave/processing.rb
283
361
  - lib/carrierwave/processing/mini_magick.rb
284
362
  - lib/carrierwave/processing/rmagick.rb
363
+ - lib/carrierwave/processing/vips.rb
285
364
  - lib/carrierwave/sanitized_file.rb
286
365
  - lib/carrierwave/storage.rb
287
366
  - lib/carrierwave/storage/abstract.rb
@@ -317,7 +396,7 @@ homepage: https://github.com/carrierwaveuploader/carrierwave
317
396
  licenses:
318
397
  - MIT
319
398
  metadata: {}
320
- post_install_message:
399
+ post_install_message:
321
400
  rdoc_options:
322
401
  - "--main"
323
402
  require_paths:
@@ -326,15 +405,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
326
405
  requirements:
327
406
  - - ">="
328
407
  - !ruby/object:Gem::Version
329
- version: 2.0.0
408
+ version: 2.2.2
330
409
  required_rubygems_version: !ruby/object:Gem::Requirement
331
410
  requirements:
332
411
  - - ">="
333
412
  - !ruby/object:Gem::Version
334
413
  version: '0'
335
414
  requirements: []
336
- rubygems_version: 3.1.2
337
- signing_key:
415
+ rubygems_version: 3.1.4
416
+ signing_key:
338
417
  specification_version: 4
339
418
  summary: Ruby file upload library
340
419
  test_files: []