carrierwave 0.11.2 → 1.0.0

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.

Potentially problematic release.


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

Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +215 -116
  3. data/lib/carrierwave/compatibility/paperclip.rb +0 -2
  4. data/lib/carrierwave/error.rb +1 -0
  5. data/lib/carrierwave/locale/en.yml +7 -4
  6. data/lib/carrierwave/mount.rb +217 -176
  7. data/lib/carrierwave/mounter.rb +164 -0
  8. data/lib/carrierwave/orm/activerecord.rb +49 -20
  9. data/lib/carrierwave/processing/mini_magick.rb +64 -13
  10. data/lib/carrierwave/processing/rmagick.rb +31 -3
  11. data/lib/carrierwave/processing.rb +0 -1
  12. data/lib/carrierwave/sanitized_file.rb +43 -38
  13. data/lib/carrierwave/storage/abstract.rb +15 -2
  14. data/lib/carrierwave/storage/file.rb +65 -2
  15. data/lib/carrierwave/storage/fog.rb +101 -27
  16. data/lib/carrierwave/storage.rb +0 -9
  17. data/lib/carrierwave/test/matchers.rb +77 -12
  18. data/lib/carrierwave/uploader/cache.rb +40 -26
  19. data/lib/carrierwave/uploader/callbacks.rb +0 -2
  20. data/lib/carrierwave/uploader/configuration.rb +48 -6
  21. data/lib/carrierwave/uploader/default_url.rb +3 -5
  22. data/lib/carrierwave/uploader/download.rb +10 -7
  23. data/lib/carrierwave/uploader/extension_blacklist.rb +14 -10
  24. data/lib/carrierwave/uploader/extension_whitelist.rb +12 -10
  25. data/lib/carrierwave/uploader/file_size.rb +41 -0
  26. data/lib/carrierwave/uploader/magic_mime_blacklist.rb +94 -0
  27. data/lib/carrierwave/uploader/magic_mime_whitelist.rb +94 -0
  28. data/lib/carrierwave/uploader/mountable.rb +7 -8
  29. data/lib/carrierwave/uploader/processing.rb +1 -3
  30. data/lib/carrierwave/uploader/proxy.rb +5 -7
  31. data/lib/carrierwave/uploader/remove.rb +0 -2
  32. data/lib/carrierwave/uploader/serialization.rb +1 -3
  33. data/lib/carrierwave/uploader/store.rb +5 -23
  34. data/lib/carrierwave/uploader/url.rb +1 -3
  35. data/lib/carrierwave/uploader/versions.rb +75 -82
  36. data/lib/carrierwave/uploader.rb +2 -2
  37. data/lib/carrierwave/utilities/uri.rb +4 -7
  38. data/lib/carrierwave/utilities.rb +0 -3
  39. data/lib/carrierwave/validations/active_model.rb +0 -2
  40. data/lib/carrierwave/version.rb +1 -1
  41. data/lib/carrierwave.rb +8 -10
  42. data/lib/generators/templates/uploader.rb +3 -5
  43. metadata +41 -95
  44. data/lib/carrierwave/locale/cs.yml +0 -11
  45. data/lib/carrierwave/locale/de.yml +0 -11
  46. data/lib/carrierwave/locale/el.yml +0 -11
  47. data/lib/carrierwave/locale/es.yml +0 -11
  48. data/lib/carrierwave/locale/fr.yml +0 -11
  49. data/lib/carrierwave/locale/ja.yml +0 -11
  50. data/lib/carrierwave/locale/nb.yml +0 -11
  51. data/lib/carrierwave/locale/nl.yml +0 -11
  52. data/lib/carrierwave/locale/pl.yml +0 -11
  53. data/lib/carrierwave/locale/pt-BR.yml +0 -11
  54. data/lib/carrierwave/locale/pt-PT.yml +0 -11
  55. data/lib/carrierwave/locale/ru.yml +0 -11
  56. data/lib/carrierwave/locale/sk.yml +0 -11
  57. data/lib/carrierwave/locale/tr.yml +0 -11
  58. data/lib/carrierwave/processing/mime_types.rb +0 -74
  59. data/lib/carrierwave/utilities/deprecation.rb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8c1689fd908e56b671c45e5cb1eebe3ec938a4df
