carrierwave 0.11.2 → 3.1.2

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.
Files changed (69) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +495 -173
  3. data/lib/carrierwave/compatibility/paperclip.rb +4 -4
  4. data/lib/carrierwave/downloader/base.rb +101 -0
  5. data/lib/carrierwave/downloader/remote_file.rb +68 -0
  6. data/lib/carrierwave/error.rb +1 -0
  7. data/lib/carrierwave/locale/en.yml +11 -5
  8. data/lib/carrierwave/mount.rb +217 -182
  9. data/lib/carrierwave/mounter.rb +257 -0
  10. data/lib/carrierwave/orm/activerecord.rb +29 -35
  11. data/lib/carrierwave/processing/mini_magick.rb +169 -84
  12. data/lib/carrierwave/processing/rmagick.rb +107 -25
  13. data/lib/carrierwave/processing/vips.rb +315 -0
  14. data/lib/carrierwave/processing.rb +1 -1
  15. data/lib/carrierwave/sanitized_file.rb +105 -87
  16. data/lib/carrierwave/storage/abstract.rb +16 -3
  17. data/lib/carrierwave/storage/file.rb +71 -3
  18. data/lib/carrierwave/storage/fog.rb +228 -57
  19. data/lib/carrierwave/storage.rb +1 -9
  20. data/lib/carrierwave/test/matchers.rb +88 -19
  21. data/lib/carrierwave/uploader/cache.rb +75 -45
  22. data/lib/carrierwave/uploader/callbacks.rb +1 -3
  23. data/lib/carrierwave/uploader/configuration.rb +84 -16
  24. data/lib/carrierwave/uploader/content_type_allowlist.rb +62 -0
  25. data/lib/carrierwave/uploader/content_type_denylist.rb +62 -0
  26. data/lib/carrierwave/uploader/default_url.rb +3 -5
  27. data/lib/carrierwave/uploader/dimension.rb +66 -0
  28. data/lib/carrierwave/uploader/download.rb +4 -74
  29. data/lib/carrierwave/uploader/extension_allowlist.rb +63 -0
  30. data/lib/carrierwave/uploader/extension_denylist.rb +64 -0
  31. data/lib/carrierwave/uploader/file_size.rb +43 -0
  32. data/lib/carrierwave/uploader/mountable.rb +13 -8
  33. data/lib/carrierwave/uploader/processing.rb +51 -13
  34. data/lib/carrierwave/uploader/proxy.rb +20 -9
  35. data/lib/carrierwave/uploader/remove.rb +0 -2
  36. data/lib/carrierwave/uploader/serialization.rb +2 -4
  37. data/lib/carrierwave/uploader/store.rb +85 -28
  38. data/lib/carrierwave/uploader/url.rb +8 -7
  39. data/lib/carrierwave/uploader/versions.rb +175 -125
  40. data/lib/carrierwave/uploader.rb +12 -10
  41. data/lib/carrierwave/utilities/file_name.rb +47 -0
  42. data/lib/carrierwave/utilities/uri.rb +14 -12
  43. data/lib/carrierwave/utilities.rb +1 -3
  44. data/lib/carrierwave/validations/active_model.rb +7 -11
  45. data/lib/carrierwave/version.rb +1 -1
  46. data/lib/carrierwave.rb +48 -21
  47. data/lib/generators/templates/{uploader.rb → uploader.rb.erb} +8 -11
  48. data/lib/generators/uploader_generator.rb +3 -3
  49. metadata +124 -86
  50. data/lib/carrierwave/locale/cs.yml +0 -11
  51. data/lib/carrierwave/locale/de.yml +0 -11
  52. data/lib/carrierwave/locale/el.yml +0 -11
  53. data/lib/carrierwave/locale/es.yml +0 -11
  54. data/lib/carrierwave/locale/fr.yml +0 -11
  55. data/lib/carrierwave/locale/ja.yml +0 -11
  56. data/lib/carrierwave/locale/nb.yml +0 -11
  57. data/lib/carrierwave/locale/nl.yml +0 -11
  58. data/lib/carrierwave/locale/pl.yml +0 -11
  59. data/lib/carrierwave/locale/pt-BR.yml +0 -11
  60. data/lib/carrierwave/locale/pt-PT.yml +0 -11
  61. data/lib/carrierwave/locale/ru.yml +0 -11
  62. data/lib/carrierwave/locale/sk.yml +0 -11
  63. data/lib/carrierwave/locale/tr.yml +0 -11
  64. data/lib/carrierwave/processing/mime_types.rb +0 -74
  65. data/lib/carrierwave/uploader/content_type_blacklist.rb +0 -48
  66. data/lib/carrierwave/uploader/content_type_whitelist.rb +0 -48
  67. data/lib/carrierwave/uploader/extension_blacklist.rb +0 -47
  68. data/lib/carrierwave/uploader/extension_whitelist.rb +0 -49
  69. data/lib/carrierwave/utilities/deprecation.rb +0 -18
