# 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
# File lib/grape/validations.rb, line 133 def full_name(name) return "#{@parent.full_name(@element)}[#{name}]" if @parent name.to_s end
# File lib/grape/validations.rb, line 123 def group(element, &block) ParamsScope.new(@api, element, self, &block) end
# 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
# File lib/grape/validations.rb, line 127 def params(params) params = @parent.params(params) if @parent params = params[@element] || {} if @element params end
# 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
# File lib/grape/validations.rb, line 140 def push_declared_params(attrs) @declared_params.concat attrs end
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
# 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
# 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