carrierwave 0.11.2 → 2.1.0

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 (60) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +294 -124
  3. data/lib/carrierwave.rb +34 -8
  4. data/lib/carrierwave/compatibility/paperclip.rb +0 -2
  5. data/lib/carrierwave/downloader/base.rb +50 -0
  6. data/lib/carrierwave/downloader/remote_file.rb +44 -0
  7. data/lib/carrierwave/error.rb +1 -0
  8. data/lib/carrierwave/locale/en.yml +7 -4
  9. data/lib/carrierwave/mount.rb +229 -180
  10. data/lib/carrierwave/mounter.rb +188 -0
  11. data/lib/carrierwave/orm/activerecord.rb +59 -24
  12. data/lib/carrierwave/processing.rb +0 -1
  13. data/lib/carrierwave/processing/mini_magick.rb +137 -83
  14. data/lib/carrierwave/processing/rmagick.rb +54 -5
  15. data/lib/carrierwave/sanitized_file.rb +50 -30
  16. data/lib/carrierwave/storage.rb +1 -9
  17. data/lib/carrierwave/storage/abstract.rb +15 -2
  18. data/lib/carrierwave/storage/file.rb +69 -2
  19. data/lib/carrierwave/storage/fog.rb +177 -37
  20. data/lib/carrierwave/test/matchers.rb +77 -12
  21. data/lib/carrierwave/uploader.rb +2 -2
  22. data/lib/carrierwave/uploader/cache.rb +60 -38
  23. data/lib/carrierwave/uploader/callbacks.rb +0 -2
  24. data/lib/carrierwave/uploader/configuration.rb +71 -13
  25. data/lib/carrierwave/uploader/content_type_whitelist.rb +1 -1
  26. data/lib/carrierwave/uploader/default_url.rb +3 -5
  27. data/lib/carrierwave/uploader/download.rb +4 -74
  28. data/lib/carrierwave/uploader/extension_blacklist.rb +14 -10
  29. data/lib/carrierwave/uploader/extension_whitelist.rb +13 -10
  30. data/lib/carrierwave/uploader/file_size.rb +43 -0
  31. data/lib/carrierwave/uploader/mountable.rb +13 -8
  32. data/lib/carrierwave/uploader/processing.rb +10 -10
  33. data/lib/carrierwave/uploader/proxy.rb +6 -8
  34. data/lib/carrierwave/uploader/remove.rb +0 -2
  35. data/lib/carrierwave/uploader/serialization.rb +2 -4
  36. data/lib/carrierwave/uploader/store.rb +17 -24
  37. data/lib/carrierwave/uploader/url.rb +3 -5
  38. data/lib/carrierwave/uploader/versions.rb +123 -93
  39. data/lib/carrierwave/utilities.rb +0 -3
  40. data/lib/carrierwave/utilities/uri.rb +5 -6
  41. data/lib/carrierwave/validations/active_model.rb +3 -5
  42. data/lib/carrierwave/version.rb +1 -1
  43. data/lib/generators/templates/uploader.rb +4 -8
  44. metadata +80 -65
  45. data/lib/carrierwave/locale/cs.yml +0 -11
  46. data/lib/carrierwave/locale/de.yml +0 -11
  47. data/lib/carrierwave/locale/el.yml +0 -11
  48. data/lib/carrierwave/locale/es.yml +0 -11
  49. data/lib/carrierwave/locale/fr.yml +0 -11
  50. data/lib/carrierwave/locale/ja.yml +0 -11
  51. data/lib/carrierwave/locale/nb.yml +0 -11
  52. data/lib/carrierwave/locale/nl.yml +0 -11
  53. data/lib/carrierwave/locale/pl.yml +0 -11
  54. data/lib/carrierwave/locale/pt-BR.yml +0 -11
  55. data/lib/carrierwave/locale/pt-PT.yml +0 -11
  56. data/lib/carrierwave/locale/ru.yml +0 -11
  57. data/lib/carrierwave/locale/sk.yml +0 -11
  58. data/lib/carrierwave/locale/tr.yml +0 -11
  59. data/lib/carrierwave/processing/mime_types.rb +0 -74
  60. data/lib/carrierwave/utilities/deprecation.rb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8c1689fd908e56b671c45e5cb1eebe3ec938a4df
4
- data.tar.gz: 89668d77484c786139f513dc1b82c82879da4e11
2
+ SHA256:
3
+ metadata.gz: 00606ed46f8982064ac5a4c9a4c84ec913d2844cb27ef3701ab8eef9f3379810
4
+ data.tar.gz: 66d28e5ffdb2c7d8c87f408847fa0a845e19fbe85559b01103e211d43e384e2d
5
5
  SHA512:
6
- metadata.gz: a03780cb6e64ad439c1f12378be2f4392617dbbe9f83329eccc6bc05064385e0e95a4b4609e32d922a0ce6d5543bbc795eb4abb8e429d5e366040fdfa3c82bfd
7
- data.tar.gz: ee26ab882ed995b677c38e6064843101633a07166cf2dda0e522bf1b13eb7a30a373312d67b786bc86365fd3ef4cb974f8f57a564dafbf9eafaf1c60b7e3e3e8
6
+ metadata.gz: f1a4033c04815846930764b92e49a1d9c15c3d54acbe8ab2caafc605d7b04dabf9409f97fa66efa9f533ac341ed6062b821997114408d7b963b022fbc1602bdf
7
+ data.tar.gz: 281fc8198bef5940ca8638a04888e44c2216688fee3e805da985f00dac7588830e8b50dd570484c5b0bf8a121e526c3aaa32981fcff4fd99b71a9b5bc2a72754
data/README.md CHANGED
@@ -3,8 +3,10 @@
3
3
  This gem provides a simple and extremely flexible way to upload files from Ruby applications.
