class Grape::Validations::ParamsScope

Attributes

element[RW]
parent[RW]

Public Class Methods

new(api, element, parent, &block) click to toggle source
# File lib/grape/validations.rb, line 92
def initialize(api, element, parent, &block)
  @element = element
  @parent  = parent
  @api     = api
  @declared_params = []

  instance_eval(&block)

  configure_declared_params
end

Public Instance Methods

full_name(name) click to toggle source
# File lib/grape/validations.rb, line 133
def full_name(name)
  return "#{@parent.full_name(@element)}[#{name}]" if @parent
  name.to_s
end
group(element, &block) click to toggle source
# File lib/grape/validations.rb, line 123
def group(element, &block)
  ParamsScope.new(@api, element, self, &block)
end
optional(*attrs) click to toggle source
# File lib/grape/validations.rb, line 113
def optional(*attrs)
  validations = {}
  if attrs.last.is_a?(Hash)
    validations.merge!(attrs.pop)
  end

  push_declared_params(attrs)
  validates(attrs, validations)
end
params(params) click to toggle source
# File lib/grape/validations.rb, line 127
def params(params)
  params = @parent.params(params) if @parent
  params = params[@element] || {} if @element
  params
end
requires(*attrs) click to toggle source
# File lib/grape/validations.rb, line 103
def requires(*attrs)
  validations = {:presence => true}
  if attrs.last.is_a?(Hash)
    validations.merge!(attrs.pop)
  end

  push_declared_params(attrs)
  validates(attrs, validations)
end

Protected Instance Methods

push_declared_params(attrs) click to toggle source
# File lib/grape/validations.rb, line 140
def push_declared_params(attrs)
  @declared_params.concat attrs
end

Private Instance Methods

configure_declared_params() click to toggle source

Pushes declared params to parent or settings

# File lib/grape/validations.rb, line 147
def configure_declared_params
  if @parent
    @parent.push_declared_params [element => @declared_params]
  else
    @api.settings.peek[:declared_params] ||= []
    @api.settings[:declared_params].concat @declared_params
  end
end
validate(type, options, attrs, doc_attrs) click to toggle source
# File lib/grape/validations.rb, line 197
def validate(type, options, attrs, doc_attrs)
  validator_class = Validations::validators[type.to_s]

  if validator_class
    (@api.settings.peek[:validations] ||= []) << validator_class.new(attrs, options, doc_attrs[:required], self)
  else
    raise Grape::Exceptions::UnknownValidator.new(type)
  end
end
validates(attrs, validations) click to toggle source
# File lib/grape/validations.rb, line 156
def validates(attrs, validations)
  doc_attrs = { :required => validations.keys.include?(:presence) }

  # special case (type = coerce)
  if validations[:type]
    validations[:coerce] = validations.delete(:type)
  end

  if coerce_type = validations[:coerce]
    doc_attrs[:type] = coerce_type.to_s
  end

  if desc = validations.delete(:desc)
    doc_attrs[:desc] = desc
  end

  if default = validations[:default]
    doc_attrs[:default] = default
  end

  full_attrs = attrs.collect{ |name| { :name => name, :full_name => full_name(name)} }
  @api.document_attribute(full_attrs, doc_attrs)

  # Validate for presence before any other validators
  if validations.has_key?(:presence) && validations[:presence]
    validate('presence', validations[:presence], attrs, doc_attrs)
  end

  # Before we run the rest of the validators, lets handle
  # whatever coercion so that we are working with correctly
  # type casted values
  if validations.has_key? :coerce
    validate('coerce', validations[:coerce], attrs, doc_attrs)
    validations.delete(:coerce)
  end

  validations.each do |type, options|
    validate(type, options, attrs, doc_attrs)
  end
end