jnicklas-carrierwave 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -1
- data/{README.md → README.rdoc} +63 -78
- data/Rakefile +12 -6
- data/lib/carrierwave/mount.rb +133 -52
- data/lib/carrierwave/orm/activerecord.rb +52 -3
- data/lib/carrierwave/orm/datamapper.rb +5 -2
- data/lib/carrierwave/orm/sequel.rb +23 -0
- data/lib/carrierwave/processing/image_science.rb +3 -3
- data/lib/carrierwave/processing/rmagick.rb +103 -47
- data/lib/carrierwave/sanitized_file.rb +71 -45
- data/lib/carrierwave/storage/abstract.rb +23 -9
- data/lib/carrierwave/storage/file.rb +17 -9
- data/lib/carrierwave/storage/s3.rb +49 -22
- data/lib/carrierwave/test/matchers.rb +112 -0
- data/lib/carrierwave/uploader.rb +231 -112
- data/lib/carrierwave.rb +32 -17
- data/lib/generators/uploader_generator.rb +7 -7
- data/rails_generators/uploader/templates/uploader.rb +9 -1
- data/spec/mount_spec.rb +147 -3
- data/spec/orm/activerecord_spec.rb +24 -3
- data/spec/orm/datamapper_spec.rb +3 -3
- data/spec/orm/sequel_spec.rb +170 -0
- data/spec/sanitized_file_spec.rb +22 -36
- data/spec/spec_helper.rb +44 -80
- data/spec/uploader_spec.rb +86 -22
- metadata +8 -4
data/lib/carrierwave/uploader.rb
CHANGED
@@ -15,39 +15,63 @@ module CarrierWave
|
|
15
15
|
# these are *very* simple (they are only a dozen lines of code), so adding your own should
|
16
16
|
# be trivial.
|
17
17
|
#
|
18
|
-
|
18
|
+
module Uploader
|
19
19
|
|
20
|
-
|
20
|
+
def self.append_features(base) #:nodoc:
|
21
|
+
super
|
22
|
+
base.extend(ClassMethods)
|
23
|
+
end
|
21
24
|
|
25
|
+
##
|
26
|
+
# Generates a unique cache id for use in the caching system
|
27
|
+
#
|
28
|
+
# === Returns
|
29
|
+
#
|
30
|
+
# [String] a cache id in the format YYYYMMDD-HHMM-PID-RND
|
31
|
+
#
|
32
|
+
def self.generate_cache_id
|
33
|
+
Time.now.strftime('%Y%m%d-%H%M') + '-' + Process.pid.to_s + '-' + ("%04d" % rand(9999))
|
34
|
+
end
|
35
|
+
|
36
|
+
module ClassMethods
|
37
|
+
|
22
38
|
##
|
23
|
-
#
|
39
|
+
# Lists processor callbacks declared
|
24
40
|
#
|
25
|
-
#
|
41
|
+
# === Returns
|
42
|
+
#
|
43
|
+
# [Array[Array[Symbol, Array]]] a list of processor callbacks which have been declared for this uploader
|
26
44
|
#
|
27
45
|
def processors
|
28
46
|
@processors ||= []
|
29
47
|
end
|
30
|
-
|
48
|
+
|
31
49
|
##
|
32
50
|
# Adds a processor callback which applies operations as a file is uploaded.
|
33
51
|
# The argument may be the name of any method of the uploader, expressed as a symbol,
|
34
52
|
# or a list of such methods, or a hash where the key is a method and the value is
|
35
53
|
# an array of arguments to call the method with
|
36
54
|
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
55
|
+
# === Parameters
|
56
|
+
#
|
57
|
+
# args (*Symbol, Hash{Symbol => Array[]})
|
58
|
+
#
|
59
|
+
# === Examples
|
60
|
+
#
|
61
|
+
# class MyUploader
|
62
|
+
# include CarrierWave::Uploader
|
63
|
+
#
|
40
64
|
# process :sepiatone, :vignette
|
41
65
|
# process :scale => [200, 200]
|
42
|
-
#
|
66
|
+
#
|
43
67
|
# def sepiatone
|
44
68
|
# ...
|
45
69
|
# end
|
46
|
-
#
|
70
|
+
#
|
47
71
|
# def vignette
|
48
72
|
# ...
|
49
73
|
# end
|
50
|
-
#
|
74
|
+
#
|
51
75
|
# def scale(height, width)
|
52
76
|
# ...
|
53
77
|
# end
|
@@ -64,7 +88,7 @@ module CarrierWave
|
|
64
88
|
end
|
65
89
|
end
|
66
90
|
end
|
67
|
-
|
91
|
+
|
68
92
|
##
|
69
93
|
# Sets the storage engine to be used when storing files with this uploader.
|
70
94
|
# Can be any class that implements a #store!(CarrierWave::SanitizedFile) and a #retrieve!
|
@@ -73,14 +97,21 @@ module CarrierWave
|
|
73
97
|
# to by a symbol, which should be more convenient
|
74
98
|
#
|
75
99
|
# If no argument is given, it will simply return the currently used storage engine.
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
79
|
-
#
|
100
|
+
#
|
101
|
+
# === Parameters
|
102
|
+
#
|
103
|
+
# [storage (Symbol, Class)] The storage engine to use for this uploader
|
104
|
+
#
|
105
|
+
# === Returns
|
106
|
+
#
|
107
|
+
# [Class] the storage engine to be used with this uploader
|
108
|
+
#
|
109
|
+
# === Examples
|
110
|
+
#
|
80
111
|
# storage :file
|
81
112
|
# storage CarrierWave::Storage::File
|
82
113
|
# storage MyCustomStorageEngine
|
83
|
-
#
|
114
|
+
#
|
84
115
|
def storage(storage = nil)
|
85
116
|
if storage.is_a?(Symbol)
|
86
117
|
@storage = get_storage_by_symbol(storage)
|
@@ -101,54 +132,54 @@ module CarrierWave
|
|
101
132
|
end
|
102
133
|
|
103
134
|
alias_method :storage=, :storage
|
104
|
-
|
105
|
-
|
135
|
+
|
136
|
+
def version_names
|
137
|
+
@version_names ||= []
|
138
|
+
end
|
106
139
|
|
107
140
|
##
|
108
141
|
# Adds a new version to this uploader
|
109
142
|
#
|
110
|
-
#
|
111
|
-
#
|
143
|
+
# === Parameters
|
144
|
+
#
|
145
|
+
# [name (#to_sym)] name of the version
|
146
|
+
# [&block (Proc)] a block to eval on this version of the uploader
|
112
147
|
#
|
113
148
|
def version(name, &block)
|
114
149
|
name = name.to_sym
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
150
|
+
unless versions[name]
|
151
|
+
versions[name] = Class.new(self)
|
152
|
+
versions[name].version_names.push(*version_names)
|
153
|
+
versions[name].version_names.push(name)
|
154
|
+
class_eval <<-RUBY
|
155
|
+
def #{name}
|
156
|
+
versions[:#{name}]
|
157
|
+
end
|
158
|
+
RUBY
|
159
|
+
end
|
160
|
+
versions[name].class_eval(&block) if block
|
161
|
+
versions[name]
|
124
162
|
end
|
125
163
|
|
126
164
|
##
|
127
|
-
#
|
165
|
+
# === Returns
|
166
|
+
#
|
167
|
+
# [Hash{Symbol => Class}] a list of versions available for this uploader
|
128
168
|
#
|
129
169
|
def versions
|
130
170
|
@versions ||= {}
|
131
171
|
end
|
132
172
|
|
133
|
-
##
|
134
|
-
# Generates a unique cache id for use in the caching system
|
135
|
-
#
|
136
|
-
# @return [String] a cache if in the format YYYYMMDD-HHMM-PID-RND
|
137
|
-
#
|
138
|
-
def generate_cache_id
|
139
|
-
Time.now.strftime('%Y%m%d-%H%M') + '-' + Process.pid.to_s + '-' + ("%04d" % rand(9999))
|
140
|
-
end
|
141
|
-
|
142
173
|
private
|
143
|
-
|
174
|
+
|
144
175
|
def get_storage_by_symbol(symbol)
|
145
|
-
CarrierWave.config[:storage_engines][symbol]
|
176
|
+
eval(CarrierWave.config[:storage_engines][symbol])
|
146
177
|
end
|
147
|
-
|
148
|
-
end #
|
149
|
-
|
178
|
+
|
179
|
+
end # ClassMethods
|
180
|
+
|
150
181
|
attr_reader :file, :model, :mounted_as
|
151
|
-
|
182
|
+
|
152
183
|
##
|
153
184
|
# If a model is given as the first parameter, it will stored in the uploader, and
|
154
185
|
# available throught +#model+. Likewise, mounted_as stores the name of the column
|
@@ -158,10 +189,16 @@ module CarrierWave
|
|
158
189
|
# If you do not wish to mount your uploaders with the ORM extensions in -more then you
|
159
190
|
# can override this method inside your uploader.
|
160
191
|
#
|
161
|
-
#
|
162
|
-
#
|
163
|
-
#
|
164
|
-
#
|
192
|
+
# === Parameters
|
193
|
+
#
|
194
|
+
# [model (Object)] Any kind of model object
|
195
|
+
# [mounted_as (Symbol)] The name of the column where this uploader is mounted
|
196
|
+
#
|
197
|
+
# === Examples
|
198
|
+
#
|
199
|
+
# class MyUploader
|
200
|
+
# include CarrierWave::Uploader
|
201
|
+
#
|
165
202
|
# def store_dir
|
166
203
|
# File.join('public', 'files', mounted_as, model.permalink)
|
167
204
|
# end
|
@@ -171,14 +208,16 @@ module CarrierWave
|
|
171
208
|
@model = model
|
172
209
|
@mounted_as = mounted_as
|
173
210
|
end
|
174
|
-
|
211
|
+
|
175
212
|
##
|
176
|
-
#
|
213
|
+
# === Returns
|
214
|
+
#
|
215
|
+
# [Boolean] Whether the uploaded file is blank
|
177
216
|
#
|
178
217
|
def blank?
|
179
|
-
!file or file.
|
218
|
+
!file or file.blank?
|
180
219
|
end
|
181
|
-
|
220
|
+
|
182
221
|
##
|
183
222
|
# Apply all process callbacks added through CarrierWave.process
|
184
223
|
#
|
@@ -187,18 +226,24 @@ module CarrierWave
|
|
187
226
|
self.send(method, *args)
|
188
227
|
end
|
189
228
|
end
|
190
|
-
|
229
|
+
|
191
230
|
##
|
192
|
-
#
|
231
|
+
# === Returns
|
232
|
+
#
|
233
|
+
# [String] the path where the file is currently located.
|
193
234
|
#
|
194
235
|
def current_path
|
195
236
|
file.path if file.respond_to?(:path)
|
196
237
|
end
|
197
|
-
|
238
|
+
|
239
|
+
alias_method :path, :current_path
|
240
|
+
|
198
241
|
##
|
199
242
|
# Returns a hash mapping the name of each version of the uploader to an instance of it
|
200
243
|
#
|
201
|
-
#
|
244
|
+
# === Returns
|
245
|
+
#
|
246
|
+
# [Hash{Symbol => CarrierWave::Uploader}] a list of uploader instances
|
202
247
|
#
|
203
248
|
def versions
|
204
249
|
return @versions if @versions
|
@@ -210,7 +255,9 @@ module CarrierWave
|
|
210
255
|
end
|
211
256
|
|
212
257
|
##
|
213
|
-
#
|
258
|
+
# === Returns
|
259
|
+
#
|
260
|
+
# [String] the location where this file is accessible via a url
|
214
261
|
#
|
215
262
|
def url
|
216
263
|
if file.respond_to?(:url) and not file.url.blank?
|
@@ -219,18 +266,31 @@ module CarrierWave
|
|
219
266
|
File.expand_path(current_path).gsub(File.expand_path(public), '')
|
220
267
|
end
|
221
268
|
end
|
222
|
-
|
269
|
+
|
223
270
|
alias_method :to_s, :url
|
224
|
-
|
271
|
+
|
225
272
|
##
|
226
273
|
# Returns a string that uniquely identifies the last stored file
|
227
274
|
#
|
228
|
-
#
|
275
|
+
# === Returns
|
276
|
+
#
|
277
|
+
# [String] uniquely identifies a file
|
229
278
|
#
|
230
279
|
def identifier
|
231
280
|
file.identifier if file.respond_to?(:identifier)
|
232
281
|
end
|
233
|
-
|
282
|
+
|
283
|
+
##
|
284
|
+
# Read the contents of the file
|
285
|
+
#
|
286
|
+
# === Returns
|
287
|
+
#
|
288
|
+
# [String] contents of the file
|
289
|
+
#
|
290
|
+
def read
|
291
|
+
file.read if file.respond_to?(:read)
|
292
|
+
end
|
293
|
+
|
234
294
|
##
|
235
295
|
# Override this in your Uploader to change the filename.
|
236
296
|
#
|
@@ -241,28 +301,36 @@ module CarrierWave
|
|
241
301
|
# Do not use the version_name in the filename, as it will prevent versions from being
|
242
302
|
# loaded correctly.
|
243
303
|
#
|
244
|
-
#
|
304
|
+
# === Returns
|
305
|
+
#
|
306
|
+
# [String] a filename
|
245
307
|
#
|
246
308
|
def filename
|
247
309
|
@filename
|
248
310
|
end
|
249
311
|
|
250
312
|
##
|
251
|
-
#
|
313
|
+
# === Returns
|
314
|
+
#
|
315
|
+
# [String] the name of this version of the uploader
|
252
316
|
#
|
253
317
|
def version_name
|
254
|
-
self.class.
|
318
|
+
self.class.version_names.join('_').to_sym unless self.class.version_names.blank?
|
255
319
|
end
|
256
|
-
|
320
|
+
|
257
321
|
##
|
258
|
-
#
|
322
|
+
# === Returns
|
323
|
+
#
|
324
|
+
# [String] the directory that is the root of the application
|
259
325
|
#
|
260
326
|
def root
|
261
327
|
CarrierWave.config[:root]
|
262
328
|
end
|
263
|
-
|
329
|
+
|
264
330
|
##
|
265
|
-
#
|
331
|
+
# === Returns
|
332
|
+
#
|
333
|
+
# [String] the directory where files will be publically accessible
|
266
334
|
#
|
267
335
|
def public
|
268
336
|
CarrierWave.config[:public]
|
@@ -272,55 +340,73 @@ module CarrierWave
|
|
272
340
|
# Override this method in your uploader to provide a white list of extensions which
|
273
341
|
# are allowed to be uploaded.
|
274
342
|
#
|
275
|
-
#
|
276
|
-
#
|
343
|
+
# === Returns
|
344
|
+
#
|
345
|
+
# [NilClass, Array[String]] a white list of extensions which are allowed to be uploaded
|
346
|
+
#
|
347
|
+
# === Examples
|
348
|
+
#
|
277
349
|
# def extension_white_list
|
278
350
|
# %w(jpg jpeg gif png)
|
279
351
|
# end
|
280
352
|
#
|
281
353
|
def extension_white_list; end
|
282
|
-
|
354
|
+
|
283
355
|
####################
|
284
356
|
## Cache
|
285
357
|
####################
|
286
|
-
|
358
|
+
|
287
359
|
##
|
288
360
|
# Override this in your Uploader to change the directory where files are cached.
|
289
361
|
#
|
290
|
-
#
|
362
|
+
# === Returns
|
363
|
+
#
|
364
|
+
# [String] a directory
|
291
365
|
#
|
292
366
|
def cache_dir
|
293
367
|
CarrierWave.config[:cache_dir]
|
294
368
|
end
|
295
|
-
|
369
|
+
|
296
370
|
##
|
297
371
|
# Returns a String which uniquely identifies the currently cached file for later retrieval
|
298
372
|
#
|
299
|
-
#
|
373
|
+
# === Returns
|
374
|
+
#
|
375
|
+
# [String] a cache name, in the format YYYYMMDD-HHMM-PID-RND/filename.txt
|
300
376
|
#
|
301
377
|
def cache_name
|
302
378
|
File.join(cache_id, [version_name, original_filename].compact.join('_')) if cache_id and original_filename
|
303
379
|
end
|
304
|
-
|
380
|
+
|
305
381
|
##
|
306
382
|
# Caches the given file unless a file has already been cached, stored or retrieved.
|
307
383
|
#
|
308
|
-
#
|
309
|
-
#
|
384
|
+
# === Parameters
|
385
|
+
#
|
386
|
+
# [new_file (File, IOString, Tempfile)] any kind of file object
|
387
|
+
#
|
388
|
+
# === Raises
|
389
|
+
#
|
390
|
+
# [CarrierWave::FormNotMultipart] if the assigned parameter is a string
|
310
391
|
#
|
311
392
|
def cache(new_file)
|
312
393
|
cache!(new_file) unless file
|
313
394
|
end
|
314
|
-
|
395
|
+
|
315
396
|
##
|
316
397
|
# Caches the given file. Calls process! to trigger any process callbacks.
|
317
398
|
#
|
318
|
-
#
|
319
|
-
#
|
399
|
+
# === Parameters
|
400
|
+
#
|
401
|
+
# [new_file (File, IOString, Tempfile)] any kind of file object
|
402
|
+
#
|
403
|
+
# === Raises
|
404
|
+
#
|
405
|
+
# [CarrierWave::FormNotMultipart] if the assigned parameter is a string
|
320
406
|
#
|
321
407
|
def cache!(new_file)
|
322
408
|
new_file = CarrierWave::SanitizedFile.new(new_file)
|
323
|
-
raise CarrierWave::FormNotMultipart if new_file.
|
409
|
+
raise CarrierWave::FormNotMultipart if new_file.is_path?
|
324
410
|
|
325
411
|
unless new_file.empty?
|
326
412
|
if extension_white_list and not extension_white_list.include?(new_file.extension.to_s)
|
@@ -333,8 +419,8 @@ module CarrierWave
|
|
333
419
|
|
334
420
|
@filename = new_file.filename
|
335
421
|
self.original_filename = new_file.filename
|
336
|
-
|
337
|
-
@file = @file.copy_to(cache_path)
|
422
|
+
|
423
|
+
@file = @file.copy_to(cache_path, CarrierWave.config[:permissions])
|
338
424
|
process!
|
339
425
|
|
340
426
|
versions.each do |name, v|
|
@@ -343,23 +429,30 @@ module CarrierWave
|
|
343
429
|
end
|
344
430
|
end
|
345
431
|
end
|
346
|
-
|
432
|
+
|
347
433
|
##
|
348
434
|
# Retrieves the file with the given cache_name from the cache, unless a file has
|
349
435
|
# already been cached, stored or retrieved.
|
350
436
|
#
|
351
|
-
#
|
437
|
+
# === Parameters
|
438
|
+
#
|
439
|
+
# [cache_name (String)] uniquely identifies a cache file
|
352
440
|
#
|
353
441
|
def retrieve_from_cache(cache_name)
|
354
442
|
retrieve_from_cache!(cache_name) unless file
|
355
443
|
rescue CarrierWave::InvalidParameter
|
356
444
|
end
|
357
|
-
|
445
|
+
|
358
446
|
##
|
359
447
|
# Retrieves the file with the given cache_name from the cache.
|
360
448
|
#
|
361
|
-
#
|
362
|
-
#
|
449
|
+
# === Parameters
|
450
|
+
#
|
451
|
+
# [cache_name (String)] uniquely identifies a cache file
|
452
|
+
#
|
453
|
+
# === Raises
|
454
|
+
#
|
455
|
+
# [CarrierWave::InvalidParameter] if the cache_name is incorrectly formatted.
|
363
456
|
#
|
364
457
|
def retrieve_from_cache!(cache_name)
|
365
458
|
self.cache_id, self.original_filename = cache_name.split('/', 2)
|
@@ -367,22 +460,40 @@ module CarrierWave
|
|
367
460
|
@file = CarrierWave::SanitizedFile.new(cache_path)
|
368
461
|
versions.each { |name, v| v.retrieve_from_cache!(cache_name) }
|
369
462
|
end
|
370
|
-
|
463
|
+
|
371
464
|
####################
|
372
465
|
## STORE
|
373
466
|
####################
|
374
|
-
|
467
|
+
|
375
468
|
##
|
376
469
|
# Override this in your Uploader to change the directory where the file backend stores files.
|
377
470
|
#
|
378
471
|
# Other backends may or may not use this method, depending on their specific needs.
|
379
472
|
#
|
380
|
-
#
|
473
|
+
# === Returns
|
474
|
+
#
|
475
|
+
# [String] a directory
|
381
476
|
#
|
382
477
|
def store_dir
|
383
|
-
|
478
|
+
CarrierWave.config[:store_dir]
|
384
479
|
end
|
385
|
-
|
480
|
+
|
481
|
+
##
|
482
|
+
# Calculates the path where the file should be stored. If +for_file+ is given, it will be
|
483
|
+
# used as the filename, otherwise +CarrierWave::Uploader#filename+ is assumed.
|
484
|
+
#
|
485
|
+
# === Parameters
|
486
|
+
#
|
487
|
+
# [for_file (String)] name of the file <optional>
|
488
|
+
#
|
489
|
+
# === Returns
|
490
|
+
#
|
491
|
+
# [String] the store path
|
492
|
+
#
|
493
|
+
def store_path(for_file=filename)
|
494
|
+
File.join(store_dir, [version_name, for_file].compact.join('_'))
|
495
|
+
end
|
496
|
+
|
386
497
|
##
|
387
498
|
# Stores the file by passing it to this Uploader's storage engine, unless a file has
|
388
499
|
# already been cached, stored or retrieved.
|
@@ -390,18 +501,22 @@ module CarrierWave
|
|
390
501
|
# If CarrierWave.config[:use_cache] is true, it will first cache the file
|
391
502
|
# and apply any process callbacks before uploading it.
|
392
503
|
#
|
393
|
-
#
|
504
|
+
# === Parameters
|
505
|
+
#
|
506
|
+
# [new_file (File, IOString, Tempfile)] any kind of file object
|
394
507
|
#
|
395
508
|
def store(new_file)
|
396
509
|
store!(new_file) unless file
|
397
510
|
end
|
398
|
-
|
511
|
+
|
399
512
|
##
|
400
513
|
# Stores the file by passing it to this Uploader's storage engine.
|
401
514
|
#
|
402
515
|
# If new_file is omitted, a previously cached file will be stored.
|
403
516
|
#
|
404
|
-
#
|
517
|
+
# === Parameters
|
518
|
+
#
|
519
|
+
# [new_file (File, IOString, Tempfile)] any kind of file object
|
405
520
|
#
|
406
521
|
def store!(new_file=nil)
|
407
522
|
cache!(new_file) if new_file
|
@@ -411,49 +526,53 @@ module CarrierWave
|
|
411
526
|
versions.each { |name, v| v.store!(new_file) }
|
412
527
|
end
|
413
528
|
end
|
414
|
-
|
529
|
+
|
415
530
|
##
|
416
531
|
# Retrieves the file from the storage, unless a file has
|
417
532
|
# already been cached, stored or retrieved.
|
418
|
-
#
|
419
|
-
#
|
533
|
+
#
|
534
|
+
# === Parameters
|
535
|
+
#
|
536
|
+
# [identifier (String)] uniquely identifies the file to retrieve
|
420
537
|
#
|
421
538
|
def retrieve_from_store(identifier)
|
422
539
|
retrieve_from_store!(identifier) unless file
|
423
540
|
rescue CarrierWave::InvalidParameter
|
424
541
|
end
|
425
|
-
|
542
|
+
|
426
543
|
##
|
427
544
|
# Retrieves the file from the storage.
|
428
|
-
#
|
429
|
-
#
|
545
|
+
#
|
546
|
+
# === Parameters
|
547
|
+
#
|
548
|
+
# [identifier (String)] uniquely identifies the file to retrieve
|
430
549
|
#
|
431
550
|
def retrieve_from_store!(identifier)
|
432
551
|
@file = storage.retrieve!(self, identifier)
|
433
552
|
versions.each { |name, v| v.retrieve_from_store!(identifier) }
|
434
553
|
end
|
435
|
-
|
554
|
+
|
436
555
|
private
|
437
|
-
|
556
|
+
|
438
557
|
def cache_path
|
439
558
|
File.expand_path(File.join(cache_dir, cache_name), public)
|
440
559
|
end
|
441
|
-
|
560
|
+
|
442
561
|
def storage
|
443
562
|
self.class.storage
|
444
563
|
end
|
445
|
-
|
564
|
+
|
446
565
|
attr_reader :cache_id, :original_filename
|
447
566
|
|
448
567
|
def cache_id=(cache_id)
|
449
568
|
raise CarrierWave::InvalidParameter, "invalid cache id" unless cache_id =~ /\A[\d]{8}\-[\d]{4}\-[\d]+\-[\d]{4}\z/
|
450
569
|
@cache_id = cache_id
|
451
570
|
end
|
452
|
-
|
571
|
+
|
453
572
|
def original_filename=(filename)
|
454
573
|
raise CarrierWave::InvalidParameter, "invalid filename" unless filename =~ /\A[a-z0-9\.\-\+_]+\z/i
|
455
574
|
@original_filename = filename
|
456
575
|
end
|
457
|
-
|
576
|
+
|
458
577
|
end # Uploader
|
459
|
-
end # CarrierWave
|
578
|
+
end # CarrierWave
|