@@ -1,26 +1,113 @@
1
- # encoding: utf-8
1
+ require "active_support/core_ext/object/deep_dup"
2
2
 
3
3
  module CarrierWave
4
4
  module Uploader
5
5
  module Versions
6
+ class Builder
7
+ def initialize(name)
8
+ @name = name
9
+ @options = {}
10
+ @blocks = []
11
+ @klass = nil
12
+ end
13
+
14
+ def configure(options, &block)
15
+ @options.merge!(options)
16
+ @blocks << block if block
17
+ @klass = nil
18
+ end
19
+
20
+ def build(superclass)
21
+ return @klass if @klass
22
+ @klass = Class.new(superclass)
23
+ superclass.const_set("VersionUploader#{@name.to_s.camelize}", @klass)
24
+
25
+ @klass.version_names += [@name]
26
+ @klass.versions = {}
27
+ @klass.processors = []
28
+ @klass.version_options = @options
29
+ @klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
30
+ # Define the enable_processing method for versions so they get the
31
+ # value from the parent class unless explicitly overwritten
32
+ def self.enable_processing(value=nil)
33
+ self.enable_processing = value if value
34
+ if defined?(@enable_processing) && !@enable_processing.nil?
35
+ @enable_processing
36
+ else
37
+ superclass.enable_processing
38
+ end
39
+ end
40
+
41
+ # Regardless of what is set in the parent uploader, do not enforce the
42
+ # move_to_cache config option on versions because it moves the original
43
+ # file to the version's target file.
44
+ #
45
+ # If you want to enforce this setting on versions, override this method
46
+ # in each version:
47
+ #
48
+ # version :thumb do
49
+ # def move_to_cache
50
+ # true
51
+ # end
52
+ # end
53
+ #
54
+ def move_to_cache
55
+ false
56
+ end
57
+
58
+ # Need to rely on the parent version's identifier, as versions don't have its own one.
59
+ def identifier
60
+ parent_version.identifier
61
+ end
62
+ RUBY
63
+ @blocks.each { |block| @klass.class_eval(&block) }
64
+ @klass
65
+ end
66
+
67
+ def deep_dup
68
+ other = dup
69
+ other.instance_variable_set(:@blocks, @blocks.dup)
70
+ other
71
+ end
72
+
73
+ def method_missing(name, *args)
74
+ super
75
+ rescue NoMethodError => e
76
+ raise e.exception <<~ERROR
77
+ #{e.message}
78
+ If you're trying to configure a version, do it inside a block like `version(:thumb) { self.#{name} #{args.map(&:inspect).join(', ')} }`.
79
+ ERROR
80
+ end
81
+
82
+ def respond_to_missing?(*)
83
+ super
84
+ end
85
+ end
86
+
6
87
  extend ActiveSupport::Concern
7
88
 
8
89
  include CarrierWave::Uploader::Callbacks
9
90
 
10
91
  included do
11
- class_attribute :versions, :version_names, :instance_reader => false, :instance_writer => false
92
+ class_attribute :versions, :version_names, :version_options, :instance_reader => false, :instance_writer => false
12
93
 
13
94
  self.versions = {}
14
95
  self.version_names = []
15
96
 
16
- attr_accessor :parent_cache_id
97
+ attr_accessor :parent_version
17
98
 
18
- after :cache, :assign_parent_cache_id
19
99
  after :cache, :cache_versions!
20
100
  after :store, :store_versions!
21
101
  after :remove, :remove_versions!
22
102
  after :retrieve_from_cache, :retrieve_versions_from_cache!
23
103
  after :retrieve_from_store, :retrieve_versions_from_store!
104
+
105
+ prepend Module.new {
106
+ def initialize(*)
107
+ super
108
+ @versions = nil
109
+ end
110
+ }
24
111
  end
25
112
 
26
113
  module ClassMethods
