Module: DataMapper::Validate::AutoValidate

Included in:
ClassMethods
Defined in:
lib/dm-validations/auto_validate.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#disable_auto_validationsObject (readonly)

Returns the value of attribute disable_auto_validations.



25
26
27
# File 'lib/dm-validations/auto_validate.rb', line 25

def disable_auto_validations
  @disable_auto_validations
end

Instance Method Details

#auto_generate_validations(property) ⇒ Object

Auto-generate validations for a given property. This will only occur if the option :auto_validation is either true or left undefined.



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/dm-validations/auto_validate.rb', line 85

def auto_generate_validations(property)
  return if disabled_auto_validations? || skip_auto_validation_for?(property)

  # all auto-validations (aside from presence) should skip
  # validation when the value is nil
  opts = { :allow_nil => true }

  if property.options.key?(:validates)
    opts[:context] = property.options[:validates]
  end

  infer_presence_validation_for(property, opts.dup)
  infer_length_validation_for(property, opts.dup)
  infer_format_validation_for(property, opts.dup)
  infer_uniqueness_validation_for(property, opts.dup)
  infer_within_validation_for(property, opts.dup)
  infer_type_validation_for(property, opts.dup)
end

#disabled_auto_validations?TrueClass, FalseClass Also known as: auto_validations_disabled?

Checks whether auto validations are currently disabled (see disable_auto_validations method that takes a block)

Returns:

  • (TrueClass, FalseClass)

    true if auto validation is currently disabled



111
112
113
# File 'lib/dm-validations/auto_validate.rb', line 111

def disabled_auto_validations?
  @disable_auto_validations || false
end

#infer_format_validation_for(property, options) ⇒ Object



144
145
146
147
148
149
150
# File 'lib/dm-validations/auto_validate.rb', line 144

def infer_format_validation_for(property, options)
  return unless property.options.key?(:format)

  options[:with] = property.options[:format]

  validates_format property.name, options_with_message(options, property, :format)
end

#infer_length_validation_for(property, options) ⇒ Object



133
134
135
136
137
138
139
140
141
142
# File 'lib/dm-validations/auto_validate.rb', line 133

def infer_length_validation_for(property, options)
  return unless [ String, DataMapper::Types::Text ].include?(property.type)

  case length = property.options.fetch(:length, DataMapper::Property::DEFAULT_LENGTH)
    when Range then options[:within]  = length
    else            options[:maximum] = length
  end

  validates_length property.name, options_with_message(options, property, :length)
end

#infer_presence_validation_for(property, options) ⇒ Object



127
128
129
130
131
# File 'lib/dm-validations/auto_validate.rb', line 127

def infer_presence_validation_for(property, options)
  return if allow_nil?(property)

  validates_present property.name, options_with_message(options, property, :presence)
end

#infer_type_validation_for(property, options) ⇒ Object



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# File 'lib/dm-validations/auto_validate.rb', line 173

def infer_type_validation_for(property, options)
  options[:gte] = property.min if property.min
  options[:lte] = property.max if property.max

  if Integer == property.type
    options[:integer_only] = true

    validates_is_number property.name, options_with_message(options, property, :is_number)
  elsif BigDecimal == property.type || Float == property.type
    options[:precision] = property.precision
    options[:scale]     = property.scale

    validates_is_number property.name, options_with_message(options, property, :is_number)
  elsif !property.custom?
    # We only need this in the case we don't already
    # have a numeric validator, because otherwise
    # it will cause duplicate validation errors
    validates_is_primitive property.name, options_with_message(options, property, :is_primitive)
  end
end

#infer_uniqueness_validation_for(property, options) ⇒ Object



152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/dm-validations/auto_validate.rb', line 152

def infer_uniqueness_validation_for(property, options)
  return unless property.options.key?(:unique)

  case value = property.options[:unique]
    when Array, Symbol
      options[:scope] = Array(value)

      validates_is_unique property.name, options_with_message(options, property, :is_unique)
    when TrueClass
      validates_is_unique property.name, options_with_message(options, property, :is_unique)
  end
end

#infer_within_validation_for(property, options) ⇒ Object



165
166
167
168
169
170
171
# File 'lib/dm-validations/auto_validate.rb', line 165

def infer_within_validation_for(property, options)
  return unless property.options.key?(:set)

  options[:set] = property.options[:set]

  validates_within property.name, options_with_message(options, property, :within)
end

#options_with_message(base_options, property, validator_name) ⇒ Object

adds message for validator



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/dm-validations/auto_validate.rb', line 12

def options_with_message(base_options, property, validator_name)
  options = base_options.clone
  opts    = property.options

  if opts.key?(:messages)
    options[:message] = opts[:messages][validator_name]
  elsif opts.key?(:message)
    options[:message] = opts[:message]
  end

  options
end

#skip_auto_validation_for?(property) ⇒ TrueClass, FalseClass

Checks whether or not property should be auto validated. It is the case for properties with :auto_validation option given and it’s value evaluates to true

Returns:

  • (TrueClass, FalseClass)

    true for properties with :auto_validation option that has positive value



123
124
125
# File 'lib/dm-validations/auto_validate.rb', line 123

def skip_auto_validation_for?(property)
  property.options.key?(:auto_validation) && !property.options[:auto_validation]
end

#without_auto_validations(&block) ⇒ Object

disables generation of validations for duration of given block



29
30
31
32
33
# File 'lib/dm-validations/auto_validate.rb', line 29

def without_auto_validations(&block)
  @disable_auto_validations = true
  block.call
  @disable_auto_validations = false
end