4
- data.tar.gz: 89668d77484c786139f513dc1b82c82879da4e11
3
+ metadata.gz: 4e8aa98fa4de1f1cb517138ae11e7bfbd574638e
4
+ data.tar.gz: 5456c89662d0ca78e61cc12c8d9305b23175172e
5
5
  SHA512:
6
- metadata.gz: a03780cb6e64ad439c1f12378be2f4392617dbbe9f83329eccc6bc05064385e0e95a4b4609e32d922a0ce6d5543bbc795eb4abb8e429d5e366040fdfa3c82bfd
7
- data.tar.gz: ee26ab882ed995b677c38e6064843101633a07166cf2dda0e522bf1b13eb7a30a373312d67b786bc86365fd3ef4cb974f8f57a564dafbf9eafaf1c60b7e3e3e8
6
+ metadata.gz: d4ba35c722eeef4ccdf925adf951c1323dad0c116e0f4cbf7e567cbeefacb538e7259e5a59c771d17e05ced3a0d182bfb15000ca982edb3bce6f51fa288255eb
7
+ data.tar.gz: d9dbc8490ce0637ab6aa828eb695170637317141e0b3d901fefb15dfdf8b1f52094e4d7911e34182f607a185b5ebb06d460f047fb7a080f850da5d8a482c9321
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](http://img.shields.io/codeclimate/github/carrierwaveuploader/carrierwave.svg)](https://codeclimate.com/github/carrierwaveuploader/carrierwave)
8
+ [![git.legal](https://git.legal/projects/1363/badge.svg "Number of libraries approved")](https://git.legal/projects/1363)
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](http://stackoverflow.com/) 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 -v "1.0.0"
28
+ ```
25
29
 
26
30
  In Rails, add it to your Gemfile:
27
31
 
28
32
  ```ruby
29
- gem 'carrierwave'
33
+ gem 'carrierwave', '~> 1.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 1.0, CarrierWave requires Rails 4.0 or higher and Ruby 2.0
39
+ or higher. If you're on Rails 3, you should use v0.11.0.
36
40
 
37
41
  ## Getting Started
38
42
 
@@ -100,24 +104,81 @@ 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
+ **Note:** You must specify using the master branch to enable this feature:
135
+
136
+ `gem 'carrierwave', github: 'carrierwaveuploader/carrierwave'`.
137
+
138
+ CarrierWave also has convenient support for multiple file upload fields.
139
+
140
+ ### ActiveRecord
141
+
142
+ Add a column which can store an array. This could be an array column or a JSON
143
+ column for example. Your choice depends on what your database supports. For
144
+ example, create a migration like this:
145
+
146
+
147
+ rails g migration add_avatars_to_users avatars:json
148
+ rake db:migrate
149
+
150
+ Open your model file and mount the uploader:
151
+
152
+ ```ruby
153
+ class User < ActiveRecord::Base
154
+ mount_uploaders :avatars, AvatarUploader
155
+ end
156
+ ```
157
+
158
+ Make sure your file input fields are set up as multiple file fields. For
159
+ example in Rails you'll want to do something like this:
160
+
161
+ ```erb
162
+ <%= form.file_field :avatars, multiple: true %>
163
+ ```
164
+
165
+ Also, make sure your upload controller permits the multiple file upload attribute, *pointing to an empty array in a hash*. For example:
166
+
167
+ ```ruby
168
+ params.require(:user).permit(:email, :first_name, :last_name, {avatars: []})
169
+ ```
170
+
171
+ Now you can select multiple files in the upload dialog (e.g. SHIFT+SELECT), and they will
172
+ automatically be stored when the record is saved.
173
+
174
+ ```ruby
175
+ u = User.new(params[:user])
176
+ u.save!
177
+ u.avatars[0].url # => '/url/to/file.png'
178
+ u.avatars[0].current_path # => 'path/to/file.png'
179
+ u.avatars[0].identifier # => 'file.png'
180
+ ```
181
+
121
182
  ## Changing the storage directory
122
183
 
123
184
  In order to change where uploaded files are put, just override the `store_dir`
@@ -146,85 +207,69 @@ end
146
207
 
147
208
  ## Securing uploads
148
209
 
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.
210
+ Certain files might be dangerous if uploaded to the wrong location, such as PHP
211
+ files or other script files. CarrierWave allows you to specify a whitelist of
212
+ allowed extensions or content types.
152
213
 
153
214
  If you're mounting the uploader, uploading a file with the wrong extension will
154
215
  make the record invalid instead. Otherwise, an error is raised.
155
216
 
156
217
  ```ruby
157
218
  class MyUploader < CarrierWave::Uploader::Base
158
- def extension_white_list
219
+ def extension_whitelist
159
220
  %w(jpg jpeg gif png)
160
221
  end
161
222
  end
162
223
  ```
163
224
 
164
- ### 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.
166
-
167
- A valid whitelist that will restrict your uploader to images only, and mitigate the CVE is:
225
+ The same thing could be done using content types.
226
+ Let's say we need an uploader that accepts only images. This can be done like this
168
227
 
169
228
  ```ruby
170
229
  class MyUploader < CarrierWave::Uploader::Base
171
230
  def content_type_whitelist
172
- [/image\//]
231
+ /image\//
173
232
  end
174
233
  end
175
234
  ```
176
235
 
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.
236
+ You can use a blacklist to reject content types.
237
+ Let's say we need an uploader that reject JSON files. This can be done like this
178
238
 
239
+ ```ruby
240
+ class NoJsonUploader < CarrierWave::Uploader::Base
241
+ def content_type_blacklist
242
+ ['application/text', 'application/json']
243
+ end
244
+ end
245
+ ```
179
246
 
180
247
  ### Filenames and unicode chars
181
248
 
182
249
  Another security issue you should care for is the file names (see
183
250
  [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
251
+ By default, CarrierWave provides only English letters, arabic numerals and some symbols as
185
252
  white-listed characters in the file name. If you want to support local scripts (Cyrillic letters, letters with diacritics and so on), you
186
253
  have to override `sanitize_regexp` method. It should return regular expression which would match
187
254
  all *non*-allowed symbols.
188
255
 
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
256
  ```ruby
193
257
  CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/
194
258
  ```
195
259
 
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
260
  Also make sure that allowing non-latin characters won't cause a compatibility issue with a third-party
204
261
  plugins or client-side software.
205
262
 
206
263
  ## Setting the content type
207
264
 
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
- ```
265
+ As of v0.11.0, the `mime-types` gem is a runtime dependency and the content type is set automatically.
266
+ You no longer need to do this manually.
222
267
 
223
268
  ## Adding versions
224
269
 
225
270
  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
271
 
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.
272
+ *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.
228
273
 
229
274
  Some documentation refers to RMagick instead of MiniMagick but MiniMagick is recommended.
230
275
 
@@ -238,10 +283,10 @@ $ brew install imagemagick
238
283
  class MyUploader < CarrierWave::Uploader::Base
239
284
  include CarrierWave::MiniMagick
240
285
 
241
- process :resize_to_fit => [800, 800]
286
+ process resize_to_fit: [800, 800]
242
287
 
243
288
  version :thumb do
244
- process :resize_to_fill => [200,200]
289
+ process resize_to_fill: [200,200]
245
290
  end
246
291
 
247
292
  end
@@ -283,11 +328,11 @@ properties within the model or based on the picture itself.
283
328
  ```ruby
284
329
  class MyUploader < CarrierWave::Uploader::Base
285
330
 
286
- version :human, :if => :is_human?
287
- version :monkey, :if => :is_monkey?
288
- version :banner, :if => :is_landscape?
331
+ version :human, if: :is_human?
332
+ version :monkey, if: :is_monkey?
333
+ version :banner, if: :is_landscape?
289
334
 
290
- protected
335
+ private
291
336
 
292
337
  def is_human? picture
293
338
  model.can_program?(:ruby)
@@ -321,7 +366,7 @@ class MyUploader < CarrierWave::Uploader::Base
321
366
  process resize_to_fill: [280, 280]
322
367
  end
323
368
 
324
- version :small_thumb, :from_version => :thumb do
369
+ version :small_thumb, from_version: :thumb do
325
370
  process resize_to_fill: [20, 20]
326
371
  end
327
372
 
@@ -340,7 +385,7 @@ file, just add a hidden field called `avatar_cache` (don't forget to add it to
340
385
  the attr_accessible list as necessary). In Rails, this would look like this:
341
386
 
342
387
  ```erb
343
- <%= form_for @user, :html => {:multipart => true} do |f| %>
388
+ <%= form_for @user, html: { multipart: true } do |f| %>
344
389
  <p>
345
390
  <label>My Avatar</label>
346
391
  <%= f.file_field :avatar %>
@@ -353,7 +398,7 @@ It might be a good idea to show the user that a file has been uploaded, in the
353
398
  case of images, a small thumbnail would be a good indicator:
354
399
 
355
400
  ```erb
356
- <%= form_for @user, :html => {:multipart => true} do |f| %>
401
+ <%= form_for @user, html: { multipart: true } do |f| %>
357
402
  <p>
358
403
  <label>My Avatar</label>
359
404
  <%= image_tag(@user.avatar_url) if @user.avatar? %>
@@ -369,7 +414,7 @@ If you want to remove a previously uploaded file on a mounted uploader, you can
369
414
  easily add a checkbox to the form which will remove the file when checked.
370
415
 
371
416
  ```erb
372
- <%= form_for @user, :html => {:multipart => true} do |f| %>
417
+ <%= form_for @user, html: { multipart: true } do |f| %>
373
418
  <p>
374
419
  <label>My Avatar</label>
375
420
  <%= image_tag(@user.avatar_url) if @user.avatar? %>
@@ -400,7 +445,7 @@ via a URL. CarrierWave makes this simple, just add the appropriate attribute to
400
445
  form and you're good to go:
401
446
 
402
447
  ```erb
403
- <%= form_for @user, :html => {:multipart => true} do |f| %>
448
+ <%= form_for @user, html: { multipart: true } do |f| %>
404
449
  <p>
405
450
  <label>My Avatar URL:</label>
406
451
  <%= image_tag(@user.avatar_url) if @user.avatar? %>
@@ -422,7 +467,7 @@ this easily by overriding the `default_url` method in your uploader:
422
467
 
423
468
  ```ruby
424
469
  class MyUploader < CarrierWave::Uploader::Base
425
- def default_url
470
+ def default_url(*args)
426
471
  "/images/fallback/" + [version_name, "default.png"].compact.join('_')
427
472
  end
428
473
  end
@@ -432,7 +477,7 @@ Or if you are using the Rails asset pipeline:
432
477
 
433
478
  ```ruby
434
479
  class MyUploader < CarrierWave::Uploader::Base
435
- def default_url
480
+ def default_url(*args)
436
481
  ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
437
482
  end
438
483
  end
@@ -459,7 +504,7 @@ instance.recreate_versions!(:thumb, :large)
459
504
  Or on a mounted uploader:
460
505
 
461
506
  ```ruby
462
- User.all.each do |user|
507
+ User.find_each do |user|
463
508
  user.avatar.recreate_versions!
464
509
  end
465
510
  ```
@@ -467,7 +512,7 @@ end
467
512
  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
513
 
469
514
  ```ruby
470
- User.all.each do |user|
515
+ User.find_each do |user|
471
516
  user.avatar.recreate_versions! if user.avatar?
472
517
  end
473
518
  ```
@@ -497,6 +542,16 @@ If you're using Rails, create an initializer for this:
497
542
 
498
543
  config/initializers/carrierwave.rb
499
544
 
545
+ If you want CarrierWave to fail noisily in development, you can change these configs in your environment file:
546
+
547
+ ```ruby
548
+ CarrierWave.configure do |config|
549
+ config.ignore_integrity_errors = false
550
+ config.ignore_processing_errors = false
551
+ config.ignore_download_errors = false
552
+ end
553
+ ```
554
+
500
555
 
501
556
  ## Testing with CarrierWave
502
557
 
@@ -527,31 +582,37 @@ require 'carrierwave/test/matchers'
527
582
  describe MyUploader do
528
583
  include CarrierWave::Test::Matchers
529
584
 
585
+ let(:user) { double('user') }
586
+ let(:uploader) { MyUploader.new(user, :avatar) }
587
+
530
588
  before do
531
589
  MyUploader.enable_processing = true
532
- @uploader = MyUploader.new(@user, :avatar)
533
- @uploader.store!(File.open(path_to_file))
590
+ File.open(path_to_file) { |f| uploader.store!(f) }
534
591
  end
535
592
 
536
593
  after do
537
594
  MyUploader.enable_processing = false
538
- @uploader.remove!
595
+ uploader.remove!
539
596
  end
540
597
 
541
598
  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)
599
+ it "scales down a landscape image to be exactly 64 by 64 pixels" do
600
+ expect(uploader.thumb).to have_dimensions(64, 64)
544
601
  end
545
602
  end
546
603
 
547
604
  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)
605
+ it "scales down a landscape image to fit within 200 by 200 pixels" do
606
+ expect(uploader.small).to be_no_larger_than(200, 200)
550
607
  end
551
608
  end
552
609
 
553
- it "should make the image readable only to the owner and not executable" do
554
- @uploader.should have_permissions(0600)
610
+ it "makes the image readable only to the owner and not executable" do
611
+ expect(uploader).to have_permissions(0600)
612
+ end
613
+
614
+ it "has the correct format" do
615
+ expect(uploader).to be_format('png')
555
616
  end
556
617
  end
557
618
  ```
@@ -563,31 +624,42 @@ Processing can be enabled for a single version by setting the processing flag on
563
624
  @uploader.thumb.enable_processing = true
564
625
  ```
565
626
 
627
+ ## Fog
628
+
629
+ If you want to use fog you must add in your CarrierWave initializer the
630
+ following lines
631
+
632
+ ```ruby
633
+ config.fog_provider = 'fog' # 'fog/aws' etc. Defaults to 'fog'
634
+ config.fog_credentials = { ... } # Provider specific credentials
635
+ ```
636
+
566
637
  ## Using Amazon S3
567
638
 
568
- [Fog](http://github.com/fog/fog) is used to support Amazon S3. Ensure you have it in your Gemfile:
639
+ [Fog AWS](http://github.com/fog/fog-aws) is used to support Amazon S3. Ensure you have it in your Gemfile:
569
640
 
570
641
  ```ruby
571
- gem "fog", "~> 1.3.1"
642
+ gem "fog-aws"
572
643
  ```
573
644
 
574
645
  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.
646
+ For the sake of performance it is assumed that the directory already exists, so please create it if it needs to be.
576
647
  You can also pass in additional options, as documented fully in lib/carrierwave/storage/fog.rb. Here's a full example:
577
648
 
578
649
  ```ruby
579
650
  CarrierWave.configure do |config|
651
+ config.fog_provider = 'fog/aws' # required
580
652
  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
653
+ provider: 'AWS', # required
654
+ aws_access_key_id: 'xxx', # required
655
+ aws_secret_access_key: 'yyy', # required
656
+ region: 'eu-west-1', # optional, defaults to 'us-east-1'
657
+ host: 's3.example.com', # optional, defaults to nil
658
+ endpoint: 'https://s3.example.com:8080' # optional, defaults to nil
587
659
  }
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 {}
660
+ config.fog_directory = 'name_of_directory' # required
661
+ config.fog_public = false # optional, defaults to true
662
+ config.fog_attributes = { 'Cache-Control' => "max-age=#{365.day.to_i}" } # optional, defaults to {}
591
663
  end
592
664
  ```
593
665
 
@@ -616,11 +688,12 @@ Using a US-based account:
616
688
 
617
689
  ```ruby
618
690
  CarrierWave.configure do |config|
691
+ config.fog_provider = "fog/rackspace/storage" # optional, defaults to "fog"
619
692
  config.fog_credentials = {
620
- :provider => 'Rackspace',
621
- :rackspace_username => 'xxxxxx',
622
- :rackspace_api_key => 'yyyyyy',
623
- :rackspace_region => :ord # optional, defaults to :dfw
693
+ provider: 'Rackspace',
694
+ rackspace_username: 'xxxxxx',
695
+ rackspace_api_key: 'yyyyyy',
696
+ rackspace_region: :ord # optional, defaults to :dfw
624
697
  }
625
698
  config.fog_directory = 'name_of_directory'
626
699
  end
@@ -630,12 +703,13 @@ Using a UK-based account:
630
703
 
631
704
  ```ruby
632
705
  CarrierWave.configure do |config|
706
+ config.fog_provider = "fog/rackspace/storage" # optional, defaults to "fog"
633
707
  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
708
+ provider: 'Rackspace',
709
+ rackspace_username: 'xxxxxx',
710
+ rackspace_api_key: 'yyyyyy',
711
+ rackspace_auth_url: Fog::Rackspace::UK_AUTH_ENDPOINT,
712
+ rackspace_region: :lon
639
713
  }
640
714
  config.fog_directory = 'name_of_directory'
641
715
  end
@@ -662,25 +736,27 @@ the url to the file on Rackspace Cloud Files.
662
736
 
663
737
  ## Using Google Storage for Developers
664
738
 
665
- [Fog](http://github.com/fog/fog) is used to support Google Storage for Developers. Ensure you have it in your Gemfile:
739
+ [Fog](http://github.com/fog/fog-google) is used to support Google Storage for Developers. Ensure you have it in your Gemfile:
666
740
 
667
741
  ```ruby
668
- gem "fog"
742
+ gem "fog-google"
743
+ gem "google-api-client", ">= 0.6.2", "< 0.9"
744
+ gem "mime-types"
669
745
  ```
670
746
 
671
747
  You'll need to configure a directory (also known as a bucket), access key id and secret access key in the initializer.
672
748
  For the sake of performance it is assumed that the directory already exists, so please create it if need be.
673
749
 
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”.
750
+ Please read the [fog-google README](https://github.com/fog/fog-google/blob/master/README.md) on how to get credentials.
676
751
 
677
752
 
678
753
  ```ruby
679
754
  CarrierWave.configure do |config|
755
+ config.fog_provider = 'fog/google' # required
680
756
  config.fog_credentials = {
681
- :provider => 'Google',
682
- :google_storage_access_key_id => 'xxxxxx',
683
- :google_storage_secret_access_key => 'yyyyyy'
757
+ provider: 'Google',
758
+ google_storage_access_key_id: 'xxxxxx',
759
+ google_storage_secret_access_key: 'yyyyyy'
684
760
  }
685
761
  config.fog_directory = 'name_of_directory'
686
762
  end
@@ -697,6 +773,31 @@ end
697
773
  That's it! You can still use the `CarrierWave::Uploader#url` method to return
698
774
  the url to the file on Google.
699
775
 
776
+ ## Optimized Loading of Fog
777
+
778
+ 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:
779
+
780
+ ```ruby
781
+ gem "fog", "~> 1.27", require: "fog/rackspace/storage"
782
+ gem "carrierwave"
783
+ ```
784
+
785
+ A couple of notes about versions:
786
+ * This functionality was introduced in Fog v1.20.
787
+ * This functionality is slated for CarrierWave v1.0.0.
788
+
789
+ If you're not relying on Gemfile entries alone and are requiring "carrierwave" anywhere, ensure you require "fog/rackspace/storage" before it. Ex:
790
+
791
+ ```ruby
792
+ require "fog/rackspace/storage"
793
+ require "carrierwave"
794
+ ```
795
+
796
+ Beware that this specific require is only needed when working with a fog provider that was not extracted to its own gem yet.
797
+ A list of the extracted providers can be found in the page of the `fog` organizations [here](https://github.com/fog).
798
+
799
+ When in doubt, inspect `Fog.constants` to see what has been loaded.
800
+
700
801
  ## Dynamic Asset Host
701
802
 
702
803
  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 +835,8 @@ Convert will only work if the file has the same file extension, thus the use of
734
835
  class AvatarUploader < CarrierWave::Uploader::Base
735
836
  include CarrierWave::RMagick
736
837
 
737
- process :resize_to_fill => [200, 200]
738
- process :convert => 'png'
838
+ process resize_to_fill: [200, 200]
839
+ process convert: 'png'
739
840
 
740
841
  def filename
741
842
  super.chomp(File.extname(super)) + '.png' if original_filename.present?
@@ -767,7 +868,7 @@ for the RMagick processor.
767
868
  class AvatarUploader < CarrierWave::Uploader::Base
768
869
  include CarrierWave::MiniMagick
769
870
 
770
- process :resize_to_fill => [200, 200]
871
+ process resize_to_fill: [200, 200]
771
872
  end
772
873
  ```
773
874
 
@@ -787,14 +888,10 @@ details.
787
888
  Be sure to use mount_on to specify the correct column:
788
889
 
789
890
  ```ruby
790
- mount_uploader :avatar, AvatarUploader, :mount_on => :avatar_file_name
891
+ mount_uploader :avatar, AvatarUploader, mount_on: :avatar_file_name
791
892
  ```
792
893
 
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.
796
-
797
- ## i18n
894
+ ## I18n
798
895
 
799
896
  The Active Record validations use the Rails i18n framework. Add these keys to
800
897
  your translations file:
@@ -805,8 +902,8 @@ errors:
805
902
  carrierwave_processing_error: "Cannot resize image."
806
903
  carrierwave_integrity_error: "Not an image."
807
904
  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}"
905
+ extension_whitelist_error: "You are not allowed to upload %{extension} files, allowed types: %{allowed_types}"
906
+ extension_blacklist_error: "You are not allowed to upload %{extension} files, prohibited types: %{prohibited_types}"
810
907
  ```
811
908
 
812
909
  ## Large files
@@ -822,6 +919,7 @@ class MyUploader < CarrierWave::Uploader::Base
822
919
  def move_to_cache
823
920
  true
824
921
  end
922
+
825
923
  def move_to_store
826
924
  true
827
925
  end
@@ -848,9 +946,10 @@ Will add these callbacks:
848
946
  ```ruby
849
947
  after_save :store_avatar!
850
948
  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
949
+ after_commit :remove_avatar!, on: :destroy
950
+ after_commit :mark_remove_avatar_false, on: :update
951
+ after_save :store_previous_changes_for_avatar
952
+ after_commit :remove_previously_stored_avatar, on: :update
854
953
  ```
855
954
 
856
955
  If you want to skip any of these callbacks (eg. you want to keep the existing
@@ -860,7 +959,7 @@ avatar, even after uploading a new one), you can use ActiveRecord’s
860
959
  ```ruby
861
960
  class User
862
961
  mount_uploader :avatar, AvatarUploader
863
- skip_callback :save, :after, :remove_previously_stored_avatar
962
+ skip_callback :commit, :after, :remove_previously_stored_avatar
864
963
  end
865
964
  ```
866
965
 
@@ -870,7 +969,7 @@ See [CONTRIBUTING.md](https://github.com/carrierwaveuploader/carrierwave/blob/ma
870
969
 
871
970
  ## License
872
971
 
873
- Copyright (c) 2008-2013 Jonas Nicklas
972
+ Copyright (c) 2008-2015 Jonas Nicklas
874
973
 
875
974
  Permission is hereby granted, free of charge, to any person obtaining
876
975
  a copy of this software and associated documentation files (the
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module CarrierWave
4
2
  module Compatibility
5
3
 
@@ -4,4 +4,5 @@ module CarrierWave
4
4
  class InvalidParameter < UploadError; end
5
5
  class ProcessingError < UploadError; end
6
6
  class DownloadError < UploadError; end
7
+ class UnknownStorageError < StandardError; end
7
8
  end