class Fern::Parameters::Validator
Attributes
declared[RW]
errors[RW]
Public Class Methods
new(config)
click to toggle source
# File lib/fern/parameters/validator.rb, line 13 def initialize(config) @config = config @errors = Errors.new @declared = {} end
Public Instance Methods
validate(params)
click to toggle source
# File lib/fern/parameters/validator.rb, line 19 def validate(params) @config.each do |name, config| if params.key?(name) @declared[name] = validate_constraints( name, params[name], config ) else @declared[name] = config[:constraints][:default] if config[:constraints].key?(:default) if config[:constraints][:required] && @declared[name].nil? @errors.add(name, 'is required') end end end end
Private Instance Methods
indefinite_articlerize(word)
click to toggle source
# File lib/fern/parameters/validator.rb, line 136 def indefinite_articlerize(word) %w[a e i o u].include?(word[0].downcase) ? "an #{word}" : "a #{word}" end
parse_type(val, type, array = false)
click to toggle source
# File lib/fern/parameters/validator.rb, line 49 def parse_type(val, type, array = false) meth = "validate_#{type}" if array parsed = val.map { |el| send(meth, el) } return nil unless parsed.all? { |el| !el.nil? } && parsed parsed else send(meth, val) end end
pluralize(word)
click to toggle source
# File lib/fern/parameters/validator.rb, line 132 def pluralize(word) ActiveSupport::Inflector.pluralize(word) end
validate_boolean(val)
click to toggle source
# File lib/fern/parameters/validator.rb, line 60 def validate_boolean(val) if val.casecmp('true').zero? true elsif val.casecmp('false').zero? false end end
validate_constraints(name, raw_val, config)
click to toggle source
# File lib/fern/parameters/validator.rb, line 38 def validate_constraints(name, raw_val, config) val = validate_type(name, raw_val, config[:type], config) return if val.nil? validate_numeric_constraints(name, val, config) validate_inclusion(name, val, config) val end
validate_date(val)
click to toggle source
# File lib/fern/parameters/validator.rb, line 68 def validate_date(val) Date.parse(val) rescue ArgumentError end
validate_datetime(val)
click to toggle source
# File lib/fern/parameters/validator.rb, line 73 def validate_datetime(val) Time.parse(val) rescue ArgumentError end
validate_float(val)
click to toggle source
# File lib/fern/parameters/validator.rb, line 78 def validate_float(val) Float(val) rescue ArgumentError end
validate_inclusion(name, val, constraints)
click to toggle source
# File lib/fern/parameters/validator.rb, line 83 def validate_inclusion(name, val, constraints) return unless constraints.key?(:values) return if constraints[:values].include?(val) @errors.add(name, "must be one of #{constraints[:values]}") end
validate_integer(val)
click to toggle source
# File lib/fern/parameters/validator.rb, line 89 def validate_integer(val) Integer(val) rescue ArgumentError rescue TypeError end
validate_max(name, val, max)
click to toggle source
# File lib/fern/parameters/validator.rb, line 95 def validate_max(name, val, max) return unless val > max @errors.add(name, "must be less than or equal to #{max}") end
validate_min(name, val, min)
click to toggle source
# File lib/fern/parameters/validator.rb, line 100 def validate_min(name, val, min) return unless val < min @errors.add(name, "must be greater than or equal to #{min}") end
validate_numeric(name, val)
click to toggle source
# File lib/fern/parameters/validator.rb, line 105 def validate_numeric(name, val) validate_float(val) || @errors.add(name, 'must be a number') end
validate_numeric_constraints(name, val, constraints)
click to toggle source
# File lib/fern/parameters/validator.rb, line 109 def validate_numeric_constraints(name, val, constraints) return unless constraints.key?(:min) || constraints.key?(:max) validate_numeric(name, val) validate_min(name, val, constraints[:min]) if constraints.key?(:min) validate_max(name, val, constraints[:max]) if constraints.key?(:max) end
validate_string(val)
click to toggle source
# File lib/fern/parameters/validator.rb, line 116 def validate_string(val) val end
validate_type(name, val, type, config)
click to toggle source
# File lib/fern/parameters/validator.rb, line 120 def validate_type(name, val, type, config) parsed = parse_type(val, type, config[:constraints][:array]) if parsed.nil? if config[:constraints][:array] @errors.add(name, "is not an array of #{pluralize(type)}") else @errors.add(name, "is not #{indefinite_articlerize(type)}") end end parsed end