@@ -46,78 +133,33 @@ module CarrierWave
46
133
  # process :scale => [200, 200]
47
134
  # end
48
135
  #
136
+ # version :square, :unless => :invalid_image_type? do
137
+ # process :scale => [100, 100]
138
+ # end
139
+ #
49
140
  # end
50
141
  #
51
142
  def version(name, options = {}, &block)
52
143
  name = name.to_sym
53
- build_version(name, options) unless versions[name]
54
-
55
- versions[name][:uploader].class_eval(&block) if block
56
- versions[name]
57
- end
58
-
59
- def recursively_apply_block_to_versions(&block)
60
- versions.each do |name, version|
61
- version[:uploader].class_eval(&block)
62
- version[:uploader].recursively_apply_block_to_versions(&block)
63
- end
64
- end
65
-
66
- private
67
-
68
- def build_version(name, options)
69
- uploader = Class.new(self)
70
- const_set("Uploader#{uploader.object_id}".gsub('-', '_'), uploader)
71
- uploader.version_names += [name]
72
- uploader.versions = {}
73
- uploader.processors = []
74
-
75
- uploader.class_eval <<-RUBY, __FILE__, __LINE__ + 1
76
- # Define the enable_processing method for versions so they get the
77
- # value from the parent class unless explicitly overwritten
78
- def self.enable_processing(value=nil)
79
- self.enable_processing = value if value
80
- if !@enable_processing.nil?
81
- @enable_processing
82
- else
83
- superclass.enable_processing
84
- end
85
- end
86
-
87
- # Regardless of what is set in the parent uploader, do not enforce the
88
- # move_to_cache config option on versions because it moves the original
89
- # file to the version's target file.
90
- #
91
- # If you want to enforce this setting on versions, override this method
92
- # in each version:
93
- #
94
- # version :thumb do
95
- # def move_to_cache
96
- # true
97
- # end
98
- # end
99
- #
100
- def move_to_cache
101
- false
102
- end
103
- RUBY
144
+ versions[name] ||= Builder.new(name)
145
+ versions[name].configure(options, &block)
104
146
 
105
- class_eval <<-RUBY
147
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
106
148
  def #{name}
