carrierwave 0.11.2 → 3.1.2
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.
- checksums.yaml +5 -5
- data/README.md +495 -173
- data/lib/carrierwave/compatibility/paperclip.rb +4 -4
- data/lib/carrierwave/downloader/base.rb +101 -0
- data/lib/carrierwave/downloader/remote_file.rb +68 -0
- data/lib/carrierwave/error.rb +1 -0
- data/lib/carrierwave/locale/en.yml +11 -5
- data/lib/carrierwave/mount.rb +217 -182
- data/lib/carrierwave/mounter.rb +257 -0
- data/lib/carrierwave/orm/activerecord.rb +29 -35
- data/lib/carrierwave/processing/mini_magick.rb +169 -84
- data/lib/carrierwave/processing/rmagick.rb +107 -25
- data/lib/carrierwave/processing/vips.rb +315 -0
- data/lib/carrierwave/processing.rb +1 -1
- data/lib/carrierwave/sanitized_file.rb +105 -87
- data/lib/carrierwave/storage/abstract.rb +16 -3
- data/lib/carrierwave/storage/file.rb +71 -3
- data/lib/carrierwave/storage/fog.rb +228 -57
- data/lib/carrierwave/storage.rb +1 -9
- data/lib/carrierwave/test/matchers.rb +88 -19
- data/lib/carrierwave/uploader/cache.rb +75 -45
- data/lib/carrierwave/uploader/callbacks.rb +1 -3
- data/lib/carrierwave/uploader/configuration.rb +84 -16
- data/lib/carrierwave/uploader/content_type_allowlist.rb +62 -0
- data/lib/carrierwave/uploader/content_type_denylist.rb +62 -0
- data/lib/carrierwave/uploader/default_url.rb +3 -5
- data/lib/carrierwave/uploader/dimension.rb +66 -0
- data/lib/carrierwave/uploader/download.rb +4 -74
- data/lib/carrierwave/uploader/extension_allowlist.rb +63 -0
- data/lib/carrierwave/uploader/extension_denylist.rb +64 -0
- data/lib/carrierwave/uploader/file_size.rb +43 -0
- data/lib/carrierwave/uploader/mountable.rb +13 -8
- data/lib/carrierwave/uploader/processing.rb +51 -13
- data/lib/carrierwave/uploader/proxy.rb +20 -9
- data/lib/carrierwave/uploader/remove.rb +0 -2
- data/lib/carrierwave/uploader/serialization.rb +2 -4
- data/lib/carrierwave/uploader/store.rb +85 -28
- data/lib/carrierwave/uploader/url.rb +8 -7
- data/lib/carrierwave/uploader/versions.rb +175 -125
- data/lib/carrierwave/uploader.rb +12 -10
- data/lib/carrierwave/utilities/file_name.rb +47 -0
- data/lib/carrierwave/utilities/uri.rb +14 -12
- data/lib/carrierwave/utilities.rb +1 -3
- data/lib/carrierwave/validations/active_model.rb +7 -11
- data/lib/carrierwave/version.rb +1 -1
- data/lib/carrierwave.rb +48 -21
- data/lib/generators/templates/{uploader.rb → uploader.rb.erb} +8 -11
- data/lib/generators/uploader_generator.rb +3 -3
- metadata +124 -86
- data/lib/carrierwave/locale/cs.yml +0 -11
- data/lib/carrierwave/locale/de.yml +0 -11
- data/lib/carrierwave/locale/el.yml +0 -11
- data/lib/carrierwave/locale/es.yml +0 -11
- data/lib/carrierwave/locale/fr.yml +0 -11
- data/lib/carrierwave/locale/ja.yml +0 -11
- data/lib/carrierwave/locale/nb.yml +0 -11
- data/lib/carrierwave/locale/nl.yml +0 -11
- data/lib/carrierwave/locale/pl.yml +0 -11
- data/lib/carrierwave/locale/pt-BR.yml +0 -11
- data/lib/carrierwave/locale/pt-PT.yml +0 -11
- data/lib/carrierwave/locale/ru.yml +0 -11
- data/lib/carrierwave/locale/sk.yml +0 -11
- data/lib/carrierwave/locale/tr.yml +0 -11
- data/lib/carrierwave/processing/mime_types.rb +0 -74
- data/lib/carrierwave/uploader/content_type_blacklist.rb +0 -48
- data/lib/carrierwave/uploader/content_type_whitelist.rb +0 -48
- data/lib/carrierwave/uploader/extension_blacklist.rb +0 -47
- data/lib/carrierwave/uploader/extension_whitelist.rb +0 -49
- data/lib/carrierwave/utilities/deprecation.rb +0 -18
@@ -1,26 +1,113 @@
|
|
1
|
-
|
1
|
+
require "active_support/core_ext/object/deep_dup"
|
2
2
|
|
3
3
|
module CarrierWave
|
4
4
|
module Uploader
|
5
5
|
module Versions
|
6
|
+
class Builder
|
7
|
+
def initialize(name)
|
8
|
+
@name = name
|
9
|
+
@options = {}
|
10
|
+
@blocks = []
|
11
|
+
@klass = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def configure(options, &block)
|
15
|
+
@options.merge!(options)
|
16
|
+
@blocks << block if block
|
17
|
+
@klass = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def build(superclass)
|
21
|
+
return @klass if @klass
|
22
|
+
@klass = Class.new(superclass)
|
23
|
+
superclass.const_set("VersionUploader#{@name.to_s.camelize}", @klass)
|
24
|
+
|
25
|
+
@klass.version_names += [@name]
|
26
|
+
@klass.versions = {}
|
27
|
+
@klass.processors = []
|
28
|
+
@klass.version_options = @options
|
29
|
+
@klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
30
|
+
# Define the enable_processing method for versions so they get the
|
31
|
+
# value from the parent class unless explicitly overwritten
|
32
|
+
def self.enable_processing(value=nil)
|
33
|
+
self.enable_processing = value if value
|
34
|
+
if defined?(@enable_processing) && !@enable_processing.nil?
|
35
|
+
@enable_processing
|
36
|
+
else
|
37
|
+
superclass.enable_processing
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Regardless of what is set in the parent uploader, do not enforce the
|
42
|
+
# move_to_cache config option on versions because it moves the original
|
43
|
+
# file to the version's target file.
|
44
|
+
#
|
45
|
+
# If you want to enforce this setting on versions, override this method
|
46
|
+
# in each version:
|
47
|
+
#
|
48
|
+
# version :thumb do
|
49
|
+
# def move_to_cache
|
50
|
+
# true
|
51
|
+
# end
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
def move_to_cache
|
55
|
+
false
|
56
|
+
end
|
57
|
+
|
58
|
+
# Need to rely on the parent version's identifier, as versions don't have its own one.
|
59
|
+
def identifier
|
60
|
+
parent_version.identifier
|
61
|
+
end
|
62
|
+
RUBY
|
63
|
+
@blocks.each { |block| @klass.class_eval(&block) }
|
64
|
+
@klass
|
65
|
+
end
|
66
|
+
|
67
|
+
def deep_dup
|
68
|
+
other = dup
|
69
|
+
other.instance_variable_set(:@blocks, @blocks.dup)
|
70
|
+
other
|
71
|
+
end
|
72
|
+
|
73
|
+
def method_missing(name, *args)
|
74
|
+
super
|
75
|
+
rescue NoMethodError => e
|
76
|
+
raise e.exception <<~ERROR
|
77
|
+
#{e.message}
|
78
|
+
If you're trying to configure a version, do it inside a block like `version(:thumb) { self.#{name} #{args.map(&:inspect).join(', ')} }`.
|
79
|
+
ERROR
|
80
|
+
end
|
81
|
+
|
82
|
+
def respond_to_missing?(*)
|
83
|
+
super
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
6
87
|
extend ActiveSupport::Concern
|
7
88
|
|
8
89
|
include CarrierWave::Uploader::Callbacks
|
9
90
|
|
10
91
|
included do
|
11
|
-
class_attribute :versions, :version_names, :instance_reader => false, :instance_writer => false
|
92
|
+
class_attribute :versions, :version_names, :version_options, :instance_reader => false, :instance_writer => false
|
12
93
|
|
13
94
|
self.versions = {}
|
14
95
|
self.version_names = []
|
15
96
|
|
16
|
-
attr_accessor :
|
97
|
+
attr_accessor :parent_version
|
17
98
|
|
18
|
-
after :cache, :assign_parent_cache_id
|
19
99
|
after :cache, :cache_versions!
|
20
100
|
after :store, :store_versions!
|
21
101
|
after :remove, :remove_versions!
|
22
102
|
after :retrieve_from_cache, :retrieve_versions_from_cache!
|
23
103
|
after :retrieve_from_store, :retrieve_versions_from_store!
|
104
|
+
|
105
|
+
prepend Module.new {
|
106
|
+
def initialize(*)
|
107
|
+
super
|
108
|
+
@versions = nil
|
109
|
+
end
|
110
|
+
}
|
24
111
|
end
|
25
112
|
|
26
113
|
module ClassMethods
|
@@ -46,78 +133,33 @@ module CarrierWave
|
|
46
133
|
# process :scale => [200, 200]
|
47
134
|
# end
|
48
135
|
#
|
136
|
+
# version :square, :unless => :invalid_image_type? do
|
137
|
+
# process :scale => [100, 100]
|
138
|
+
# end
|
139
|
+
#
|
49
140
|
# end
|
50
141
|
#
|
51
142
|
def version(name, options = {}, &block)
|
52
143
|
name = name.to_sym
|
53
|
-
|
54
|
-
|
55
|
-
versions[name][:uploader].class_eval(&block) if block
|
56
|
-
versions[name]
|
57
|
-
end
|
58
|
-
|
59
|
-
def recursively_apply_block_to_versions(&block)
|
60
|
-
versions.each do |name, version|
|
61
|
-
version[:uploader].class_eval(&block)
|
62
|
-
version[:uploader].recursively_apply_block_to_versions(&block)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
def build_version(name, options)
|
69
|
-
uploader = Class.new(self)
|
70
|
-
const_set("Uploader#{uploader.object_id}".gsub('-', '_'), uploader)
|
71
|
-
uploader.version_names += [name]
|
72
|
-
uploader.versions = {}
|
73
|
-
uploader.processors = []
|
74
|
-
|
75
|
-
uploader.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
76
|
-
# Define the enable_processing method for versions so they get the
|
77
|
-
# value from the parent class unless explicitly overwritten
|
78
|
-
def self.enable_processing(value=nil)
|
79
|
-
self.enable_processing = value if value
|
80
|
-
if !@enable_processing.nil?
|
81
|
-
@enable_processing
|
82
|
-
else
|
83
|
-
superclass.enable_processing
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
# Regardless of what is set in the parent uploader, do not enforce the
|
88
|
-
# move_to_cache config option on versions because it moves the original
|
89
|
-
# file to the version's target file.
|
90
|
-
#
|
91
|
-
# If you want to enforce this setting on versions, override this method
|
92
|
-
# in each version:
|
93
|
-
#
|
94
|
-
# version :thumb do
|
95
|
-
# def move_to_cache
|
96
|
-
# true
|
97
|
-
# end
|
98
|
-
# end
|
99
|
-
#
|
100
|
-
def move_to_cache
|
101
|
-
false
|
102
|
-
end
|
103
|
-
RUBY
|
144
|
+
versions[name] ||= Builder.new(name)
|
145
|
+
versions[name].configure(options, &block)
|
104
146
|
|
105
|
-
class_eval <<-RUBY
|
147
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
106
148
|
def #{name}
|
107
149
|
versions[:#{name}]
|
108
150
|
end
|
109
151
|
RUBY
|
110
152
|
|
111
|
-
|
112
|
-
current_version = {
|
113
|
-
name => {
|
114
|
-
:uploader => uploader,
|
115
|
-
:options => options
|
116
|
-
}
|
117
|
-
}
|
118
|
-
self.versions = versions.merge(current_version)
|
153
|
+
versions[name]
|
119
154
|
end
|
120
155
|
|
156
|
+
private
|
157
|
+
|
158
|
+
def inherited(subclass)
|
159
|
+
# To prevent subclass version changes affecting superclass versions
|
160
|
+
subclass.versions = versions.deep_dup
|
161
|
+
super
|
162
|
+
end
|
121
163
|
end # ClassMethods
|
122
164
|
|
123
165
|
##
|
@@ -131,7 +173,8 @@ module CarrierWave
|
|
131
173
|
return @versions if @versions
|
132
174
|
@versions = {}
|
133
175
|
self.class.versions.each do |name, version|
|
134
|
-
@versions[name] = version
|
176
|
+
@versions[name] = version.build(self.class).new(model, mounted_as)
|
177
|
+
@versions[name].parent_version = self
|
135
178
|
end
|
136
179
|
@versions
|
137
180
|
end
|
@@ -153,24 +196,45 @@ module CarrierWave
|
|
153
196
|
#
|
154
197
|
# === Returns
|
155
198
|
#
|
156
|
-
# [Boolean] True when the version
|
199
|
+
# [Boolean] True when the version satisfy its :if or :unless condition
|
157
200
|
#
|
158
|
-
def
|
201
|
+
def version_active?(name)
|
159
202
|
name = name.to_sym
|
160
203
|
|
161
|
-
return false unless
|
204
|
+
return false unless versions.has_key?(name)
|
205
|
+
|
206
|
+
if_condition = versions[name].class.version_options[:if]
|
207
|
+
unless_condition = versions[name].class.version_options[:unless]
|
162
208
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
209
|
+
if if_condition
|
210
|
+
if if_condition.respond_to?(:call)
|
211
|
+
if_condition.call(self, :version => name, :file => file)
|
212
|
+
else
|
213
|
+
send(if_condition, file)
|
214
|
+
end
|
215
|
+
elsif unless_condition
|
216
|
+
if unless_condition.respond_to?(:call)
|
217
|
+
!unless_condition.call(self, :version => name, :file => file)
|
167
218
|
else
|
168
|
-
send(
|
219
|
+
!send(unless_condition, file)
|
169
220
|
end
|
170
221
|
else
|
171
222
|
true
|
172
223
|
end
|
173
224
|
end
|
225
|
+
alias_method :version_exists?, :version_active?
|
226
|
+
CarrierWave.deprecator.deprecate_methods(self, version_exists?: :version_active?)
|
227
|
+
|
228
|
+
##
|
229
|
+
# Copies the parent's cache_id when caching a version file.
|
230
|
+
# This behavior is not essential but it makes easier to understand
|
231
|
+
# that the cached files are generated by the single upload attempt.
|
232
|
+
#
|
233
|
+
def cache!(*args)
|
234
|
+
self.cache_id = parent_version.cache_id if parent_version
|
235
|
+
|
236
|
+
super
|
237
|
+
end
|
174
238
|
|
175
239
|
##
|
176
240
|
# When given a version name as a parameter, will return the url for that version
|
@@ -212,35 +276,49 @@ module CarrierWave
|
|
212
276
|
# Recreate versions and reprocess them. This can be used to recreate
|
213
277
|
# versions if their parameters somehow have changed.
|
214
278
|
#
|
215
|
-
def recreate_versions!(*
|
216
|
-
#
|
217
|
-
#
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
if versions.any?
|
223
|
-
file = sanitized_file if !cached?
|
224
|
-
store_versions!(file, versions)
|
225
|
-
else
|
226
|
-
cache! if !cached?
|
227
|
-
store!
|
279
|
+
def recreate_versions!(*names)
|
280
|
+
# As well as specified versions, we need to reprocess versions
|
281
|
+
# that are the source of another version.
|
282
|
+
|
283
|
+
self.cache_id = CarrierWave.generate_cache_id
|
284
|
+
derived_versions.each_value do |v|
|
285
|
+
v.cache!(file) if names.empty? || !(v.descendant_version_names & names).empty?
|
228
286
|
end
|
287
|
+
active_versions.each do |name, v|
|
288
|
+
v.store! if names.empty? || names.include?(name)
|
289
|
+
end
|
290
|
+
ensure
|
291
|
+
@cache_id = nil
|
229
292
|
end
|
230
293
|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
294
|
+
protected
|
295
|
+
|
296
|
+
def descendant_version_names
|
297
|
+
[version_name] + derived_versions.flat_map do |name, version|
|
298
|
+
version.descendant_version_names
|
235
299
|
end
|
236
300
|
end
|
237
301
|
|
238
302
|
def active_versions
|
239
303
|
versions.select do |name, uploader|
|
240
|
-
|
304
|
+
version_active?(name)
|
241
305
|
end
|
242
306
|
end
|
243
307
|
|
308
|
+
private
|
309
|
+
|
310
|
+
def derived_versions
|
311
|
+
active_versions.reject do |name, v|
|
312
|
+
v.class.version_options[:from_version]
|
313
|
+
end.merge(active_sibling_versions.select do |name, v|
|
314
|
+
v.class.version_options[:from_version] == self.class.version_names.last
|
315
|
+
end)
|
316
|
+
end
|
317
|
+
|
318
|
+
def active_sibling_versions
|
319
|
+
parent_version&.active_versions || {}
|
320
|
+
end
|
321
|
+
|
244
322
|
def full_filename(for_file)
|
245
323
|
[version_name, super(for_file)].compact.join('_')
|
246
324
|
end
|
@@ -250,51 +328,23 @@ module CarrierWave
|
|
250
328
|
end
|
251
329
|
|
252
330
|
def cache_versions!(new_file)
|
253
|
-
|
254
|
-
# initialized, so get the actual file based off of the current state of
|
255
|
-
# our file
|
256
|
-
processed_parent = SanitizedFile.new :tempfile => self.file,
|
257
|
-
:filename => new_file.original_filename
|
258
|
-
|
259
|
-
active_versions.each do |name, v|
|
260
|
-
next if v.cached?
|
261
|
-
|
262
|
-
v.send(:cache_id=, cache_id)
|
263
|
-
# If option :from_version is present, create cache using cached file from
|
264
|
-
# version indicated
|
265
|
-
if self.class.versions[name][:options] && self.class.versions[name][:options][:from_version]
|
266
|
-
# Maybe the reference version has not been cached yet
|
267
|
-
unless versions[self.class.versions[name][:options][:from_version]].cached?
|
268
|
-
versions[self.class.versions[name][:options][:from_version]].cache!(processed_parent)
|
269
|
-
end
|
270
|
-
processed_version = SanitizedFile.new :tempfile => versions[self.class.versions[name][:options][:from_version]],
|
271
|
-
:filename => new_file.original_filename
|
272
|
-
v.cache!(processed_version)
|
273
|
-
else
|
274
|
-
v.cache!(processed_parent)
|
275
|
-
end
|
276
|
-
end
|
331
|
+
derived_versions.each_value { |v| v.cache!(new_file) }
|
277
332
|
end
|
278
333
|
|
279
|
-
def store_versions!(new_file
|
280
|
-
|
281
|
-
active = Hash[active_versions]
|
282
|
-
versions.each { |v| active[v].try(:store!, new_file) } unless active.empty?
|
283
|
-
else
|
284
|
-
active_versions.each { |name, v| v.store!(new_file) }
|
285
|
-
end
|
334
|
+
def store_versions!(new_file)
|
335
|
+
active_versions.each_value { |v| v.store!(new_file) }
|
286
336
|
end
|
287
337
|
|
288
338
|
def remove_versions!
|
289
|
-
versions.
|
339
|
+
versions.each_value { |v| v.remove! }
|
290
340
|
end
|
291
341
|
|
292
342
|
def retrieve_versions_from_cache!(cache_name)
|
293
|
-
|
343
|
+
active_versions.each_value { |v| v.retrieve_from_cache!(cache_name) }
|
294
344
|
end
|
295
345
|
|
296
346
|
def retrieve_versions_from_store!(identifier)
|
297
|
-
|
347
|
+
active_versions.each_value { |v| v.retrieve_from_store!(identifier) }
|
298
348
|
end
|
299
349
|
|
300
350
|
end # Versions
|
data/lib/carrierwave/uploader.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
require "carrierwave/uploader/configuration"
|
4
2
|
require "carrierwave/uploader/callbacks"
|
5
3
|
require "carrierwave/uploader/proxy"
|
@@ -9,10 +7,12 @@ require "carrierwave/uploader/cache"
|
|
9
7
|
require "carrierwave/uploader/store"
|
10
8
|
require "carrierwave/uploader/download"
|
11
9
|
require "carrierwave/uploader/remove"
|
12
|
-
require "carrierwave/uploader/
|
13
|
-
require "carrierwave/uploader/
|
14
|
-
require "carrierwave/uploader/
|
15
|
-
require "carrierwave/uploader/
|
10
|
+
require "carrierwave/uploader/extension_allowlist"
|
11
|
+
require "carrierwave/uploader/extension_denylist"
|
12
|
+
require "carrierwave/uploader/content_type_allowlist"
|
13
|
+
require "carrierwave/uploader/content_type_denylist"
|
14
|
+
require "carrierwave/uploader/file_size"
|
15
|
+
require "carrierwave/uploader/dimension"
|
16
16
|
require "carrierwave/uploader/processing"
|
17
17
|
require "carrierwave/uploader/versions"
|
18
18
|
require "carrierwave/uploader/default_url"
|
@@ -53,10 +53,12 @@ module CarrierWave
|
|
53
53
|
include CarrierWave::Uploader::Store
|
54
54
|
include CarrierWave::Uploader::Download
|
55
55
|
include CarrierWave::Uploader::Remove
|
56
|
-
include CarrierWave::Uploader::
|
57
|
-
include CarrierWave::Uploader::
|
58
|
-
include CarrierWave::Uploader::
|
59
|
-
include CarrierWave::Uploader::
|
56
|
+
include CarrierWave::Uploader::ExtensionAllowlist
|
57
|
+
include CarrierWave::Uploader::ExtensionDenylist
|
58
|
+
include CarrierWave::Uploader::ContentTypeAllowlist
|
59
|
+
include CarrierWave::Uploader::ContentTypeDenylist
|
60
|
+
include CarrierWave::Uploader::FileSize
|
61
|
+
include CarrierWave::Uploader::Dimension
|
60
62
|
include CarrierWave::Uploader::Processing
|
61
63
|
include CarrierWave::Uploader::Versions
|
62
64
|
include CarrierWave::Uploader::DefaultUrl
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module CarrierWave
|
2
|
+
module Utilities
|
3
|
+
module FileName
|
4
|
+
|
5
|
+
##
|
6
|
+
# Returns the part of the filename before the extension. So if a file is called 'test.jpeg'
|
7
|
+
# this would return 'test'
|
8
|
+
#
|
9
|
+
# === Returns
|
10
|
+
#
|
11
|
+
# [String] the first part of the filename
|
12
|
+
#
|
13
|
+
def basename
|
14
|
+
split_extension(filename)[0] if filename
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# Returns the file extension
|
19
|
+
#
|
20
|
+
# === Returns
|
21
|
+
#
|
22
|
+
# [String] extension of file or "" if the file has no extension
|
23
|
+
#
|
24
|
+
def extension
|
25
|
+
split_extension(filename)[1] if filename
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def split_extension(filename)
|
31
|
+
# regular expressions to try for identifying extensions
|
32
|
+
extension_matchers = [
|
33
|
+
/\A(.+)\.(tar\.([glx]?z|bz2))\z/, # matches "something.tar.gz"
|
34
|
+
/\A(.+)\.([^\.]+)\z/ # matches "something.jpg"
|
35
|
+
]
|
36
|
+
|
37
|
+
extension_matchers.each do |regexp|
|
38
|
+
if filename =~ regexp
|
39
|
+
return $1, $2
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
[filename, ""] # In case we weren't able to split the extension
|
44
|
+
end
|
45
|
+
end # FileName
|
46
|
+
end # Utilities
|
47
|
+
end # CarrierWave
|
@@ -1,23 +1,25 @@
|
|
1
|
-
|
1
|
+
require 'uri'
|
2
2
|
|
3
3
|
module CarrierWave
|
4
4
|
module Utilities
|
5
5
|
module Uri
|
6
|
+
# based on Ruby < 2.0's URI.encode
|
7
|
+
PATH_SAFE = URI::RFC2396_REGEXP::PATTERN::UNRESERVED + '\/'
|
8
|
+
PATH_UNSAFE = Regexp.new("[^#{PATH_SAFE}]", false)
|
9
|
+
NON_ASCII = /[^[:ascii:]]/.freeze
|
6
10
|
|
7
11
|
private
|
12
|
+
|
8
13
|
def encode_path(path)
|
9
|
-
|
10
|
-
|
11
|
-
|
14
|
+
URI::DEFAULT_PARSER.escape(path, PATH_UNSAFE)
|
15
|
+
end
|
16
|
+
|
17
|
+
def encode_non_ascii(str)
|
18
|
+
URI::DEFAULT_PARSER.escape(str, NON_ASCII)
|
19
|
+
end
|
12
20
|
|
13
|
-
|
14
|
-
|
15
|
-
tmp = ''
|
16
|
-
us.each_byte do |uc|
|
17
|
-
tmp << sprintf('%%%02X', uc)
|
18
|
-
end
|
19
|
-
tmp
|
20
|
-
end
|
21
|
+
def decode_uri(str)
|
22
|
+
URI::DEFAULT_PARSER.unescape(str)
|
21
23
|
end
|
22
24
|
end # Uri
|
23
25
|
end # Utilities
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
require 'active_model/validator'
|
4
2
|
require 'active_support/concern'
|
5
3
|
|
@@ -13,9 +11,8 @@ module CarrierWave
|
|
13
11
|
class ProcessingValidator < ::ActiveModel::EachValidator
|
14
12
|
|
15
13
|
def validate_each(record, attribute, value)
|
16
|
-
|
17
|
-
message
|
18
|
-
record.errors.add(attribute, message)
|
14
|
+
record.__send__("#{attribute}_processing_errors").each do |e|
|
15
|
+
record.errors.add(attribute, :carrierwave_processing_error, message: (e.message != e.class.to_s) && e.message)
|
19
16
|
end
|
20
17
|
end
|
21
18
|
end
|
@@ -23,9 +20,8 @@ module CarrierWave
|
|
23
20
|
class IntegrityValidator < ::ActiveModel::EachValidator
|
24
21
|
|
25
22
|
def validate_each(record, attribute, value)
|
26
|
-
|
27
|
-
message
|
28
|
-
record.errors.add(attribute, message)
|
23
|
+
record.__send__("#{attribute}_integrity_errors").each do |e|
|
24
|
+
record.errors.add(attribute, :carrierwave_integrity_error, message: (e.message != e.class.to_s) && e.message)
|
29
25
|
end
|
30
26
|
end
|
31
27
|
end
|
@@ -33,9 +29,8 @@ module CarrierWave
|
|
33
29
|
class DownloadValidator < ::ActiveModel::EachValidator
|
34
30
|
|
35
31
|
def validate_each(record, attribute, value)
|
36
|
-
|
37
|
-
message
|
38
|
-
record.errors.add(attribute, message)
|
32
|
+
record.__send__("#{attribute}_download_errors").each do |e|
|
33
|
+
record.errors.add(attribute, :carrierwave_download_error, message: (e.message != e.class.to_s) && e.message)
|
39
34
|
end
|
40
35
|
end
|
41
36
|
end
|
@@ -60,6 +55,7 @@ module CarrierWave
|
|
60
55
|
def validates_processing_of(*attr_names)
|
61
56
|
validates_with ProcessingValidator, _merge_attributes(attr_names)
|
62
57
|
end
|
58
|
+
|
63
59
|
#
|
64
60
|
##
|
65
61
|
# Makes the record invalid if the remote file couldn't be downloaded
|
data/lib/carrierwave/version.rb
CHANGED