carrierwave 0.9.0 → 2.1.1

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 (51) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +362 -116
  3. data/lib/carrierwave/compatibility/paperclip.rb +29 -21
  4. data/lib/carrierwave/downloader/base.rb +83 -0
  5. data/lib/carrierwave/downloader/remote_file.rb +65 -0
  6. data/lib/carrierwave/error.rb +1 -0
  7. data/lib/carrierwave/locale/en.yml +7 -4
  8. data/lib/carrierwave/mount.rb +238 -186
  9. data/lib/carrierwave/mounter.rb +188 -0
  10. data/lib/carrierwave/orm/activerecord.rb +60 -24
  11. data/lib/carrierwave/processing/mini_magick.rb +139 -78
  12. data/lib/carrierwave/processing/rmagick.rb +68 -23
  13. data/lib/carrierwave/processing.rb +0 -1
  14. data/lib/carrierwave/sanitized_file.rb +67 -27
  15. data/lib/carrierwave/storage/abstract.rb +15 -2
  16. data/lib/carrierwave/storage/file.rb +69 -2
  17. data/lib/carrierwave/storage/fog.rb +180 -41
  18. data/lib/carrierwave/storage.rb +1 -7
  19. data/lib/carrierwave/test/matchers.rb +77 -12
  20. data/lib/carrierwave/uploader/cache.rb +74 -38
  21. data/lib/carrierwave/uploader/callbacks.rb +0 -2
  22. data/lib/carrierwave/uploader/configuration.rb +72 -6
  23. data/lib/carrierwave/uploader/content_type_blacklist.rb +48 -0
  24. data/lib/carrierwave/uploader/content_type_whitelist.rb +48 -0
  25. data/lib/carrierwave/uploader/default_url.rb +3 -5
  26. data/lib/carrierwave/uploader/download.rb +5 -69
  27. data/lib/carrierwave/uploader/extension_blacklist.rb +14 -10
  28. data/lib/carrierwave/uploader/extension_whitelist.rb +13 -10
  29. data/lib/carrierwave/uploader/file_size.rb +43 -0
  30. data/lib/carrierwave/uploader/mountable.rb +13 -8
  31. data/lib/carrierwave/uploader/processing.rb +15 -17
  32. data/lib/carrierwave/uploader/proxy.rb +16 -7
  33. data/lib/carrierwave/uploader/remove.rb +0 -2
  34. data/lib/carrierwave/uploader/serialization.rb +3 -5
  35. data/lib/carrierwave/uploader/store.rb +17 -24
  36. data/lib/carrierwave/uploader/url.rb +3 -5
  37. data/lib/carrierwave/uploader/versions.rb +117 -86
  38. data/lib/carrierwave/uploader.rb +6 -2
  39. data/lib/carrierwave/utilities/uri.rb +5 -6
  40. data/lib/carrierwave/utilities.rb +1 -3
  41. data/lib/carrierwave/validations/active_model.rb +3 -7
  42. data/lib/carrierwave/version.rb +1 -1
  43. data/lib/carrierwave.rb +36 -3
  44. data/lib/generators/templates/uploader.rb +4 -8
  45. data/lib/generators/uploader_generator.rb +1 -1
  46. metadata +195 -94
  47. data/lib/carrierwave/locale/cs.yml +0 -11
  48. data/lib/carrierwave/locale/de.yml +0 -11
  49. data/lib/carrierwave/locale/nl.yml +0 -11
  50. data/lib/carrierwave/locale/sk.yml +0 -11
  51. data/lib/carrierwave/processing/mime_types.rb +0 -73
