lib/dm-paperclip/validations.rb in dm-paperclip-2.4.1 vs lib/dm-paperclip/validations.rb in dm-paperclip-2.5.0
- old
+ new
@@ -8,92 +8,81 @@
# * +in+: a Range of bytes (i.e. +1..1.megabyte+),
# * +less_than+: equivalent to :in => 0..options[:less_than]
# * +greater_than+: equivalent to :in => options[:greater_than]..Infinity
# * +message+: error message to display, use :min and :max as replacements
def validates_attachment_size(*fields)
- opts = opts_from_validator_args(fields)
- add_validator_to_context(opts, fields, Paperclip::Validate::SizeValidator)
+ validators.add(Paperclip::Validate::SizeValidator, *fields)
end
# Adds errors if thumbnail creation fails. The same as specifying :whiny_thumbnails => true.
def validates_attachment_thumbnails name, options = {}
self.attachment_definitions[name][:whiny_thumbnails] = true
end
# Places ActiveRecord-style validations on the presence of a file.
def validates_attachment_presence(*fields)
- opts = opts_from_validator_args(fields)
- add_validator_to_context(opts, fields, Paperclip::Validate::RequiredFieldValidator)
+ validators.add(Paperclip::Validate::RequiredFieldValidator, *fields)
end
# Places ActiveRecord-style validations on the content type of the file assigned. The
# possible options are:
# * +content_type+: Allowed content types. Can be a single content type or an array. Allows all by default.
# * +message+: The message to display when the uploaded file has an invalid content type.
def validates_attachment_content_type(*fields)
- opts = opts_from_validator_args(fields)
- add_validator_to_context(opts, fields, Paperclip::Validate::ContentTypeValidator)
+ validators.add(Paperclip::Validate::ContentTypeValidator, *fields)
end
+ # Places ActiveRecord-style validations on the geometry of the file assigned. The
+ # required options are:
+ # * +height+: a Range of pixels (i.e. 100..300+),
+ # * +width+: a Range of pixels (i.e. 100..300+)
+ def validates_attachment_geometry(*fields)
+ validators.add(Paperclip::Validate::GeometryValidator, *fields)
+ end
end
class SizeValidator < DataMapper::Validate::GenericValidator #:nodoc:
- def initialize(field_name, options={})
- super
- @field_name, @options = field_name, options
- end
-
def call(target)
field_value = target.validation_property_value(:"#{@field_name}_file_size")
return true if field_value.nil?
- @options[:in] = (@options[:greater_than]..(1/0)) unless @options[:greater_than].nil?
+ @options[:in] = (@options[:greater_than]..(1.0/0)) unless @options[:greater_than].nil?
@options[:in] = (0..@options[:less_than]) unless @options[:less_than].nil?
return true if @options[:in].include? field_value.to_i
error_message ||= @options[:message] unless @options[:message].nil?
- error_message ||= "%s must be less than %s bytes".t(Extlib::Inflection.humanize(@field_name), @options[:less_than]) unless @options[:less_than].nil?
- error_message ||= "%s must be greater than %s bytes".t(Extlib::Inflection.humanize(@field_name), @options[:greater_than]) unless @options[:greater_than].nil?
- error_message ||= "%s must be between %s and %s bytes".t(Extlib::Inflection.humanize(@field_name), @options[:in].first, @options[:in].last)
+ error_message ||= sprintf("%s must be less than %s bytes",DataMapper::Inflector.humanize(@field_name), @options[:less_than]) unless @options[:less_than].nil?
+ error_message ||= sprintf("%s must be greater than %s bytes",DataMapper::Inflector.humanize(@field_name), @options[:greater_than]) unless @options[:greater_than].nil?
+ error_message ||= sprintf("%s must be between %s and %s bytes",DataMapper::Inflector.humanize(@field_name), @options[:in].first, @options[:in].last)
add_error(target, error_message , @field_name)
return false
end
end
class RequiredFieldValidator < DataMapper::Validate::GenericValidator #:nodoc:
- def initialize(field_name, options={})
- super
- @field_name, @options = field_name, options
- end
-
def call(target)
field_value = target.validation_property_value(@field_name)
- if field_value.nil? || field_value.original_filename.blank?
- error_message = @options[:message] || "%s must be set".t(Extlib::Inflection.humanize(@field_name))
+ if field_value.nil? || Paperclip::Ext.blank?(field_value.original_filename)
+ error_message = @options[:message] || sprintf("%s must be set",DataMapper::Inflector.humanize(@field_name))
add_error(target, error_message , @field_name)
return false
end
return true
end
end
class ContentTypeValidator < DataMapper::Validate::GenericValidator #:nodoc:
- def initialize(field_name, options={})
- super
- @field_name, @options = field_name, options
- end
-
def call(target)
valid_types = [@options[:content_type]].flatten
field_value = target.validation_property_value(@field_name)
- unless field_value.nil? || field_value.original_filename.blank?
- unless @options[:content_type].blank?
+ unless field_value.nil? || Paperclip::Ext.blank?(field_value.original_filename)
+ unless Paperclip::Ext.blank?(@options[:content_type])
content_type = target.validation_property_value(:"#{@field_name}_content_type")
unless valid_types.any?{|t| t === content_type }
error_message ||= @options[:message] unless @options[:message].nil?
- error_message ||= "%s's content type of '%s' is not a valid content type".t(Extlib::Inflection.humanize(@field_name), content_type)
+ error_message ||= sprintf("%s's content type of '%s' is not a valid content type",DataMapper::Inflector.humanize(@field_name), content_type)
add_error(target, error_message , @field_name)
return false
end
end
end
@@ -101,22 +90,36 @@
return true
end
end
class CopyAttachmentErrors < DataMapper::Validate::GenericValidator #:nodoc:
- def initialize(field_name, options={})
- super
- @field_name, @options = field_name, options
- end
-
def call(target)
field_value = target.validation_property_value(@field_name)
- unless field_value.nil? || field_value.original_filename.blank?
+ unless field_value.nil? || Paperclip::Ext.blank?(field_value.original_filename)
return true if field_value.errors.length == 0
- field_value.errors.each { |message| add_error(target, message, @field_name) }
+ field_value.errors.each do |error, message|
+ [message].flatten.each { |m| add_error(target, m, @field_name) }
+ end
return false
end
return true
+ end
+ end
+
+ class GeometryValidator < DataMapper::Validate::GenericValidator #:nodoc:
+ def call(target)
+ field_value = target.validation_property_value(@field_name)
+ return true if field_value.queued_for_write[:original].nil?
+
+ geometry = Paperclip::Geometry.from_file(field_value.queued_for_write[:original].path)
+
+ return true if @options[:width].include?(geometry.width) && @options[:height].include?(geometry.height)
+
+ error_message ||= sprintf("%s width must be between %s and %s px", DataMapper::Inflector.humanize(@field_name), @options[:width].begin, @options[:width].end) unless @options[:width].include?(geometry.width)
+ error_message ||= sprintf("%s height must be between %s and %s px", DataMapper::Inflector.humanize(@field_name), @options[:height].begin, @options[:height].end) unless@options[:height].include?(geometry.height)
+
+ add_error(target, error_message , @field_name)
+ return false
end
end
end
end