Module: Grape::Validations::Types
- Defined in:
- lib/grape/validations/types.rb,
lib/grape/validations/types/file.rb,
lib/grape/validations/types/json.rb,
lib/grape/validations/types/build_coercer.rb,
lib/grape/validations/types/custom_type_coercer.rb,
lib/grape/validations/types/multiple_type_coercer.rb,
lib/grape/validations/types/variant_collection_coercer.rb
Overview
Module for code related to grape’s system for coercion and type validation of incoming request parameters.
Grape uses a number of tests and assertions to work out exactly how a parameter should be handled, based on the type
and coerce_with
options that may be supplied to Dsl::Parameters#requires and Dsl::Parameters#optional. The main entry point for this process is Types.build_coercer.
Defined Under Namespace
Classes: CustomTypeCoercer, File, InvalidValue, Json, JsonArray, MultipleTypeCoercer, VariantCollectionCoercer
Constant Summary collapse
- PRIMITIVES =
Types representing a single value, which are coerced through Virtus or special logic in Grape.
[ # Numerical Integer, Float, BigDecimal, Numeric, # Date/time Date, DateTime, Time, # Misc Virtus::Attribute::Boolean, String, Symbol, Rack::Multipart::UploadedFile ]
- STRUCTURES =
Types representing data structures.
[ Hash, Array, Set ]
- SPECIAL =
Types for which Grape provides special coercion and type-checking logic.
{ JSON => Json, Array[JSON] => JsonArray, ::File => File, Rack::Multipart::UploadedFile => File }
Class Method Summary collapse
-
.build_coercer(type, method = nil) ⇒ Virtus::Attribute
Work out the
Virtus::Attribute
object to use for coercing strings to the giventype
. -
.custom?(type) ⇒ Boolean
A valid custom type must implement a class-level ‘parse` method, taking one String argument and returning the parsed value in its correct type.
-
.multiple?(type) ⇒ Boolean
Is the declared type in fact an array of multiple allowed types? For example the declaration types: [Integer,String] will attempt first to coerce given values to integer, but will also accept any other string.
-
.primitive?(type) ⇒ Boolean
Is the given class a primitive type as recognized by Grape?.
-
.recognized?(type) ⇒ Boolean
Does the given class implement a type system that Grape (i.e. the underlying virtus attribute system) supports out-of-the-box? Currently supported are
axiom-types
andvirtus
. -
.special?(type) ⇒ Boolean
Does Grape provide special coercion and validation routines for the given class? This does not include automatic handling for primitives, structures and otherwise recognized types.
-
.structure?(type) ⇒ Boolean
Is the given class a standard data structure (collection or map) as recognized by Grape?.
Class Method Details
.build_coercer(type, method = nil) ⇒ Virtus::Attribute
Work out the Virtus::Attribute
object to use for coercing strings to the given type
. Coercion method
will be inferred if none is supplied.
If a Virtus::Attribute
object already built with Virtus::Attribute.build
is supplied as the type
it will be returned and method
will be ignored.
See CustomTypeCoercer for further details about coercion and type-checking inference.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/grape/validations/types/build_coercer.rb', line 22 def self.build_coercer(type, method = nil) # Accept pre-rolled virtus attributes without interference return type if type.is_a? Virtus::Attribute = { nullify_blank: true } conversion_type = type # Use a special coercer for multiply-typed parameters. if Types.multiple?(type) [:coercer] = Types::MultipleTypeCoercer.new(type, method) conversion_type = Object # Use a special coercer for custom types and coercion methods. elsif method || Types.custom?(type) [:coercer] = Types::CustomTypeCoercer.new(type, method) # Grape swaps in its own Virtus::Attribute implementations # for certain special types that merit first-class support # (but not if a custom coercion method has been supplied). elsif Types.special?(type) conversion_type = Types::SPECIAL[type] end # Virtus will infer coercion and validation rules # for many common ruby types. Virtus::Attribute.build(conversion_type, ) end |
.custom?(type) ⇒ Boolean
A valid custom type must implement a class-level ‘parse` method, taking
one String argument and returning the parsed value in its correct type.
133 134 135 136 137 138 139 140 141 |
# File 'lib/grape/validations/types.rb', line 133 def self.custom?(type) !primitive?(type) && !structure?(type) && !multiple?(type) && !recognized?(type) && !special?(type) && type.respond_to?(:parse) && type.method(:parse).arity == 1 end |
.multiple?(type) ⇒ Boolean
Is the declared type in fact an array of multiple allowed types? For example the declaration types: [Integer,String] will attempt first to coerce given values to integer, but will also accept any other string.
95 96 97 |
# File 'lib/grape/validations/types.rb', line 95 def self.multiple?(type) (type.is_a?(Array) || type.is_a?(Set)) && type.size > 1 end |
.primitive?(type) ⇒ Boolean
Is the given class a primitive type as recognized by Grape?
71 72 73 |
# File 'lib/grape/validations/types.rb', line 71 def self.primitive?(type) PRIMITIVES.include?(type) end |
.recognized?(type) ⇒ Boolean
Does the given class implement a type system that Grape (i.e. the underlying virtus attribute system) supports out-of-the-box? Currently supported are axiom-types
and virtus
.
The type will be passed to Virtus::Attribute.build
, and the resulting attribute object will be expected to respond correctly to coerce
and value_coerced?
.
110 111 112 113 114 115 116 |
# File 'lib/grape/validations/types.rb', line 110 def self.recognized?(type) return false if type.is_a?(Array) || type.is_a?(Set) type.is_a?(Virtus::Attribute) || type.ancestors.include?(Axiom::Types::Type) || type.include?(Virtus::Model::Core) end |
.special?(type) ⇒ Boolean
Does Grape provide special coercion and validation routines for the given class? This does not include automatic handling for primitives, structures and otherwise recognized types. See SPECIAL.
125 126 127 |
# File 'lib/grape/validations/types.rb', line 125 def self.special?(type) SPECIAL.key? type end |
.structure?(type) ⇒ Boolean
This method does not yet consider ‘complex types’, which inherit Virtus.model.
Is the given class a standard data structure (collection or map) as recognized by Grape?
83 84 85 |
# File 'lib/grape/validations/types.rb', line 83 def self.structure?(type) STRUCTURES.include?(type) end |