@@ -0,0 +1,188 @@
1
+ module CarrierWave
2
+
3
+ # this is an internal class, used by CarrierWave::Mount so that
4
+ # we don't pollute the model with a lot of methods.
5
+ class Mounter #:nodoc:
6
+ attr_reader :column, :record, :remote_urls, :integrity_errors,
7
+ :processing_errors, :download_errors
8
+ attr_accessor :remove, :remote_request_headers
9
+
10
+ def initialize(record, column, options={})
11
+ @record = record
12
+ @column = column
13
+ @options = record.class.uploader_options[column]
14
+ @download_errors = []
15
+ @processing_errors = []
16
+ @integrity_errors = []
17
+ end
18
+
19
+ def uploader_class
20
+ record.class.uploaders[column]
21
+ end
22
+
23
+ def blank_uploader
24
+ uploader_class.new(record, column)
25
+ end
26
+
27
+ def identifiers
28
+ uploaders.map(&:identifier)
29
+ end
30
+
31
+ def read_identifiers
32
+ [record.read_uploader(serialization_column)].flatten.reject(&:blank?)
33
+ end
34
+
35
+ def uploaders
36
+ @uploaders ||= read_identifiers.map do |identifier|
37
+ uploader = blank_uploader
38
+ uploader.retrieve_from_store!(identifier) if identifier.present?
39
+ uploader
40
+ end
41
+ end
42
+
43
+ def cache(new_files)
44
+ return if !new_files.is_a?(Array) && new_files.blank?
45
+ old_uploaders = uploaders
46
+ @uploaders = new_files.map do |new_file|
47
+ handle_error do
48
+ if new_file.is_a?(String)
49
+ if (uploader = old_uploaders.detect { |uploader| uploader.identifier == new_file })
50
+ uploader.staged = true
51
+ uploader
52
+ else
53
+ begin
54
+ uploader = blank_uploader
55
+ uploader.retrieve_from_cache!(new_file)
56
+ uploader
57
+ rescue CarrierWave::InvalidParameter
58
+ nil
59
+ end
60
+ end
61
+ else
62
+ uploader = blank_uploader
63
+ uploader.cache!(new_file)
64
+ uploader
65
+ end
66
+ end
67
+ end.compact
68
+ end
69
+
70
+ def cache_names
71
+ uploaders.map(&:cache_name).compact
72
+ end
73
+
74
+ def cache_names=(cache_names)
75
+ cache_names = cache_names.reject(&:blank?)
76
+ return if cache_names.blank?
77
+ clear_unstaged
78
+ cache_names.each do |cache_name|
79
+ begin
80
+ uploader = blank_uploader
81
+ uploader.retrieve_from_cache!(cache_name)
82
+ @uploaders << uploader
83
+ rescue CarrierWave::InvalidParameter
84
+ # ignore
85
+ end
86
+ end
87
+ end
88
+
89
+ def remote_urls=(urls)
90
+ return if urls.blank? || urls.all?(&:blank?)
91
+
92
+ @remote_urls = urls
93
+
94
+ clear_unstaged
95
+ urls.zip(remote_request_headers || []).each do |url, header|
96
+ handle_error do
97
+ uploader = blank_uploader
98
+ uploader.download!(url, header || {})
99
+ @uploaders << uploader
100
+ end
101
+ end
102
+ end
103
+
104
+ def store!
105
+ uploaders.reject(&:blank?).each(&:store!)
106
+ end
107
+
108
+ def urls(*args)
109
+ uploaders.map { |u| u.url(*args) }
110
+ end
111
+
112
+ def blank?
113
+ uploaders.none?(&:present?)
114
+ end
115
+
116
+ def remove?
117
+ remove.present? && (remove == true || remove !~ /\A0|false$\z/)
118
+ end
119
+
120
+ def remove!
121
+ uploaders.reject(&:blank?).each(&:remove!)
122
+ @uploaders = []
123
+ end
124
+
125
+ def clear!
126
+ @uploaders = []
127
+ end
128
+
129
+ def serialization_column
130
+ option(:mount_on) || column
131
+ end
132
+
133
+ def remove_previous(before=nil, after=nil)
134
+ after ||= []
135
+ return unless before
136
+
137
+ # both 'before' and 'after' can be string when 'mount_on' option is set
138
+ before = before.reject(&:blank?).map do |value|
139
+ if value.is_a?(String)
140
+ uploader = blank_uploader
141
+ uploader.retrieve_from_store!(value)
142
+ uploader
143
+ else
144
+ value
145
+ end
146
+ end
147
+ after_paths = after.reject(&:blank?).map do |value|
148
+ if value.is_a?(String)
149
+ uploader = blank_uploader
150
+ uploader.retrieve_from_store!(value)
151
+ uploader
152
+ else
153
+ value
154
+ end.path
155
+ end
156
+ before.each do |uploader|
157
+ uploader.remove! if uploader.remove_previously_stored_files_after_update && !after_paths.include?(uploader.path)
158
+ end
159
+ end
160
+
161
+ attr_accessor :uploader_options
162
+
163
+ private
164
+
165
+ def option(name)
166
+ self.uploader_options ||= {}
167
+ self.uploader_options[name] ||= record.class.uploader_option(column, name)
168
+ end
169
+
170
+ def clear_unstaged
171
+ @uploaders ||= []
172
+ @uploaders.keep_if(&:staged)
173
+ end
174
+
175
+ def handle_error
176
+ yield
177
+ rescue CarrierWave::DownloadError => e
178
+ @download_errors << e
179
+ raise e unless option(:ignore_download_errors)
180
+ rescue CarrierWave::ProcessingError => e
181
+ @processing_errors << e
182
+ raise e unless option(:ignore_processing_errors)
183
+ rescue CarrierWave::IntegrityError => e
184
+ @integrity_errors << e
185
+ raise e unless option(:ignore_integrity_errors)
186
+ end
187
+ end # Mounter
188
+ end # CarrierWave
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'active_record'
4
2
  require 'carrierwave/validations/active_model'
