carrierwave 0.3.0 → 0.3.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.

data/README.rdoc CHANGED
@@ -1,6 +1,11 @@
1
1
  = CarrierWave
2
2
 
3
- This plugin for Merb and Rails provides a simple and extremely flexible way to upload files.
3
+ This plugin for Merb and Rails provides a simple and extremely flexible way to
4
+ upload files.
5
+
6
+ * RDoc Documentation {available at Rubyforge}[http://carrierwave.rubyforge.org/].
7
+ * Source code {hosted at GitHub}[http://github.com/jnicklas/carrierwave]
8
+ * Please {report any issues}[http://github.com/jnicklas/carrierwave/issues] on GitHub
4
9
 
5
10
  == Getting Started
6
11
 
@@ -34,7 +39,8 @@ this should give you a file in:
34
39
 
35
40
  app/uploaders/avatar_uploader.rb
36
41
 
37
- Check out this file for some hints on how you can customize your uploader. It should look something like this:
42
+ Check out this file for some hints on how you can customize your uploader. It
43
+ should look something like this:
38
44
 
39
45
  class AvatarUploader < CarrierWave::Uploader::Base
40
46
  storage :file
@@ -48,20 +54,23 @@ You can use your uploader class to store and retrieve files like this:
48
54
 
49
55
  uploader.retrieve_from_store!('my_file.png')
50
56
 
51
- CarrierWave gives you a +store+ for permanent storage, and a +cache+ for temporary storage. You can use different stores, at the moment a filesystem store and an Amazon S3 store are bundled.
57
+ CarrierWave gives you a +store+ for permanent storage, and a +cache+ for
58
+ temporary storage. You can use different stores, at the moment a filesystem
59
+ store and an Amazon S3 store are bundled.
52
60
 
53
- Most of the time you are going to want to use CarrierWave together with an ORM. It is quite simple to mount uploaders on columns in your model, so you can simply assign files and get going:
61
+ Most of the time you are going to want to use CarrierWave together with an ORM.
62
+ It is quite simple to mount uploaders on columns in your model, so you can
63
+ simply assign files and get going:
54
64
 
55
65
  === ActiveRecord, DataMapper, Sequel
56
66
 
57
- First require the relevant extension:
67
+ If you are *not* using Merb or Rails you'll need to require the relevant ORM
68
+ extension.
58
69
 
59
70
  require 'carrierwave/orm/activerecord'
60
71
  require 'carrierwave/orm/datamapper'
61
72
  require 'carrierwave/orm/sequel'
62
73
 
63
- You don't need to do this if you are using Merb or Rails.
64
-
65
74
  Open your model file, for ActiveRecord do something like:
66
75
 
67
76
  class User < ActiveRecord::Base
@@ -82,7 +91,8 @@ Or for Sequel
82
91
  mount_uploader :avatar, AvatarUploader
83
92
  end
84
93
 
85
- Now you can cache files by assigning them to the attribute, they will automatically be stored when the record is saved.
94
+ Now you can cache files by assigning them to the attribute, they will
95
+ automatically be stored when the record is saved.
86
96
 
87
97
  u = User.new
88
98
  u.avatar = params[:file]
@@ -93,7 +103,8 @@ Now you can cache files by assigning them to the attribute, they will automatica
93
103
 
94
104
  == Changing the storage directory
95
105
 
96
- In order to change where uploaded files are put, just override the +store_dir+ method:
106
+ In order to change where uploaded files are put, just override the +store_dir+
107
+ method:
97
108
 
98
109
  class MyUploader < CarrierWave::Uploader::Base
99
110
  def store_dir
@@ -105,7 +116,8 @@ This works for the file storage as well as Amazon S3.
105
116
 
106
117
  == Adding versions
107
118
 
108
- 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:
119
+ Often you'll want to add different versions of the same file. The classic
120
+ example is image thumbnails. There is built in support for this:
109
121
 
110
122
  class MyUploader < CarrierWave::Uploader::Base
111
123
  include CarrierWave::RMagick
@@ -118,7 +130,9 @@ Often you'll want to add different versions of the same file. The classic exampl
118
130
 
119
131
  end
120
132
 
121
- When this uploader is used, an uploaded image would be scaled to be no larger than 800 by 800 pixels. A version called thumb is then created, which is scaled and cropped to exactly 200 by 200 pixels. The uploader could be used like this:
133
+ When this uploader is used, an uploaded image would be scaled to be no larger
134
+ than 800 by 800 pixels. A version called thumb is then created, which is scaled
135
+ and cropped to exactly 200 by 200 pixels. The uploader could be used like this:
122
136
 
123
137
  uploader = AvatarUploader.new
124
138
  uploader.store!(my_file) # size: 1024x768
@@ -126,7 +140,8 @@ When this uploader is used, an uploaded image would be scaled to be no larger th
126
140
  uploader.url # => '/url/to/my_file.png' # size: 800x600
127
141
  uploader.thumb.url # => '/url/to/thumb_my_file.png' # size: 200x200
128
142
 
129
- One important thing to remember is that process is called *before* versions are created. This can cut down on processing cost.
143
+ One important thing to remember is that process is called *before* versions are
144
+ created. This can cut down on processing cost.
130
145
 
131
146
  It is possible to nest versions within versions:
132
147
 
@@ -141,10 +156,11 @@ It is possible to nest versions within versions:
141
156
 
142
157
  == Making uploads work across form redisplays
143
158
 
144
- Often you'll notice that uploaded files disappear when a validation
145
- fails. CarrierWave has a feature that makes it easy to remember the
146
- uploaded file even in that case. Suppose your +user+ model has an uploader mounted on +avatar+ file, just add a hidden field called +avatar_cache+.
147
- In Rails, this would look like this:
159
+ Often you'll notice that uploaded files disappear when a validation fails.
160
+ CarrierWave has a feature that makes it easy to remember the uploaded file even
161
+ in that case. Suppose your +user+ model has an uploader mounted on +avatar+
162
+ file, just add a hidden field called +avatar_cache+. In Rails, this would look
163
+ like this:
148
164
 
149
165
  <% form_for @user do |f| %>
150
166
  <p>
@@ -154,8 +170,8 @@ In Rails, this would look like this:
154
170
  </p>
155
171
  <% end %>
156
172
 
157
- It might be a good idea to show th user that a file has been uploaded,
158
- in the case of images, a small thumbnail would be a good indicator:
173
+ It might be a good idea to show th user that a file has been uploaded, in the
174
+ case of images, a small thumbnail would be a good indicator:
159
175
 
160
176
  <% form_for @user do |f| %>
161
177
  <p>
@@ -166,11 +182,17 @@ in the case of images, a small thumbnail would be a good indicator:
166
182
  </p>
167
183
  <% end %>
168
184
 
169
- NOTE: this feature currently requires write access to your filesystem. If write access is unavailable (e.g. Heroku) you will not be able to upload files. You can prevent CarrierWave from writing to the file system by setting `CarrierWave.config[:cache_to_cache_dir] = false`. This will however break redisplays of forms.
185
+ NOTE: this feature currently requires write access to your filesystem. If write
186
+ access is unavailable you will not be able to upload files. You can prevent
187
+ CarrierWave from writing to the file system by setting
188
+ `CarrierWave.config[:cache_to_cache_dir] = false`. This will however break
189
+ redisplays of forms.
170
190
 
171
191
  == Providing a default path
172
192
 
173
- In many cases, especially when working with images, it might be a good idea to provide a default path, a fallback in case no file has been uploaded. You can do this easily by overriding the +default_path+ method in your uploader:
193
+ In many cases, especially when working with images, it might be a good idea to
194
+ provide a default path, a fallback in case no file has been uploaded. You can do
195
+ this easily by overriding the +default_path+ method in your uploader:
174
196
 
175
197
  class MyUploader < CarrierWave::Uploader::Base
176
198
  def default_path
@@ -194,17 +216,24 @@ And then in your uploader, set the storage to :s3
194
216
  storage :s3
195
217
  end
196
218
 
197
- That's it! You can still use the +CarrierWave::Uploader#url+ method to return the url to the file on Amazon S3
219
+ That's it! You can still use the +CarrierWave::Uploader#url+ method to return
220
+ the url to the file on Amazon S3
198
221
 
199
222
  == Using RMagick
200
223
 
201
- If you're uploading images, you'll probably want to manipulate them in some way, you might want to create thumbnail images for example. CarrierWave comes with a small library to make manipulating images with RMagick easier, you'll need to include it in your Uploader:
224
+ If you're uploading images, you'll probably want to manipulate them in some way,
225
+ you might want to create thumbnail images for example. CarrierWave comes with a
226
+ small library to make manipulating images with RMagick easier, you'll need to
227
+ include it in your Uploader:
202
228
 
203
229
  class AvatarUploader < CarrierWave::Uploader::Base
204
230
  include CarrierWave::RMagick
205
231
  end
206
232
 
207
- The RMagick module gives you a few methods, like +CarrierWave::RMagick#crop_resized+ which manipulate the image file in some way. You can set a +process+ callback, which will call that method any time a file is uploaded.
233
+ The RMagick module gives you a few methods, like
234
+ +CarrierWave::RMagick#crop_resized+ which manipulate the image file in some way.
235
+ You can set a +process+ callback, which will call that method any time a file is
236
+ uploaded.
208
237
 
209
238
  class AvatarUploader < CarrierWave::Uploader::Base
210
239
  include CarrierWave::RMagick
@@ -217,7 +246,8 @@ The RMagick module gives you a few methods, like +CarrierWave::RMagick#crop_resi
217
246
  end
218
247
  end
219
248
 
220
- Check out the manipulate! method, which makes it easy for you to write your own manipulation methods.
249
+ Check out the manipulate! method, which makes it easy for you to write your own
250
+ manipulation methods.
221
251
 
222
252
  == Using ImageScience
223
253
 
@@ -237,18 +267,41 @@ If you are using Paperclip, you can use the provided compatibility module:
237
267
  include CarrierWave::Compatibility::Paperclip
238
268
  end
239
269
 
240
- See the documentation for +Paperclip::Compatibility::Paperclip+ for more detaills.
270
+ See the documentation for +Paperclip::Compatibility::Paperclip+ for more
271
+ detaills.
241
272
 
242
273
  Be sure to use mount_on to specify the correct column:
243
274
 
244
275
  mount_uploader :avatar, AvatarUploader, :mount_on => :avatar_file_name
245
276
 
246
- Unfortunately AttachmentFoo differs too much in philosophy for there to be a sensible compatibility mode. Patches for migrating from other solutions will be happily accepted.
277
+ Unfortunately AttachmentFoo differs too much in philosophy for there to be a
278
+ sensible compatibility mode. Patches for migrating from other solutions will be
279
+ happily accepted.
280
+
281
+ == i18n
282
+
283
+ The activerecord validations use the Rails i18n framework. Add these keys to
284
+ your translations file:
285
+
286
+ carrierwave:
287
+ errors:
288
+ integrity: 'Not an image.'
289
+ processing: 'Cannot resize image.'
290
+
291
+ == Contributors
292
+
293
+ These people have contributed their time and effort to CarrierWave:
294
+
295
+ * Jonas Nicklas
296
+ * Pavel Kunc
247
297
 
248
- == Documentation
298
+ == License
249
299
 
250
- Full rdoc documentation is {available at Rubyforge}[http://carrierwave.rubyforge.org/].
300
+ MIT-License, see the separate LICENSE file in the source distribution.
251
301
 
252
302
  == Read the source
253
303
 
254
- CarrierWave is still young, but most of it is pretty well documented. It is also extensively specced, and there are cucumber features for some common use cases. Just dig in and look at the source for more in-depth explanation of what things are doing.
304
+ CarrierWave is still young, but most of it is pretty well documented. It is also
305
+ extensively specced, and there are cucumber features for some common use cases.
306
+ Just dig in and look at the source for more in-depth explanation of what things
307
+ are doing.
data/Rakefile CHANGED
@@ -3,13 +3,17 @@ require 'rake/gempackagetask'
3
3
  require 'rake/rdoctask'
4
4
  gem 'rdoc', '>=2.4.0'
5
5
  require 'rdoc'
6
- require 'sdoc'
6
+ begin
7
+ require 'sdoc'
8
+ rescue LoadError
9
+ end
7
10
 
8
11
  require 'spec/rake/spectask'
12
+ require 'spec/rake/verify_rcov'
9
13
  require 'cucumber/rake/task'
10
14
 
11
15
  NAME = "carrierwave"
12
- GEM_VERSION = "0.3.0"
16
+ GEM_VERSION = "0.3.1"
13
17
  AUTHOR = "Jonas Nicklas"
14
18
  EMAIL = "jonas.nicklas@gmail.com"
15
19
  HOMEPAGE = "http://www.example.com"
@@ -82,13 +86,18 @@ Spec::Rake::SpecTask.new('spec') do |t|
82
86
  t.spec_files = file_list
83
87
  end
84
88
 
89
+ RCov::VerifyTask.new(:verify_coverage => "spec:rcov") do |t|
90
+ t.threshold = 95.64
91
+ t.index_html = 'doc/coverage/index.html'
92
+ end
93
+
85
94
  namespace :spec do
86
95
  desc "Run all examples with RCov"
87
96
  Spec::Rake::SpecTask.new('rcov') do |t|
88
97
  t.spec_files = file_list
89
98
  t.rcov = true
90
99
  t.rcov_dir = "doc/coverage"
91
- t.rcov_opts = ['--exclude', 'spec']
100
+ t.rcov_opts = ['--exclude', 'spec,features,lib/generators,gems/*']
92
101
  end
93
102
 
94
103
  desc "Generate an html report"
@@ -100,7 +109,7 @@ namespace :spec do
100
109
 
101
110
  end
102
111
 
103
- desc 'Default: run unit tests.'
104
- task :default => 'spec'
105
-
106
112
  task :superspec => [:spec, :features]
113
+
114
+ desc 'Default: run unit tests and features.'
115
+ task :default => 'superspec'
@@ -1,29 +1,3 @@
1
- # This file contains code taken from Paperclip
2
- #
3
- # LICENSE
4
- #
5
- # The MIT License
6
- #
7
- # Copyright (c) 2008 Jon Yurek and thoughtbot, inc.
8
- #
9
- # Permission is hereby granted, free of charge, to any person obtaining a copy
10
- # of this software and associated documentation files (the "Software"), to deal
11
- # in the Software without restriction, including without limitation the rights
12
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
- # copies of the Software, and to permit persons to whom the Software is
14
- # furnished to do so, subject to the following conditions:
15
- #
16
- # The above copyright notice and this permission notice shall be included in
17
- # all copies or substantial portions of the Software.
18
- #
19
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
- # THE SOFTWARE.
26
-
27
1
  module CarrierWave
28
2
  module Compatibility
29
3
 
@@ -41,6 +15,34 @@ module CarrierWave
41
15
  # end
42
16
  # end
43
17
  #
18
+ # ---
19
+ #
20
+ # This file contains code taken from Paperclip
21
+ #
22
+ # LICENSE
23
+ #
24
+ # The MIT License
25
+ #
26
+ # Copyright (c) 2008 Jon Yurek and thoughtbot, inc.
27
+ #
28
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
29
+ # of this software and associated documentation files (the "Software"), to deal
30
+ # in the Software without restriction, including without limitation the rights
31
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
32
+ # copies of the Software, and to permit persons to whom the Software is
33
+ # furnished to do so, subject to the following conditions:
34
+ #
35
+ # The above copyright notice and this permission notice shall be included in
36
+ # all copies or substantial portions of the Software.
37
+ #
38
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
39
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
40
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
41
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
42
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
43
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
44
+ # THE SOFTWARE.
45
+ #
44
46
  module Paperclip
45
47
 
46
48
  def store_path(for_file=filename)
@@ -19,6 +19,9 @@ module CarrierWave
19
19
  #
20
20
  def uploaders
21
21
  @uploaders ||= {}
22
+ @uploaders = superclass.uploaders.merge(@uploaders)
23
+ rescue NoMethodError
24
+ @uploaders
22
25
  end
23
26
 
24
27
  ##
@@ -28,6 +31,9 @@ module CarrierWave
28
31
  #
29
32
  def uploader_options
30
33
  @uploader_options ||= {}
34
+ @uploader_options = superclass.uploader_options.merge(@uploader_options)
35
+ rescue NoMethodError
36
+ @uploader_options
31
37
  end
32
38
 
33
39
  ##
@@ -247,7 +253,7 @@ module CarrierWave
247
253
  def write_identifier
248
254
  if remove?
249
255
  record.write_uploader(serialization_column, '')
250
- else
256
+ elsif not uploader.identifier.blank?
251
257
  record.write_uploader(serialization_column, uploader.identifier)
252
258
  end
253
259
  end
@@ -17,17 +17,9 @@ module CarrierWave
17
17
  validates_integrity_of column if uploader_options[column.to_sym][:validate_integrity]
18
18
  validates_processing_of column if uploader_options[column.to_sym][:validate_processing]
19
19
 
20
- after_save do |record|
21
- record.send("store_#{column}!")
22
- end
23
-
24
- before_save do |record|
25
- record.send("write_#{column}_identifier")
26
- end
27
-
28
- after_destroy do |record|
29
- record.send("remove_#{column}!")
30
- end
20
+ after_save "store_#{column}!"
21
+ before_save "write_#{column}_identifier"
22
+ after_destroy "remove_#{column}!"
31
23
  end
32
24
 
33
25
  ##
@@ -14,17 +14,9 @@ module CarrierWave
14
14
  alias_method :read_uploader, :attribute_get
15
15
  alias_method :write_uploader, :attribute_set
16
16
 
17
- after :save do
18
- send("store_#{column}!")
19
- end
20
-
21
- before :save do
22
- send("write_#{column}_identifier")
23
- end
24
-
25
- after :destroy do
26
- send("remove_#{column}!")
27
- end
17
+ after :save, "store_#{column}!".to_sym
18
+ before :save, "write_#{column}_identifier".to_sym
19
+ after :destroy, "remove_#{column}!".to_sym
28
20
  end
29
21
 
30
22
  end # DataMapper
@@ -11,17 +11,9 @@ module CarrierWave
11
11
  alias_method :read_uploader, :[]
12
12
  alias_method :write_uploader, :[]=
13
13
 
14
- after_save do
15
- send("store_#{column}!")
16
- end
17
-
18
- before_save do
19
- send("write_#{column}_identifier")
20
- end
21
-
22
- before_destroy do
23
- send("remove_#{column}!")
24
- end
14
+ after_save "store_#{column}!"
15
+ before_save "write_#{column}_identifier"
16
+ before_destroy "remove_#{column}!"
25
17
  end
26
18
 
27
19
  # Determine if we're using Sequel > 2.12
@@ -29,7 +21,7 @@ module CarrierWave
29
21
  # ==== Returns
30
22
  # Bool:: True if Sequel 2.12 or higher False otherwise
31
23
  def self.new_sequel?
32
- !!(/^(2.12|3)/ =~ ::Sequel.version)
24
+ ::Sequel::Model.respond_to?(:plugin)
33
25
  end
34
26
 
35
27
  end # Sequel
@@ -19,10 +19,10 @@ module CarrierWave
19
19
  uploader.filename
20
20
  end
21
21
 
22
- def store!
22
+ def store!(file)
23
23
  end
24
24
 
25
- def retrieve!
25
+ def retrieve!(identifier)
26
26
  end
27
27
 
28
28
  end # Abstract
@@ -87,8 +87,20 @@ module CarrierWave
87
87
  ["http://s3.amazonaws.com", bucket, @path].compact.join('/')
88
88
  end
89
89
 
90
+ def respond_to?(*args)
91
+ super || s3_object.respond_to?(*args)
92
+ end
93
+
90
94
  private
91
95
 
96
+ def method_missing(*args, &block)
97
+ s3_object.send(*args, &block)
98
+ end
99
+
100
+ def s3_object
101
+ @s3_object ||= AWS::S3::S3Object.find(@path, bucket)
102
+ end
103
+
92
104
  def bucket
93
105
  CarrierWave::Storage::S3.bucket
94
106
  end
@@ -141,7 +153,7 @@ module CarrierWave
141
153
  #
142
154
  def store!(file)
143
155
  AWS::S3::S3Object.store(::File.join(uploader.store_path), file.read, self.class.bucket, :access => self.class.access)
144
- CarrierWave::Storage::S3::File.new(uploader.store_dir, uploader.filename)
156
+ CarrierWave::Storage::S3::File.new(uploader.store_path, uploader.filename)
145
157
  end
146
158
 
147
159
  # Do something to retrieve the file
@@ -7,31 +7,31 @@ module CarrierWave
7
7
  end
8
8
 
9
9
  def with_callbacks(kind, *args)
10
- self.class._before_callback(kind).each { |callback| self.send(callback, *args) }
10
+ self.class._before_callbacks_for(kind).each { |callback| self.send(callback, *args) }
11
11
  yield
12
- self.class._after_callback(kind).each { |callback| self.send(callback, *args) }
12
+ self.class._after_callbacks_for(kind).each { |callback| self.send(callback, *args) }
13
13
  end
14
14
 
15
15
  module ClassMethods
16
16
 
17
- def _before_callback(kind) #:nodoc:
17
+ def _before_callbacks_for(kind) #:nodoc:
18
18
  self._before_callbacks ||= {}
19
19
  self._before_callbacks[kind] ||= []
20
20
  self._before_callbacks[kind]
21
21
  end
22
22
 
23
- def _after_callback(kind) #:nodoc:
23
+ def _after_callbacks_for(kind) #:nodoc:
24
24
  self._after_callbacks ||= {}
25
25
  self._after_callbacks[kind] ||= []
26
26
  self._after_callbacks[kind]
27
27
  end
28
28
 
29
29
  def before(kind, callback)
30
- _before_callback(kind) << callback
30
+ _before_callbacks_for(kind) << callback
31
31
  end
32
32
 
33
33
  def after(kind, callback)
34
- _after_callback(kind) << callback
34
+ _after_callbacks_for(kind) << callback
35
35
  end
36
36
  end # ClassMethods
37
37
 
data/spec/mount_spec.rb CHANGED
@@ -34,6 +34,14 @@ describe CarrierWave::Mount do
34
34
  @instance.image.should be_an_instance_of(@uploader)
35
35
  end
36
36
 
37
+ it "should inherit uploaders to subclasses" do
38
+ @subclass = Class.new(@class)
39
+ @subclass_instance = @subclass.new
40
+ @subclass_instance.image_uploader.should be_an_instance_of(@uploader)
41
+ @subclass_instance.image = stub_file('test.jpg')
42
+ @subclass_instance.image.should be_an_instance_of(@uploader)
43
+ end
44
+
37
45
  describe '#image_uploader' do
38
46
  it "should return the uploader" do
39
47
  @instance.image_uploader.should be_an_instance_of(@uploader)
@@ -16,6 +16,7 @@ class TestMigration < ActiveRecord::Migration
16
16
  create_table :events, :force => true do |t|
17
17
  t.column :image, :string
18
18
  t.column :textfile, :string
19
+ t.column :foo, :string
19
20
  end
20
21
  end
21
22
 
@@ -156,6 +157,15 @@ describe CarrierWave::ActiveRecord do
156
157
  @event[:image].should == 'test.jpeg'
157
158
  end
158
159
 
160
+ it "should preserve the image when nothing is assigned" do
161
+ @event.image = stub_file('test.jpeg')
162
+ @event.save.should be_true
163
+ @event = @class.find(@event.id)
164
+ @event.foo = "bar"
165
+ @event.save.should be_true
166
+ @event[:image].should == 'test.jpeg'
167
+ end
168
+
159
169
  it "should remove the image if remove_image? returns true" do
160
170
  @event.image = stub_file('test.jpeg')
161
171
  @event.save!
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carrierwave
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Nicklas
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-20 00:00:00 +02:00
12
+ date: 2009-07-01 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies: []
15
15