107
149
  versions[:#{name}]
108
150
  end
109
151
  RUBY
110
152
 
111
- # Add the current version hash to class attribute :versions
112
- current_version = {
113
- name => {
114
- :uploader => uploader,
115
- :options => options
116
- }
117
- }
118
- self.versions = versions.merge(current_version)
153
+ versions[name]
119
154
  end
120
155
 
156
+ private
157
+
158
+ def inherited(subclass)
159
+ # To prevent subclass version changes affecting superclass versions
160
+ subclass.versions = versions.deep_dup
161
+ super
162
+ end
121
163
  end # ClassMethods
122
164
 
123
165
  ##
@@ -131,7 +173,8 @@ module CarrierWave
131
173
  return @versions if @versions
132
174
  @versions = {}
133
175
  self.class.versions.each do |name, version|
134
- @versions[name] = version[:uploader].new(model, mounted_as)
176
+ @versions[name] = version.build(self.class).new(model, mounted_as)
177
+ @versions[name].parent_version = self
135
178
  end
136
179
  @versions
137
180
  end
@@ -153,24 +196,45 @@ module CarrierWave
153
196
  #
154
197
  # === Returns
155
198
  #
156
- # [Boolean] True when the version exists according to its :if condition
199
+ # [Boolean] True when the version satisfy its :if or :unless condition
157
200
  #
158
- def version_exists?(name)
201
+ def version_active?(name)
159
202
  name = name.to_sym
160
203
 
161
- return false unless self.class.versions.has_key?(name)
204
+ return false unless versions.has_key?(name)
205
+
206
+ if_condition = versions[name].class.version_options[:if]
207
+ unless_condition = versions[name].class.version_options[:unless]
162
208
 
163
- condition = self.class.versions[name][:options][:if]
164
- if(condition)
165
- if(condition.respond_to?(:call))
166
- condition.call(self, :version => name, :file => file)
209
+ if if_condition
210
+ if if_condition.respond_to?(:call)
211
+ if_condition.call(self, :version => name, :file => file)
212
+ else
213
+ send(if_condition, file)
214
+ end
215
+ elsif unless_condition
216
+ if unless_condition.respond_to?(:call)
217
+ !unless_condition.call(self, :version => name, :file => file)
167
218
  else
168
- send(condition, file)
219
+ !send(unless_condition, file)
169
220
  end
170
221
  else
171
222
  true
172
223
  end
173
224
  end
225
+ alias_method :version_exists?, :version_active?
226
+ CarrierWave.deprecator.deprecate_methods(self, version_exists?: :version_active?)
227
+
228
+ ##
229
+ # Copies the parent's cache_id when caching a version file.
230
+ # This behavior is not essential but it makes easier to understand
231
+ # that the cached files are generated by the single upload attempt.
232
+ #
233
+ def cache!(*args)
234
+ self.cache_id = parent_version.cache_id if parent_version
235
+
236
+ super
237
+ end
174
238
 
175
239
  ##
176
240
  # When given a version name as a parameter, will return the url for that version
@@ -212,35 +276,49 @@ module CarrierWave
212
276
  # Recreate versions and reprocess them. This can be used to recreate
213
277
  # versions if their parameters somehow have changed.
214
278
  #
215
- def recreate_versions!(*versions)
216
- # Some files could possibly not be stored on the local disk. This
217
- # doesn't play nicely with processing. Make sure that we're only
218
- # processing a cached file
219
- #
220
- # The call to store! will trigger the necessary callbacks to both
221
- # process this version and all sub-versions
222
- if versions.any?
223
- file = sanitized_file if !cached?
224
- store_versions!(file, versions)
225
- else
226
- cache! if !cached?
227
- store!
279
+ def recreate_versions!(*names)
280
+ # As well as specified versions, we need to reprocess versions
281
+ # that are the source of another version.
282
+
283
+ self.cache_id = CarrierWave.generate_cache_id
284
+ derived_versions.each_value do |v|
285
+ v.cache!(file) if names.empty? || !(v.descendant_version_names & names).empty?
228
286
  end
287
+ active_versions.each do |name, v|
288
+ v.store! if names.empty? || names.include?(name)
289
+ end
290
+ ensure
291
+ @cache_id = nil
229
292
  end
230
293
 
231
- private
232
- def assign_parent_cache_id(file)
233
- active_versions.each do |name, uploader|
234
- uploader.parent_cache_id = @cache_id
294
+ protected
295
+
296
+ def descendant_version_names
297
+ [version_name] + derived_versions.flat_map do |name, version|
298
+ version.descendant_version_names
235
299
  end
236
300
  end
237
301
 
238
302
  def active_versions
239
303
  versions.select do |name, uploader|
240
- version_exists?(name)
304
+ version_active?(name)
241
305
  end
242
306
  end
243
307
 
308
+ private
309
+
310
+ def derived_versions
311
+ active_versions.reject do |name, v|
312
+ v.class.version_options[:from_version]
313
+ end.merge(active_sibling_versions.select do |name, v|
314
+ v.class.version_options[:from_version] == self.class.version_names.last
315
+ end)
316
+ end
317
+
318
+ def active_sibling_versions
319
+ parent_version&.active_versions || {}
320
+ end
321
+
244
322
  def full_filename(for_file)
245
323
  [version_name, super(for_file)].compact.join('_')
246
324
  end
@@ -250,51 +328,23 @@ module CarrierWave
250
328
  end
251
329
 
252
330
  def cache_versions!(new_file)
253
- # We might have processed the new_file argument after the callbacks were
254
- # initialized, so get the actual file based off of the current state of
255
- # our file
256
- processed_parent = SanitizedFile.new :tempfile => self.file,
257
- :filename => new_file.original_filename
258
-
259
- active_versions.each do |name, v|
260
- next if v.cached?
261
-
262
- v.send(:cache_id=, cache_id)
263
- # If option :from_version is present, create cache using cached file from
264
- # version indicated
265
- if self.class.versions[name][:options] && self.class.versions[name][:options][:from_version]
266
- # Maybe the reference version has not been cached yet
267
- unless versions[self.class.versions[name][:options][:from_version]].cached?
268
- versions[self.class.versions[name][:options][:from_version]].cache!(processed_parent)
269
- end
270
- processed_version = SanitizedFile.new :tempfile => versions[self.class.versions[name][:options][:from_version]],
271
- :filename => new_file.original_filename
272
- v.cache!(processed_version)
273
- else
274
- v.cache!(processed_parent)
275
- end
276
- end
331
+ derived_versions.each_value { |v| v.cache!(new_file) }
277
332
  end
278
333
 
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
334
+ def store_versions!(new_file)
335
+ active_versions.each_value { |v| v.store!(new_file) }
286
336
  end
287
337
 
288
338
  def remove_versions!
289
- versions.each { |name, v| v.remove! }
339
+ versions.each_value { |v| v.remove! }
290
340
  end
291
341
 
292
342
  def retrieve_versions_from_cache!(cache_name)
293
- versions.each { |name, v| v.retrieve_from_cache!(cache_name) }
343
+ active_versions.each_value { |v| v.retrieve_from_cache!(cache_name) }
294
344
  end
295
345
 
296
346
  def retrieve_versions_from_store!(identifier)
297
- versions.each { |name, v| v.retrieve_from_store!(identifier) }
347
+ active_versions.each_value { |v| v.retrieve_from_store!(identifier) }
298
348
  end
299
349
 
300
350
  end # Versions
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require "carrierwave/uploader/configuration"
4
2
  require "carrierwave/uploader/callbacks"
5
3
  require "carrierwave/uploader/proxy"
@@ -9,10 +7,12 @@ require "carrierwave/uploader/cache"
9
7
  require "carrierwave/uploader/store"
10
8
  require "carrierwave/uploader/download"
11
9
  require "carrierwave/uploader/remove"
12
- require "carrierwave/uploader/extension_whitelist"
13
- require "carrierwave/uploader/extension_blacklist"
14
- require "carrierwave/uploader/content_type_whitelist"
15
- require "carrierwave/uploader/content_type_blacklist"
10
+ require "carrierwave/uploader/extension_allowlist"
11
+ require "carrierwave/uploader/extension_denylist"
12
+ require "carrierwave/uploader/content_type_allowlist"
13
+ require "carrierwave/uploader/content_type_denylist"
14
+ require "carrierwave/uploader/file_size"
15
+ require "carrierwave/uploader/dimension"
16
16
  require "carrierwave/uploader/processing"
17
17
  require "carrierwave/uploader/versions"
18
18
  require "carrierwave/uploader/default_url"
@@ -53,10 +53,12 @@ module CarrierWave
53
53
  include CarrierWave::Uploader::Store
54
54
  include CarrierWave::Uploader::Download
55
55
  include CarrierWave::Uploader::Remove
56
- include CarrierWave::Uploader::ExtensionWhitelist
57
- include CarrierWave::Uploader::ExtensionBlacklist
58
- include CarrierWave::Uploader::ContentTypeWhitelist
59
- include CarrierWave::Uploader::ContentTypeBlacklist
56
+ include CarrierWave::Uploader::ExtensionAllowlist
57
+ include CarrierWave::Uploader::ExtensionDenylist
58
+ include CarrierWave::Uploader::ContentTypeAllowlist
59
+ include CarrierWave::Uploader::ContentTypeDenylist
60
+ include CarrierWave::Uploader::FileSize
61
+ include CarrierWave::Uploader::Dimension
60
62
  include CarrierWave::Uploader::Processing
61
63
  include CarrierWave::Uploader::Versions
62
64
  include CarrierWave::Uploader::DefaultUrl
@@ -0,0 +1,47 @@
1
+ module CarrierWave
2
+ module Utilities
3
+ module FileName
4
+
5
+ ##
6
+ # Returns the part of the filename before the extension. So if a file is called 'test.jpeg'
7
+ # this would return 'test'
8
+ #
9
+ # === Returns
10
+ #
11
+ # [String] the first part of the filename
12
+ #
13
+ def basename
14
+ split_extension(filename)[0] if filename
15
+ end
16
+
17
+ ##
18
+ # Returns the file extension
19
+ #
20
+ # === Returns
21
+ #
22
+ # [String] extension of file or "" if the file has no extension
23
+ #
24
+ def extension
25
+ split_extension(filename)[1] if filename
26
+ end
27
+
28
+ private
29
+
30
+ def split_extension(filename)
31
+ # regular expressions to try for identifying extensions
32
+ extension_matchers = [
33
+ /\A(.+)\.(tar\.([glx]?z|bz2))\z/, # matches "something.tar.gz"
34
+ /\A(.+)\.([^\.]+)\z/ # matches "something.jpg"
35
+ ]
36
+
37
+ extension_matchers.each do |regexp|
38
+ if filename =~ regexp
39
+ return $1, $2
40
+ end
41
+ end
42
+
43
+ [filename, ""] # In case we weren't able to split the extension
44
+ end
45
+ end # FileName
46
+ end # Utilities
47
+ end # CarrierWave
@@ -1,23 +1,25 @@
1
- # encoding: utf-8
1
+ require 'uri'
2
2
 
3
3
  module CarrierWave
4
4
  module Utilities
5
5
  module Uri
6
+ # based on Ruby < 2.0's URI.encode
7
+ PATH_SAFE = URI::RFC2396_REGEXP::PATTERN::UNRESERVED + '\/'
8
+ PATH_UNSAFE = Regexp.new("[^#{PATH_SAFE}]", false)
9
+ NON_ASCII = /[^[:ascii:]]/.freeze
6
10
 
7
11
  private
12
+
8
13
  def encode_path(path)
9
- # based on Ruby < 2.0's URI.encode
10
- safe_string = URI::REGEXP::PATTERN::UNRESERVED + '\/'
11
- unsafe = Regexp.new("[^#{safe_string}]", false)
14
+ URI::DEFAULT_PARSER.escape(path, PATH_UNSAFE)
15
+ end
16
+
17
+ def encode_non_ascii(str)
18
+ URI::DEFAULT_PARSER.escape(str, NON_ASCII)
19
+ end
12
20
 
13
- path.to_s.gsub(unsafe) do
14
- us = $&
15
- tmp = ''
16
- us.each_byte do |uc|
17
- tmp << sprintf('%%%02X', uc)
18
- end
19
- tmp
20
- end
21
+ def decode_uri(str)
22
+ URI::DEFAULT_PARSER.unescape(str)
21
23
  end
22
24
  end # Uri
23
25
  end # Utilities
@@ -1,7 +1,5 @@
1
- # encoding: utf-8
2
-
3
1
  require 'carrierwave/utilities/uri'
4
- require 'carrierwave/utilities/deprecation'
2
+ require 'carrierwave/utilities/file_name'
5
3
 
6
4
  module CarrierWave
7
5
  module Utilities
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'active_model/validator'
4
2
  require 'active_support/concern'
5
3
 
@@ -13,9 +11,8 @@ module CarrierWave
13
11
  class ProcessingValidator < ::ActiveModel::EachValidator
14
12
 
15
13
  def validate_each(record, attribute, value)
16
- if e = record.send("#{attribute}_processing_error")
17
- message = (e.message == e.class.to_s) ? :carrierwave_processing_error : e.message
18
- record.errors.add(attribute, message)
14
+ record.__send__("#{attribute}_processing_errors").each do |e|
15
+ record.errors.add(attribute, :carrierwave_processing_error, message: (e.message != e.class.to_s) && e.message)
19
16
  end
20
17
  end
21
18
  end
@@ -23,9 +20,8 @@ module CarrierWave
23
20
  class IntegrityValidator < ::ActiveModel::EachValidator
24
21
 
25
22
  def validate_each(record, attribute, value)
26
- if e = record.send("#{attribute}_integrity_error")
27
- message = (e.message == e.class.to_s) ? :carrierwave_integrity_error : e.message
28
- record.errors.add(attribute, message)
23
+ record.__send__("#{attribute}_integrity_errors").each do |e|
24
+ record.errors.add(attribute, :carrierwave_integrity_error, message: (e.message != e.class.to_s) && e.message)
29
25
  end
30
26
  end
31
27
  end
@@ -33,9 +29,8 @@ module CarrierWave
33
29
  class DownloadValidator < ::ActiveModel::EachValidator
34
30
 
35
31
  def validate_each(record, attribute, value)
36
- if e = record.send("#{attribute}_download_error")
37
- message = (e.message == e.class.to_s) ? :carrierwave_download_error : e.message
38
- record.errors.add(attribute, message)
32
+ record.__send__("#{attribute}_download_errors").each do |e|
33
+ record.errors.add(attribute, :carrierwave_download_error, message: (e.message != e.class.to_s) && e.message)
39
34
  end
40
35
  end
41
36
  end
@@ -60,6 +55,7 @@ module CarrierWave
60
55
  def validates_processing_of(*attr_names)
61
56
  validates_with ProcessingValidator, _merge_attributes(attr_names)
62
57
  end
58
+
63
59
  #
64
60
  ##
65
61
  # Makes the record invalid if the remote file couldn't be downloaded
@@ -1,3 +1,3 @@
1
1
  module CarrierWave
2
- VERSION = "0.11.2"
2
+ VERSION = "3.1.2".freeze
3
3
  end