5
3
 
@@ -14,6 +12,39 @@ module CarrierWave
14
12
  def mount_uploader(column, uploader=nil, options={}, &block)
15
13
  super
16
14
 
15
+ mod = Module.new
16
+ prepend mod
17
+ mod.class_eval <<-RUBY, __FILE__, __LINE__+1
18
+ def remote_#{column}_url=(url)
19
+ column = _mounter(:#{column}).serialization_column
20
+ __send__(:"\#{column}_will_change!")
21
+ super
22
+ end
23
+ RUBY
24
+ end
25
+
26
+ ##
27
+ # See +CarrierWave::Mount#mount_uploaders+ for documentation
28
+ #
29
+ def mount_uploaders(column, uploader=nil, options={}, &block)
30
+ super
31
+
32
+ mod = Module.new
33
+ prepend mod
34
+ mod.class_eval <<-RUBY, __FILE__, __LINE__+1
35
+ def remote_#{column}_urls=(url)
36
+ column = _mounter(:#{column}).serialization_column
37
+ __send__(:"\#{column}_will_change!")
38
+ super
39
+ end
40
+ RUBY
41
+ end
42
+
43
+ private
44
+
45
+ def mount_base(column, uploader=nil, options={}, &block)
46
+ super
47
+
17
48
  alias_method :read_uploader, :read_attribute
18
49
  alias_method :write_uploader, :write_attribute
19
50
  public :read_uploader
@@ -25,46 +56,51 @@ module CarrierWave
25
56
  validates_processing_of column if uploader_option(column.to_sym, :validate_processing)
26
57
  validates_download_of column if uploader_option(column.to_sym, :validate_download)
27
58
 
28
- after_save :"store_#{column}!"
29
59
  before_save :"write_#{column}_identifier"
60
+ after_save :"store_previous_changes_for_#{column}"
30
61
  after_commit :"remove_#{column}!", :on => :destroy
31
- before_update :"store_previous_model_for_#{column}"
32
- after_save :"remove_previously_stored_#{column}"
62
+ after_commit :"mark_remove_#{column}_false", :on => :update
63
+ after_commit :"remove_previously_stored_#{column}", :on => :update
64
+ after_commit :"store_#{column}!", :on => [:create, :update]
33
65
 
34
- class_eval <<-RUBY, __FILE__, __LINE__+1
66
+ mod = Module.new
67
+ prepend mod
68
+ mod.class_eval <<-RUBY, __FILE__, __LINE__+1
35
69
  def #{column}=(new_file)
36
70
  column = _mounter(:#{column}).serialization_column
37
- send(:"\#{column}_will_change!")
71
+ if !(new_file.blank? && __send__(:#{column}).blank?)
72
+ __send__(:"\#{column}_will_change!")
73
+ end
74
+
38
75
  super
39
76
  end
40
77
 
41
- def remote_#{column}_url=(url)
78
+ def remove_#{column}=(value)
42
79
  column = _mounter(:#{column}).serialization_column
43
- send(:"\#{column}_will_change!")
44
- super
80
+ result = super
81
+ __send__(:"\#{column}_will_change!") if _mounter(:#{column}).remove?
82
+ result
45
83
  end
46
84
 
47
85
  def remove_#{column}!
86
+ self.remove_#{column} = true
87
+ write_#{column}_identifier
88
+ self.remove_#{column} = false
48
89
  super
49
- _mounter(:#{column}).remove = true
50
- _mounter(:#{column}).write_identifier
51
90
  end
52
91
 
53
- def serializable_hash(options=nil)
54
- hash = {}
55
-
56
- except = options && options[:except] && Array.wrap(options[:except]).map(&:to_s)
57
- only = options && options[:only] && Array.wrap(options[:only]).map(&:to_s)
92
+ # Reset cached mounter on record reload
93
+ def reload(*)
94
+ @_mounters = nil
95
+ super
96
+ end
58
97
 
59
- self.class.uploaders.each do |column, uploader|
60
- if (!only && !except) || (only && only.include?(column.to_s)) || (!only && except && !except.include?(column.to_s))
61
- hash[column.to_s] = _mounter(column).uploader.serializable_hash
62
- end
63
- end
64
- super(options).merge(hash)
98
+ # Reset cached mounter on record dup
99
+ def initialize_dup(other)
100
+ @_mounters = nil
101
+ super
65
102
  end
66
103
  RUBY
67
-
68
104
  end
69
105
 
70
106
  end # ActiveRecord
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module CarrierWave
4
2
 
5
3
  ##
@@ -23,9 +21,11 @@ module CarrierWave
23
21
  # process :resize_to_fit => [200, 200]
24
22
  # end
25
23
  #
26
- # Or create your own helpers with the powerful manipulate! method. Check
27
- # out the ImageMagick docs at http://www.imagemagick.org/script/command-line-options.php for more
28
- # info
24
+ # Or create your own helpers with the powerful minimagick! method, which
25
+ # yields an ImageProcessing::Builder object. Check out the ImageProcessing
26
+ # docs at http://github.com/janko-m/image_processing and the list of all
27
+ # available ImageMagick options at
28
+ # http://www.imagemagick.org/script/command-line-options.php for more info.
29
29
  #
30
30
  # class MyUploader < CarrierWave::Uploader::Base
31
31
  # include CarrierWave::MiniMagick
@@ -33,35 +33,30 @@ module CarrierWave
33
33
  # process :radial_blur => 10
34
34
  #
35
35
  # def radial_blur(amount)
36
- # manipulate! do |img|
37
- # img.radial_blur(amount)
38
- # img = yield(img) if block_given?
39
- # img
36
+ # minimagick! do |builder|
37
+ # builder.radial_blur(amount)
38
+ # builder = yield(builder) if block_given?
39
+ # builder
40
40
  # end
41
41
  # end
42
+ # end
42
43
  #
43
44
  # === Note
44
45
  #
45
- # MiniMagick is a mini replacement for RMagick that uses the command line
46
- # tool "mogrify" for image manipulation.
46
+ # The ImageProcessing gem uses MiniMagick, a mini replacement for RMagick
47
+ # that uses ImageMagick command-line tools, to build a "convert" command that
48
+ # performs the processing.
47
49
  #
48
50
  # You can find more information here:
49
51
  #
50
- # http://mini_magick.rubyforge.org/
51
- # and
52
- # https://github.com/minimagic/minimagick/
52
+ # https://github.com/minimagick/minimagick/
53
53
  #
54
54
  #
55
55
  module MiniMagick
56
56
  extend ActiveSupport::Concern
57
57
 
58
58
  included do
59
- begin
60
- require "mini_magick"
61
- rescue LoadError => e
62
- e.message << " (You may need to install the mini_magick gem)"
63
- raise e
64
- end
59
+ require "image_processing/mini_magick"
65
60
  end
66
61
 
67
62
  module ClassMethods
@@ -81,7 +76,7 @@ module CarrierWave
81
76
  process :resize_to_fill => [width, height, gravity]
82
77
  end
83
78
 
84
- def resize_and_pad(width, height, background=:transparent, gravity=::Magick::CenterGravity)
79
+ def resize_and_pad(width, height, background=:transparent, gravity='Center')
85
80
  process :resize_and_pad => [width, height, background, gravity]
86
81
  end
87
82
  end
@@ -103,12 +98,11 @@ module CarrierWave
103
98
  #
104
99
  # image.convert(:png)
105
100
  #
106
- def convert(format)
107
- @format = format
108
- manipulate! do |img|
109
- img.format(format.to_s.downcase)
110
- img = yield(img) if block_given?
111
- img
101
+ def convert(format, page=nil, &block)
102
+ minimagick!(block) do |builder|
103
+ builder = builder.convert(format)
104
+ builder = builder.loader(page: page) if page
105
+ builder
112
106
  end
113
107
  end
114
108
 
@@ -122,16 +116,18 @@ module CarrierWave
122
116
  #
123
117
  # [width (Integer)] the width to scale the image to
124
118
  # [height (Integer)] the height to scale the image to
119
+ # [combine_options (Hash)] additional ImageMagick options to apply before resizing
125
120
  #
126
121
  # === Yields
127
122
  #
128
123
  # [MiniMagick::Image] additional manipulations to perform
129
124
  #
130
- def resize_to_limit(width, height)
131
- manipulate! do |img|
132
- img.resize "#{width}x#{height}>"
133
- img = yield(img) if block_given?
134
- img
125
+ def resize_to_limit(width, height, combine_options: {}, &block)
126
+ width, height = resolve_dimensions(width, height)
127
+
128
+ minimagick!(block) do |builder|
129
+ builder.resize_to_limit(width, height)
130
+ .apply(combine_options)
135
131
  end
136
132
  end
137
133
 
@@ -144,16 +140,18 @@ module CarrierWave
144
140
  #
145
141
  # [width (Integer)] the width to scale the image to
146
142
  # [height (Integer)] the height to scale the image to
143
+ # [combine_options (Hash)] additional ImageMagick options to apply before resizing
147
144
  #
148
145
  # === Yields
149
146
  #
150
147
  # [MiniMagick::Image] additional manipulations to perform
151
148
  #
152
- def resize_to_fit(width, height)
153
- manipulate! do |img|
154
- img.resize "#{width}x#{height}"
155
- img = yield(img) if block_given?
156
- img
149
+ def resize_to_fit(width, height, combine_options: {}, &block)
150
+ width, height = resolve_dimensions(width, height)
151
+
152
+ minimagick!(block) do |builder|
153
+ builder.resize_to_fit(width, height)
154
+ .apply(combine_options)
157
155
  end
158
156
  end
159
157
 
@@ -167,34 +165,18 @@ module CarrierWave
167
165
  # [width (Integer)] the width to scale the image to
168
166
  # [height (Integer)] the height to scale the image to
169
167
  # [gravity (String)] the current gravity suggestion (default: 'Center'; options: 'NorthWest', 'North', 'NorthEast', 'West', 'Center', 'East', 'SouthWest', 'South', 'SouthEast')
168
+ # [combine_options (Hash)] additional ImageMagick options to apply before resizing
170
169
  #
171
170
  # === Yields
172
171
  #
173
172
  # [MiniMagick::Image] additional manipulations to perform
174
173
  #
175
- def resize_to_fill(width, height, gravity = 'Center')
176
- manipulate! do |img|
177
- cols, rows = img[:dimensions]
178
- img.combine_options do |cmd|
179
- if width != cols || height != rows
180
- scale_x = width/cols.to_f
181
- scale_y = height/rows.to_f
182
- if scale_x >= scale_y
183
- cols = (scale_x * (cols + 0.5)).round
184
- rows = (scale_x * (rows + 0.5)).round
185
- cmd.resize "#{cols}"
186
- else
187
- cols = (scale_y * (cols + 0.5)).round
188
- rows = (scale_y * (rows + 0.5)).round
189
- cmd.resize "x#{rows}"
190
- end
191
- end
192
- cmd.gravity gravity
193
- cmd.background "rgba(255,255,255,0.0)"
194
- cmd.extent "#{width}x#{height}" if cols != width || rows != height
195
- end
196
- img = yield(img) if block_given?
197
- img
174
+ def resize_to_fill(width, height, gravity = 'Center', combine_options: {}, &block)
175
+ width, height = resolve_dimensions(width, height)
176
+
177
+ minimagick!(block) do |builder|
178
+ builder.resize_to_fill(width, height, gravity: gravity)
179
+ .apply(combine_options)
198
180
  end
199
181
  end
200
182
 
@@ -213,33 +195,51 @@ module CarrierWave
213
195
  # [height (Integer)] the height to scale the image to
214
196
  # [background (String, :transparent)] the color of the background as a hexcode, like "#ff45de"
215
197
  # [gravity (String)] how to position the image
198
+ # [combine_options (Hash)] additional ImageMagick options to apply before resizing
216
199
  #
217
200
  # === Yields
218
201
  #
219
202
  # [MiniMagick::Image] additional manipulations to perform
220
203
  #
221
- def resize_and_pad(width, height, background=:transparent, gravity='Center')
222
- manipulate! do |img|
223
- img.combine_options do |cmd|
224
- cmd.thumbnail "#{width}x#{height}>"
225
- if background == :transparent
226
- cmd.background "rgba(255, 255, 255, 0.0)"
227
- else
228
- cmd.background background
229
- end
230
- cmd.gravity gravity
231
- cmd.extent "#{width}x#{height}"
232
- end
233
- img = yield(img) if block_given?
234
- img
204
+ def resize_and_pad(width, height, background=:transparent, gravity='Center', combine_options: {}, &block)
205
+ width, height = resolve_dimensions(width, height)
206
+
207
+ minimagick!(block) do |builder|
208
+ builder.resize_and_pad(width, height, background: background, gravity: gravity)
209
+ .apply(combine_options)
235
210
  end
236
211
  end
237
212
 
213
+ ##
214
+ # Returns the width of the image in pixels.
215
+ #
216
+ # === Returns
217
+ #
218
+ # [Integer] the image's width in pixels
219
+ #
220
+ def width
221
+ mini_magick_image[:width]
222
+ end
223
+
224
+ ##
225
+ # Returns the height of the image in pixels.
226
+ #
227
+ # === Returns
228
+ #
229
+ # [Integer] the image's height in pixels
230
+ #
231
+ def height
232
+ mini_magick_image[:height]
233
+ end
234
+
238
235
  ##
239
236
  # Manipulate the image with MiniMagick. This method will load up an image
240
237
  # and then pass each of its frames to the supplied block. It will then
241
238
  # save the image to disk.
242
239
  #
240
+ # NOTE: This method exists mostly for backwards compatibility, you should
241
+ # probably use #minimagick!.
242
+ #
243
243
  # === Gotcha
244
244
  #
245
245
  # This method assumes that the object responds to +current_path+.
@@ -258,13 +258,74 @@ module CarrierWave
258
258
  def manipulate!
259
259
  cache_stored_file! if !cached?
260
260
  image = ::MiniMagick::Image.open(current_path)
261
- image.format(@format.to_s.downcase) if @format
261
+
262
262
  image = yield(image)
263
- image.write(current_path)
264
- ::MiniMagick::Image.open(current_path)
263
+ FileUtils.mv image.path, current_path
264
+
265
+ image.run_command("identify", current_path)
266
+ rescue ::MiniMagick::Error, ::MiniMagick::Invalid => e
267
+ message = I18n.translate(:"errors.messages.mini_magick_processing_error", :e => e)
268
+ raise CarrierWave::ProcessingError, message
269
+ ensure
270
+ image.destroy! if image
271
+ end
272
+
273
+ # Process the image with MiniMagick, using the ImageProcessing gem. This
274
+ # method will build a "convert" ImageMagick command and execute it on the
275
+ # current image.
276
+ #
277
+ # === Gotcha
278
+ #
279
+ # This method assumes that the object responds to +current_path+.
280
+ # Any class that this module is mixed into must have a +current_path+ method.
281
+ # CarrierWave::Uploader does, so you won't need to worry about this in
282
+ # most cases.
283
+ #
284
+ # === Yields
285
+ #
286
+ # [ImageProcessing::Builder] use it to define processing to be performed
287
+ #
288
+ # === Raises
289
+ #
290
+ # [CarrierWave::ProcessingError] if processing failed.
291
+ def minimagick!(block = nil)
292
+ builder = ImageProcessing::MiniMagick.source(current_path)
293
+ builder = yield(builder)
294
+
295
+ result = builder.call
296
+ result.close
297
+
298
+ # backwards compatibility (we want to eventually move away from MiniMagick::Image)
299
+ if block
300
+ image = ::MiniMagick::Image.new(result.path, result)
301
+ image = block.call(image)
302
+ result = image.instance_variable_get(:@tempfile)
303
+ end
304
+
305
+ FileUtils.mv result.path, current_path
306
+
307
+ if File.extname(result.path) != File.extname(current_path)
308
+ move_to = current_path.chomp(File.extname(current_path)) + File.extname(result.path)
309
+ file.content_type = ::MiniMime.lookup_by_filename(move_to).content_type
310
+ file.move_to(move_to, permissions, directory_permissions)
311
+ end
265
312
  rescue ::MiniMagick::Error, ::MiniMagick::Invalid => e
266
- raise CarrierWave::ProcessingError, I18n.translate(:"errors.messages.mini_magick_processing_error", :e => e, :default => I18n.translate(:"errors.messages.mini_magick_processing_error", :e => e, :locale => :en))
313
+ message = I18n.translate(:"errors.messages.mini_magick_processing_error", :e => e)
314
+ raise CarrierWave::ProcessingError, message
267
315
  end
268
316
 
317
+ private
318
+
319
+ def resolve_dimensions(*dimensions)
320
+ dimensions.map do |value|
321
+ next value unless value.instance_of?(Proc)
322
+ value.arity >= 1 ? value.call(self) : value.call
323
+ end
324
+ end
325
+
326
+ def mini_magick_image
327
+ ::MiniMagick::Image.read(read)
328
+ end
329
+
269
330
  end # MiniMagick
270
331
  end # CarrierWave