4
4
  It works well with Rack based web applications, such as Ruby on Rails.
5
5
 
6
- [![Build Status](https://travis-ci.org/carrierwaveuploader/carrierwave.png?branch=master)](http://travis-ci.org/carrierwaveuploader/carrierwave)
7
- [![Code Climate](https://codeclimate.com/github/carrierwaveuploader/carrierwave.png)](https://codeclimate.com/github/carrierwaveuploader/carrierwave)
6
+ [![Build Status](https://travis-ci.org/carrierwaveuploader/carrierwave.svg?branch=master)](http://travis-ci.org/carrierwaveuploader/carrierwave)
7
+ [![Code Climate](https://codeclimate.com/github/carrierwaveuploader/carrierwave.svg)](https://codeclimate.com/github/carrierwaveuploader/carrierwave)
8
+ [![SemVer](https://api.dependabot.com/badges/compatibility_score?dependency-name=carrierwave&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score.html?dependency-name=carrierwave&package-manager=bundler&version-scheme=semver)
9
+
8
10
 
9
11
  ## Information
10
12
 
@@ -14,25 +16,27 @@ It works well with Rack based web applications, such as Ruby on Rails.
14
16
 
15
17
  ## Getting Help
16
18
 
17
- * Please ask the [Google Group](http://groups.google.com/group/carrierwave) for help if you have any questions.
19
+ * Please ask the community on [Stack Overflow](https://stackoverflow.com/questions/tagged/carrierwave) for help if you have any questions. Please do not post usage questions on the issue tracker.
18
20
  * Please report bugs on the [issue tracker](http://github.com/carrierwaveuploader/carrierwave/issues) but read the "getting help" section in the wiki first.
19
21
 
20
22
  ## Installation
21
23
 
22
- Install the latest stable release:
24
+ Install the latest release:
23
25
 
24
- [sudo] gem install carrierwave
26
+ ```
27
+ $ gem install carrierwave
28
+ ```
25
29
 
26
30
  In Rails, add it to your Gemfile:
27
31
 
28
32
  ```ruby
29
- gem 'carrierwave'
33
+ gem 'carrierwave', '~> 2.0'
30
34
  ```
31
35
 
32
36
  Finally, restart the server to apply the changes.
33
37
 
34
- Note that CarrierWave is not compatible with Rails 2 as of version 0.5. If you want to use
35
- Rails 2, please use the 0.4-stable branch on GitHub.
38
+ As of version 2.0, CarrierWave requires Rails 5.0 or higher and Ruby 2.2
39
+ or higher. If you're on Rails 4, you should use 1.x.
36
40
 
37
41
  ## Getting Started
38
42
 
@@ -85,7 +89,7 @@ a migration:
85
89
 
86
90
 
87
91
  rails g migration add_avatar_to_users avatar:string
88
- rake db:migrate
92
+ rails db:migrate
89
93
 
90
94
  Open your model file and mount the uploader:
91
95
 
@@ -100,24 +104,103 @@ automatically be stored when the record is saved.
100
104
 
101
105
  ```ruby
102
106
  u = User.new
103
- u.avatar = params[:file]
104
- u.avatar = File.open('somewhere')
107
+ u.avatar = params[:file] # Assign a file like this, or
108
+
109
+ # like this
110
+ File.open('somewhere') do |f|
111
+ u.avatar = f
112
+ end
113
+
105
114
  u.save!
106
115
  u.avatar.url # => '/url/to/file.png'
107
116
  u.avatar.current_path # => 'path/to/file.png'
108
- u.avatar.identifier # => 'file.png'
117
+ u.avatar_identifier # => 'file.png'
109
118
  ```
110
119
 
120
+ **Note**: `u.avatar` will never return nil, even if there is no photo associated to it.
121
+ To check if a photo was saved to the model, use `u.avatar.file.nil?` instead.
122
+
111
123
  ### DataMapper, Mongoid, Sequel
112
124
 
113
125
  Other ORM support has been extracted into separate gems:
114
126
 
115
127
  * [carrierwave-datamapper](https://github.com/carrierwaveuploader/carrierwave-datamapper)
116
128
  * [carrierwave-mongoid](https://github.com/carrierwaveuploader/carrierwave-mongoid)
117
- * [carrierwave-sequel](https://github.com/jnicklas/carrierwave-sequel)
129
+ * [carrierwave-sequel](https://github.com/carrierwaveuploader/carrierwave-sequel)
118
130
 
119
131
  There are more extensions listed in [the wiki](https://github.com/carrierwaveuploader/carrierwave/wiki)
120
132
 
133
+ ## Multiple file uploads
134
+
135
+ CarrierWave also has convenient support for multiple file upload fields.
136
+
137
+ ### ActiveRecord
138
+
139
+ Add a column which can store an array. This could be an array column or a JSON
140
+ column for example. Your choice depends on what your database supports. For
141
+ example, create a migration like this:
142
+
143
+
144
+ #### For databases with ActiveRecord json data type support (e.g. PostgreSQL, MySQL)
145
+
146
+ rails g migration add_avatars_to_users avatars:json
147
+ rails db:migrate
148
+
149
+ #### For database without ActiveRecord json data type support (e.g. SQLite)
150
+
151
+ rails g migration add_avatars_to_users avatars:string
152
+ rails db:migrate
153
+
154
+ __Note__: JSON datatype doesn't exists in SQLite adapter, that's why you can use a string datatype which will be serialized in model.
155
+
156
+ Open your model file and mount the uploader:
157
+
158
+
159
+ ```ruby
160
+ class User < ActiveRecord::Base
161
+ mount_uploaders :avatars, AvatarUploader
162
+ serialize :avatars, JSON # If you use SQLite, add this line.
163
+ end
164
+ ```
165
+
166
+ Make sure that you mount the uploader with write (mount_uploaders) with `s` not (mount_uploader)
167
+ in order to avoid errors when uploading multiple files
168
+
169
+ Make sure your file input fields are set up as multiple file fields. For
170
+ example in Rails you'll want to do something like this:
171
+
172
+ ```erb
173
+ <%= form.file_field :avatars, multiple: true %>
174
+ ```
175
+
176
+ Also, make sure your upload controller permits the multiple file upload attribute, *pointing to an empty array in a hash*. For example:
177
+
178
+ ```ruby
179
+ params.require(:user).permit(:email, :first_name, :last_name, {avatars: []})
180
+ ```
181
+
182
+ Now you can select multiple files in the upload dialog (e.g. SHIFT+SELECT), and they will
183
+ automatically be stored when the record is saved.
184
+
185
+ ```ruby
186
+ u = User.new(params[:user])
187
+ u.save!
188
+ u.avatars[0].url # => '/url/to/file.png'
189
+ u.avatars[0].current_path # => 'path/to/file.png'
190
+ u.avatars[0].identifier # => 'file.png'
191
+ ```
192
+
193
+ If you want to preserve existing files on uploading new one, you can go like:
194
+
195
+ ```erb
196
+ <% user.avatars.each do |avatar| %>
197
+ <%= hidden_field :user, :avatars, multiple: true, value: avatar.identifier %>
198
+ <% end %>
199
+ <%= form.file_field :avatars, multiple: true %>
200
+ ```
201
+
202
+ Sorting avatars is supported as well by reordering `hidden_field`, an example using jQuery UI Sortable is available [here](https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Add%2C-remove-and-reorder-images-using-multiple-file-upload).
203
+
121
204
  ## Changing the storage directory
122
205
 
123
206
  In order to change where uploaded files are put, just override the `store_dir`
@@ -146,23 +229,46 @@ end
146
229
 
147
230
  ## Securing uploads
148
231
 
149
- Certain file might be dangerous if uploaded to the wrong location, such as php
150
- files or other script files. CarrierWave allows you to specify a white-list of
151
- allowed extensions.
232
+ Certain files might be dangerous if uploaded to the wrong location, such as PHP
233
+ files or other script files. CarrierWave allows you to specify a whitelist of
234
+ allowed extensions or content types.
152
235
 
153
236
  If you're mounting the uploader, uploading a file with the wrong extension will
154
237
  make the record invalid instead. Otherwise, an error is raised.
155
238
 
156
239
  ```ruby
157
240
  class MyUploader < CarrierWave::Uploader::Base
158
- def extension_white_list
241
+ def extension_whitelist
159
242
  %w(jpg jpeg gif png)
160
243
  end
161
244
  end
162
245
  ```
163
246
 
247
+ The same thing could be done using content types.
248
+ Let's say we need an uploader that accepts only images. This can be done like this
249
+
250
+ ```ruby
251
+ class MyUploader < CarrierWave::Uploader::Base
252
+ def content_type_whitelist
253
+ /image\//
254
+ end
255
+ end
256
+ ```
257
+
258
+ You can use a blacklist to reject content types.
259
+ Let's say we need an uploader that reject JSON files. This can be done like this
260
+
261
+ ```ruby
262
+ class NoJsonUploader < CarrierWave::Uploader::Base
263
+ def content_type_blacklist
264
+ ['application/text', 'application/json']
265
+ end
266
+ end
267
+ ```
268
+
164
269
  ### CVE-2016-3714 (ImageTragick)
165
- This version of CarrierWave has the ability to mitigate CVE-2016-3714. However, you **MUST** set a `content_type_whitelist` in your uploaders for this protection to be effective, and you **MUST** either disable ImageMagick's default SVG delegate or use the RSVG delegate for SVG processing.
270
+ This version of CarrierWave has the ability to mitigate CVE-2016-3714. However, you **MUST** set a content_type_whitelist in your uploaders for this protection to be effective, and you **MUST** either disable ImageMagick's default SVG delegate or use the RSVG delegate for SVG processing.
271
+
166
272
 
167
273
  A valid whitelist that will restrict your uploader to images only, and mitigate the CVE is:
168
274
 
@@ -174,57 +280,34 @@ class MyUploader < CarrierWave::Uploader::Base
174
280
  end
175
281
  ```
176
282
 
177
- **WARNING**: A `content_type_whitelist` is the only form of whitelist or blacklist supported by CarrierWave that can effectively mitigate against CVE-2016-3714. Use of `extension_type_whitelist` will not inspect the file headers, and thus still leaves your application open to the vulnerability.
178
-
283
+ **WARNING**: A `content_type_whitelist` is the only form of whitelist or blacklist supported by CarrierWave that can effectively mitigate against CVE-2016-3714. Use of `extension_whitelist` will not inspect the file headers, and thus still leaves your application open to the vulnerability.
179
284
 
180
285
  ### Filenames and unicode chars
181
286
 
182
287
  Another security issue you should care for is the file names (see
183
288
  [Ruby On Rails Security Guide](http://guides.rubyonrails.org/security.html#file-uploads)).
184
- By default, CarrierWave provides only English letters, arabic numerals and '-+_.' symbols as
289
+ By default, CarrierWave provides only English letters, arabic numerals and some symbols as
185
290
  white-listed characters in the file name. If you want to support local scripts (Cyrillic letters, letters with diacritics and so on), you
186
291
  have to override `sanitize_regexp` method. It should return regular expression which would match
187
292
  all *non*-allowed symbols.
188
293
 
189
- With Ruby 1.9 and higher you can simply write (as it has [Oniguruma](http://oniguruma.rubyforge.org/oniguruma/)
190
- built-in):
191
-
192
294
  ```ruby
193
295
  CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/
194
296
  ```
195
297
 
196
- With Ruby 1.8 you have to manually specify all character ranges. For example, for files which may
197
- contain Russian letters:
198
-
199
- ```ruby
200
- CarrierWave::SanitizedFile.sanitize_regexp = /[^a-zA-Zа-яА-ЯёЁ0-9\.\-\+_]/u
201
- ```
202
-
203
298
  Also make sure that allowing non-latin characters won't cause a compatibility issue with a third-party
204
299
  plugins or client-side software.
205
300
 
206
301
  ## Setting the content type
207
302
 
208
- If you care about the content type of your files and notice that it's not being set
209
- as expected, you can configure your uploaders to use `CarrierWave::MimeTypes`.
210
- This adds a dependency on the [mime-types](http://rubygems.org/gems/mime-types) gem,
211
- but is recommended when using fog, and fog already has a dependency on mime-types.
212
-
213
- ```ruby
214
- require 'carrierwave/processing/mime_types'
215
-
216
- class MyUploader < CarrierWave::Uploader::Base
217
- include CarrierWave::MimeTypes
218
-
219
- process :set_content_type
220
- end
221
- ```
303
+ As of v0.11.0, the `mime-types` gem is a runtime dependency and the content type is set automatically.
304
+ You no longer need to do this manually.
222
305
 
223
306
  ## Adding versions
224
307
 
225
308
  Often you'll want to add different versions of the same file. The classic example is image thumbnails. There is built in support for this*:
226
309
 
227
- *Note: You must have Imagemagick and MiniMagick installed to do image resizing. MiniMagick is a Ruby interface for Imagemagick which is a C program. This is why MiniMagick fails on 'bundle install' without Imagemagick installed.
310
+ *Note:* You must have Imagemagick installed to do image resizing.
228
311
 
229
312
  Some documentation refers to RMagick instead of MiniMagick but MiniMagick is recommended.
230
313
 
@@ -238,30 +321,48 @@ $ brew install imagemagick
238
321
  class MyUploader < CarrierWave::Uploader::Base
239
322
  include CarrierWave::MiniMagick
240
323
 
241
- process :resize_to_fit => [800, 800]
324
+ process resize_to_fit: [800, 800]
242
325
 
243
326
  version :thumb do
244
- process :resize_to_fill => [200,200]
327
+ process resize_to_fill: [200,200]
245
328
  end
246
329
 
247
330
  end
248
331
  ```
249
332
 
250
333
  When this uploader is used, an uploaded image would be scaled to be no larger
251
- than 800 by 800 pixels. A version called thumb is then created, which is scaled
252
- and cropped to exactly 200 by 200 pixels. The uploader could be used like this:
334
+ than 800 by 800 pixels. The original aspect ratio will be kept.
335
+
336
+ A version called `:thumb` is then created, which is scaled
337
+ to exactly 200 by 200 pixels. The thumbnail uses `resize_to_fill` which makes sure
338
+ that the width and height specified are filled, only cropping
339
+ if the aspect ratio requires it.
340
+
341
+ The above uploader could be used like this:
253
342
 
254
343
  ```ruby
255
344
  uploader = AvatarUploader.new
256
345
  uploader.store!(my_file) # size: 1024x768
257
346
 
258
- uploader.url # => '/url/to/my_file.png' # size: 800x600
347
+ uploader.url # => '/url/to/my_file.png' # size: 800x800
259
348
  uploader.thumb.url # => '/url/to/thumb_my_file.png' # size: 200x200
260
349
  ```
261
350
 
262
351
  One important thing to remember is that process is called *before* versions are
263
352
  created. This can cut down on processing cost.
264
353
 
354
+ ### Processing Methods: mini_magick
355
+
356
+ - `convert` - Changes the image encoding format to the given format, eg. jpg
357
+ - `resize_to_limit` - Resize the image to fit within the specified dimensions while retaining the original aspect ratio. Will only resize the image if it is larger than the specified dimensions. The resulting image may be shorter or narrower than specified in the smaller dimension but will not be larger than the specified values.
358
+ - `resize_to_fit` - Resize the image to fit within the specified dimensions while retaining the original aspect ratio. The image may be shorter or narrower than specified in the smaller dimension but will not be larger than the specified values.
359
+ - `resize_to_fill` - Resize the image to fit within the specified dimensions while retaining the aspect ratio of the original image. If necessary, crop the image in the larger dimension. Optionally, a "gravity" may be specified, for example "Center", or "NorthEast".
360
+ - `resize_and_pad` - Resize the image to fit within the specified dimensions while retaining the original aspect ratio. If necessary, will pad the remaining area with the given color, which defaults to transparent (for gif and png, white for jpeg). Optionally, a "gravity" may be specified, as above.
361
+
362
+ See `carrierwave/processing/mini_magick.rb` for details.
363
+
364
+ ### Nested versions
365
+
265
366
  It is possible to nest versions within versions:
266
367
 
267
368
  ```ruby
@@ -283,11 +384,11 @@ properties within the model or based on the picture itself.
283
384
  ```ruby
284
385
  class MyUploader < CarrierWave::Uploader::Base
285
386
 
286
- version :human, :if => :is_human?
287
- version :monkey, :if => :is_monkey?
288
- version :banner, :if => :is_landscape?
387
+ version :human, if: :is_human?
388
+ version :monkey, if: :is_monkey?
389
+ version :banner, if: :is_landscape?
289
390
 
290
- protected
391
+ private
291
392
 
292
393
  def is_human? picture
293
394
  model.can_program?(:ruby)
@@ -298,7 +399,7 @@ protected
298
399
  end
299
400
 
300
401
  def is_landscape? picture
301
- image = MiniMagick::Image.open(picture.path)
402
+ image = MiniMagick::Image.new(picture.path)
302
403
  image[:width] > image[:height]
303
404
  end
304
405
 
@@ -321,7 +422,7 @@ class MyUploader < CarrierWave::Uploader::Base
321
422
  process resize_to_fill: [280, 280]
322
423
  end
323
424
 
324
- version :small_thumb, :from_version => :thumb do
425
+ version :small_thumb, from_version: :thumb do
325
426
  process resize_to_fill: [20, 20]
326
427
  end
327
428
 
@@ -340,7 +441,7 @@ file, just add a hidden field called `avatar_cache` (don't forget to add it to
340
441
  the attr_accessible list as necessary). In Rails, this would look like this:
341
442
 
342
443
  ```erb
343
- <%= form_for @user, :html => {:multipart => true} do |f| %>
444
+ <%= form_for @user, html: { multipart: true } do |f| %>
344
445
  <p>
345
446
  <label>My Avatar</label>
346
447
  <%= f.file_field :avatar %>
@@ -353,7 +454,7 @@ It might be a good idea to show the user that a file has been uploaded, in the
353
454
  case of images, a small thumbnail would be a good indicator:
354
455
 
355
456
  ```erb
356
- <%= form_for @user, :html => {:multipart => true} do |f| %>
457
+ <%= form_for @user, html: { multipart: true } do |f| %>
357
458
  <p>
358
459
  <label>My Avatar</label>
359
460
  <%= image_tag(@user.avatar_url) if @user.avatar? %>
@@ -369,7 +470,7 @@ If you want to remove a previously uploaded file on a mounted uploader, you can
369
470
  easily add a checkbox to the form which will remove the file when checked.
370
471
 
371
472
  ```erb
372
- <%= form_for @user, :html => {:multipart => true} do |f| %>
473
+ <%= form_for @user, html: { multipart: true } do |f| %>
373
474
  <p>
374
475
  <label>My Avatar</label>
375
476
  <%= image_tag(@user.avatar_url) if @user.avatar? %>
@@ -400,7 +501,7 @@ via a URL. CarrierWave makes this simple, just add the appropriate attribute to
400
501
  form and you're good to go:
401
502
 
402
503
  ```erb
403
- <%= form_for @user, :html => {:multipart => true} do |f| %>
504
+ <%= form_for @user, html: { multipart: true } do |f| %>
404
505
  <p>
405
506
  <label>My Avatar URL:</label>
406
507
  <%= image_tag(@user.avatar_url) if @user.avatar? %>
@@ -422,7 +523,7 @@ this easily by overriding the `default_url` method in your uploader:
422
523
 
423
524
  ```ruby
424
525
  class MyUploader < CarrierWave::Uploader::Base
425
- def default_url
526
+ def default_url(*args)
426
527
  "/images/fallback/" + [version_name, "default.png"].compact.join('_')
427
528
  end
428
529
  end
@@ -432,7 +533,7 @@ Or if you are using the Rails asset pipeline:
432
533
 
433
534
  ```ruby
434
535
  class MyUploader < CarrierWave::Uploader::Base
435
- def default_url
536
+ def default_url(*args)
436
537
  ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
437
538
  end
438
539
  end
@@ -459,7 +560,7 @@ instance.recreate_versions!(:thumb, :large)
459
560
  Or on a mounted uploader:
460
561
 
461
562
  ```ruby
462
- User.all.each do |user|
563
+ User.find_each do |user|
463
564
  user.avatar.recreate_versions!
464
565
  end
465
566
  ```
@@ -467,7 +568,7 @@ end
467
568
  Note: `recreate_versions!` will throw an exception on records without an image. To avoid this, scope the records to those with images or check if an image exists within the block. If you're using ActiveRecord, recreating versions for a user avatar might look like this:
468
569
 
469
570
  ```ruby
470
- User.all.each do |user|
571
+ User.find_each do |user|
471
572
  user.avatar.recreate_versions! if user.avatar?
472
573
  end
473
574
  ```
@@ -497,6 +598,16 @@ If you're using Rails, create an initializer for this:
497
598
 
498
599
  config/initializers/carrierwave.rb
499
600
 
601
+ If you want CarrierWave to fail noisily in development, you can change these configs in your environment file:
602
+
603
+ ```ruby
604
+ CarrierWave.configure do |config|
605
+ config.ignore_integrity_errors = false
606
+ config.ignore_processing_errors = false
607
+ config.ignore_download_errors = false
608
+ end
609
+ ```
610
+
500
611
 
501
612
  ## Testing with CarrierWave
502
613
 
@@ -527,35 +638,43 @@ require 'carrierwave/test/matchers'
527
638
  describe MyUploader do
528
639
  include CarrierWave::Test::Matchers
529
640
 
641
+ let(:user) { double('user') }
642
+ let(:uploader) { MyUploader.new(user, :avatar) }
643
+
530
644
  before do
531
645
  MyUploader.enable_processing = true
532
- @uploader = MyUploader.new(@user, :avatar)
533
- @uploader.store!(File.open(path_to_file))
646
+ File.open(path_to_file) { |f| uploader.store!(f) }
534
647
  end
535
648
 
536
649
  after do
537
650
  MyUploader.enable_processing = false
538
- @uploader.remove!
651
+ uploader.remove!
539
652
  end
540
653
 
541
654
  context 'the thumb version' do
542
- it "should scale down a landscape image to be exactly 64 by 64 pixels" do
543
- @uploader.thumb.should have_dimensions(64, 64)
655
+ it "scales down a landscape image to be exactly 64 by 64 pixels" do
656
+ expect(uploader.thumb).to have_dimensions(64, 64)
544
657
  end
545
658
  end
546
659
 
547
660
  context 'the small version' do
548
- it "should scale down a landscape image to fit within 200 by 200 pixels" do
549
- @uploader.small.should be_no_larger_than(200, 200)
661
+ it "scales down a landscape image to fit within 200 by 200 pixels" do
662
+ expect(uploader.small).to be_no_larger_than(200, 200)
550
663
  end
551
664
  end
552
665
 
553
- it "should make the image readable only to the owner and not executable" do
554
- @uploader.should have_permissions(0600)
666
+ it "makes the image readable only to the owner and not executable" do
667
+ expect(uploader).to have_permissions(0600)
668
+ end
669
+
670
+ it "has the correct format" do
671
+ expect(uploader).to be_format('png')
555
672
  end
556
673
  end
557
674
  ```
558
675
 
676
+ If you're looking for minitest asserts, checkout [carrierwave_asserts](https://github.com/hcfairbanks/carrierwave_asserts).
677
+
559
678
  Setting the enable_processing flag on an uploader will prevent any of the versions from processing as well.
560
679
  Processing can be enabled for a single version by setting the processing flag on the version like so:
561
680
 
@@ -563,31 +682,41 @@ Processing can be enabled for a single version by setting the processing flag on
563
682
  @uploader.thumb.enable_processing = true
564
683
  ```
565
684
 
685
+ ## Fog
686
+
687
+ If you want to use fog you must add in your CarrierWave initializer the
688
+ following lines
689
+
690
+ ```ruby
691
+ config.fog_credentials = { ... } # Provider specific credentials
692
+ ```
693
+
566
694
  ## Using Amazon S3
567
695
 
568
- [Fog](http://github.com/fog/fog) is used to support Amazon S3. Ensure you have it in your Gemfile:
696
+ [Fog AWS](http://github.com/fog/fog-aws) is used to support Amazon S3. Ensure you have it in your Gemfile:
569
697
 
570
698
  ```ruby
571
- gem "fog", "~> 1.3.1"
699
+ gem "fog-aws"
572
700
  ```
573
701
 
574
702
  You'll need to provide your fog_credentials and a fog_directory (also known as a bucket) in an initializer.
575
- For the sake of performance it is assumed that the directory already exists, so please create it if need be.
703
+ For the sake of performance it is assumed that the directory already exists, so please create it if it needs to be.
576
704
  You can also pass in additional options, as documented fully in lib/carrierwave/storage/fog.rb. Here's a full example:
577
705
 
578
706
  ```ruby
579
707
  CarrierWave.configure do |config|
580
708
  config.fog_credentials = {
581
- :provider => 'AWS', # required
582
- :aws_access_key_id => 'xxx', # required
583
- :aws_secret_access_key => 'yyy', # required
584
- :region => 'eu-west-1', # optional, defaults to 'us-east-1'
585
- :host => 's3.example.com', # optional, defaults to nil
586
- :endpoint => 'https://s3.example.com:8080' # optional, defaults to nil
709
+ provider: 'AWS', # required
710
+ aws_access_key_id: 'xxx', # required unless using use_iam_profile
711
+ aws_secret_access_key: 'yyy', # required unless using use_iam_profile
712
+ use_iam_profile: true, # optional, defaults to false
713
+ region: 'eu-west-1', # optional, defaults to 'us-east-1'
714
+ host: 's3.example.com', # optional, defaults to nil
715
+ endpoint: 'https://s3.example.com:8080' # optional, defaults to nil
587
716
  }
588
- config.fog_directory = 'name_of_directory' # required
589
- config.fog_public = false # optional, defaults to true
590
- config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} # optional, defaults to {}
717
+ config.fog_directory = 'name_of_bucket' # required
718
+ config.fog_public = false # optional, defaults to true
719
+ config.fog_attributes = { cache_control: "public, max-age=#{365.days.to_i}" } # optional, defaults to {}
591
720
  end
592
721
  ```
593
722
 
@@ -601,6 +730,14 @@ end
601
730
 
602
731
  That's it! You can still use the `CarrierWave::Uploader#url` method to return the url to the file on Amazon S3.
603
732
 
733
+ **Note**: for Carrierwave to work properly it needs credentials with the following permissions:
734
+
735
+ * `s3:ListBucket`
736
+ * `s3:PutObject`
737
+ * `s3:GetObject`
738
+ * `s3:DeleteObject`
739
+ * `s3:PutObjectAcl`
740
+
604
741
  ## Using Rackspace Cloud Files
605
742
 
606
743
  [Fog](http://github.com/fog/fog) is used to support Rackspace Cloud Files. Ensure you have it in your Gemfile:
@@ -617,10 +754,10 @@ Using a US-based account:
617
754
  ```ruby
618
755
  CarrierWave.configure do |config|
619
756
  config.fog_credentials = {
620
- :provider => 'Rackspace',
621
- :rackspace_username => 'xxxxxx',
622
- :rackspace_api_key => 'yyyyyy',
623
- :rackspace_region => :ord # optional, defaults to :dfw
757
+ provider: 'Rackspace',
758
+ rackspace_username: 'xxxxxx',
759
+ rackspace_api_key: 'yyyyyy',
760
+ rackspace_region: :ord # optional, defaults to :dfw
624
761
  }
625
762
  config.fog_directory = 'name_of_directory'
626
763
  end
@@ -631,11 +768,11 @@ Using a UK-based account:
631
768
  ```ruby
632
769
  CarrierWave.configure do |config|
633
770
  config.fog_credentials = {
634
- :provider => 'Rackspace',
635
- :rackspace_username => 'xxxxxx',
636
- :rackspace_api_key => 'yyyyyy',
637
- :rackspace_auth_url => Fog::Rackspace::UK_AUTH_ENDPOINT,
638
- :rackspace_region => :lon
771
+ provider: 'Rackspace',
772
+ rackspace_username: 'xxxxxx',
773
+ rackspace_api_key: 'yyyyyy',
774
+ rackspace_auth_url: Fog::Rackspace::UK_AUTH_ENDPOINT,
775
+ rackspace_region: :lon
639
776
  }
640
777
  config.fog_directory = 'name_of_directory'
641
778
  end
@@ -662,25 +799,26 @@ the url to the file on Rackspace Cloud Files.
662
799
 
663
800
  ## Using Google Storage for Developers
664
801
 
665
- [Fog](http://github.com/fog/fog) is used to support Google Storage for Developers. Ensure you have it in your Gemfile:
802
+ [Fog](http://github.com/fog/fog-google) is used to support Google Storage for Developers. Ensure you have it in your Gemfile:
666
803
 
667
804
  ```ruby
668
- gem "fog"
805
+ gem "fog-google"
806
+ gem "google-api-client", "> 0.8.5", "< 0.9"
807
+ gem "mime-types"
669
808
  ```
670
809
 
671
810
  You'll need to configure a directory (also known as a bucket), access key id and secret access key in the initializer.
672
811
  For the sake of performance it is assumed that the directory already exists, so please create it if need be.
673
812
 
674
- Sign up [here](http://gs-signup-redirect.appspot.com/) and get your credentials [here](https://storage.cloud.google.com/m)
675
- under the section “Interoperable Access”.
813
+ Please read the [fog-google README](https://github.com/fog/fog-google/blob/master/README.md) on how to get credentials.
676
814
 
677
815
 
678
816
  ```ruby
679
817
  CarrierWave.configure do |config|
680
818
  config.fog_credentials = {
681
- :provider => 'Google',
682
- :google_storage_access_key_id => 'xxxxxx',
683
- :google_storage_secret_access_key => 'yyyyyy'
819
+ provider: 'Google',
820
+ google_storage_access_key_id: 'xxxxxx',
821
+ google_storage_secret_access_key: 'yyyyyy'
684
822
  }
685
823
  config.fog_directory = 'name_of_directory'
686
824
  end
@@ -697,6 +835,31 @@ end
697
835
  That's it! You can still use the `CarrierWave::Uploader#url` method to return
698
836
  the url to the file on Google.
699
837
 
838
+ ## Optimized Loading of Fog
839
+
840
+ Since Carrierwave doesn't know which parts of Fog you intend to use, it will just load the entire library (unless you use e.g. [`fog-aws`, `fog-google`] instead of fog proper). If you prefer to load fewer classes into your application, you need to load those parts of Fog yourself *before* loading CarrierWave in your Gemfile. Ex:
841
+
842
+ ```ruby
843
+ gem "fog", "~> 1.27", require: "fog/rackspace/storage"
844
+ gem "carrierwave"
845
+ ```
846
+
847
+ A couple of notes about versions:
848
+ * This functionality was introduced in Fog v1.20.
849
+ * This functionality is slated for CarrierWave v1.0.0.
850
+
851
+ If you're not relying on Gemfile entries alone and are requiring "carrierwave" anywhere, ensure you require "fog/rackspace/storage" before it. Ex:
852
+
853
+ ```ruby
854
+ require "fog/rackspace/storage"
855
+ require "carrierwave"
856
+ ```
857
+
858
+ Beware that this specific require is only needed when working with a fog provider that was not extracted to its own gem yet.
859
+ A list of the extracted providers can be found in the page of the `fog` organizations [here](https://github.com/fog).
860
+
861
+ When in doubt, inspect `Fog.constants` to see what has been loaded.
862
+
700
863
  ## Dynamic Asset Host
701
864
 
702
865
  The `asset_host` config property can be assigned a proc (or anything that responds to `call`) for generating the host dynamically. The proc-compliant object gets an instance of the current `CarrierWave::Storage::Fog::File` or `CarrierWave::SanitizedFile` as its only argument.
@@ -734,8 +897,8 @@ Convert will only work if the file has the same file extension, thus the use of
734
897
  class AvatarUploader < CarrierWave::Uploader::Base
735
898
  include CarrierWave::RMagick
736
899
 
737
- process :resize_to_fill => [200, 200]
738
- process :convert => 'png'
900
+ process resize_to_fill: [200, 200]
901
+ process convert: 'png'
739
902
 
740
903
  def filename
741
904
  super.chomp(File.extname(super)) + '.png' if original_filename.present?
@@ -748,8 +911,8 @@ manipulation methods.
748
911
 
749
912
  ## Using MiniMagick
750
913
 
751
- MiniMagick is similar to RMagick but performs all the operations using the 'mogrify'
752
- command which is part of the standard ImageMagick kit. This allows you to have the power
914
+ MiniMagick is similar to RMagick but performs all the operations using the 'convert'
915
+ CLI which is part of the standard ImageMagick kit. This allows you to have the power
753
916
  of ImageMagick without having to worry about installing all the RMagick libraries.
754
917
 
755
918
  See the MiniMagick site for more details:
@@ -767,7 +930,7 @@ for the RMagick processor.
767
930
  class AvatarUploader < CarrierWave::Uploader::Base
768
931
  include CarrierWave::MiniMagick
769
932
 
770
- process :resize_to_fill => [200, 200]
933
+ process resize_to_fill: [200, 200]
771
934
  end
772
935
  ```
773
936
 
@@ -787,28 +950,33 @@ details.
787
950
  Be sure to use mount_on to specify the correct column:
788
951
 
789
952
  ```ruby
790
- mount_uploader :avatar, AvatarUploader, :mount_on => :avatar_file_name
953
+ mount_uploader :avatar, AvatarUploader, mount_on: :avatar_file_name
791
954
  ```
792
955
 
793
- Unfortunately attachment_fu differs too much in philosophy for there to be a
794
- sensible compatibility mode. Patches for migrating from other solutions will be
795
- happily accepted.
956
+ ## I18n
796
957
 
797
- ## i18n
798
-
799
- The Active Record validations use the Rails i18n framework. Add these keys to
958
+ The Active Record validations use the Rails `i18n` framework. Add these keys to
800
959
  your translations file:
801
960
 
802
961
  ```yaml
803
962
  errors:
804
963
  messages:
805
- carrierwave_processing_error: "Cannot resize image."
806
- carrierwave_integrity_error: "Not an image."
807
- carrierwave_download_error: "Couldn't download image."
808
- extension_white_list_error: "You are not allowed to upload %{extension} files, allowed types: %{allowed_types}"
809
- extension_black_list_error: "You are not allowed to upload %{extension} files, prohibited types: %{prohibited_types}"
964
+ carrierwave_processing_error: failed to be processed
965
+ carrierwave_integrity_error: is not of an allowed file type
966
+ carrierwave_download_error: could not be downloaded
967
+ extension_whitelist_error: "You are not allowed to upload %{extension} files, allowed types: %{allowed_types}"
968
+ extension_blacklist_error: "You are not allowed to upload %{extension} files, prohibited types: %{prohibited_types}"
969
+ content_type_whitelist_error: "You are not allowed to upload %{content_type} files, allowed types: %{allowed_types}"
970
+ content_type_blacklist_error: "You are not allowed to upload %{content_type} files"
971
+ rmagick_processing_error: "Failed to manipulate with rmagick, maybe it is not an image?"
972
+ mini_magick_processing_error: "Failed to manipulate with MiniMagick, maybe it is not an image? Original Error: %{e}"
973
+ min_size_error: "File size should be greater than %{min_size}"
974
+ max_size_error: "File size should be less than %{max_size}"
810
975
  ```
811
976
 
977
+ The [`carrierwave-i18n`](https://github.com/carrierwaveuploader/carrierwave-i18n)
978
+ library adds support for additional locales.
979
+
812
980
  ## Large files
813
981
 
814
982
  By default, CarrierWave copies an uploaded file twice, first copying the file into the cache, then
@@ -822,6 +990,7 @@ class MyUploader < CarrierWave::Uploader::Base
822
990
  def move_to_cache
823
991
  true
824
992
  end
993
+
825
994
  def move_to_store
826
995
  true
827
996
  end
@@ -848,9 +1017,10 @@ Will add these callbacks:
848
1017
  ```ruby
849
1018
  after_save :store_avatar!
850
1019
  before_save :write_avatar_identifier
851
- after_commit :remove_avatar! :on => :destroy
852
- before_update :store_previous_model_for_avatar
853
- after_save :remove_previously_stored_avatar
1020
+ after_commit :remove_avatar!, on: :destroy
1021
+ after_commit :mark_remove_avatar_false, on: :update
1022
+ after_save :store_previous_changes_for_avatar
1023
+ after_commit :remove_previously_stored_avatar, on: :update
854
1024
  ```
855
1025
 
856
1026
  If you want to skip any of these callbacks (eg. you want to keep the existing
@@ -860,7 +1030,7 @@ avatar, even after uploading a new one), you can use ActiveRecord’s
860
1030
  ```ruby
861
1031
  class User
862
1032
  mount_uploader :avatar, AvatarUploader
863
- skip_callback :save, :after, :remove_previously_stored_avatar
1033
+ skip_callback :commit, :after, :remove_previously_stored_avatar
864
1034
  end
865
1035
  ```
866
1036
 
@@ -870,7 +1040,7 @@ See [CONTRIBUTING.md](https://github.com/carrierwaveuploader/carrierwave/blob/ma
870
1040
 
871
1041
  ## License
872
1042
 
873
- Copyright (c) 2008-2013 Jonas Nicklas
1043
+ Copyright (c) 2008-2015 Jonas Nicklas
874
1044
 
875
1045
  Permission is hereby granted, free of charge, to any person obtaining
876
1046
  a copy of this software and associated documentation files (the