class React::Validator

Attributes

errors[RW]
props_wrapper[R]

Public Class Methods

build(&block) click to toggle source
# File lib/react/validator.rb, line 11
def self.build(&block)
  self.new.build(&block)
end
new(props_wrapper = Class.new(Component::PropsWrapper)) click to toggle source
# File lib/react/validator.rb, line 7
def initialize(props_wrapper = Class.new(Component::PropsWrapper))
  @props_wrapper = props_wrapper
end

Public Instance Methods

allow_undefined_props=(allow) click to toggle source
# File lib/react/validator.rb, line 30
def allow_undefined_props=(allow)
  @allow_undefined_props = allow
end
build(&block) click to toggle source
# File lib/react/validator.rb, line 15
def build(&block)
  instance_eval(&block)
  self
end
default_props() click to toggle source
# File lib/react/validator.rb, line 51
def default_props
  rules
    .select {|key, value| value.keys.include?("default") }
    .inject({}) {|memo, (k,v)| memo[k] = v[:default]; memo}
end
optional(name, options = {}) click to toggle source
# File lib/react/validator.rb, line 25
def optional(name, options = {})
  options[:required] = false
  define_rule(name, options)
end
requires(name, options = {}) click to toggle source
# File lib/react/validator.rb, line 20
def requires(name, options = {})
  options[:required] = true
  define_rule(name, options)
end
undefined_props(props) click to toggle source
# File lib/react/validator.rb, line 34
def undefined_props(props)
  self.allow_undefined_props = true
  props.reject { |name, value| rules[name] }
end
validate(props) click to toggle source
# File lib/react/validator.rb, line 39
def validate(props)
  self.errors = []
  validate_undefined(props) unless allow_undefined_props?
  props = coerce_native_hash_values(defined_props(props))
  validate_required(props)
  props.each do |name, value|
    validate_types(name, value)
    validate_allowed(name, value)
  end
  errors
end

Private Instance Methods

allow_undefined_props?() click to toggle source
# File lib/react/validator.rb, line 63
def allow_undefined_props?
  !!@allow_undefined_props
end
coerce_native_hash_values(hash) click to toggle source
# File lib/react/validator.rb, line 130
def coerce_native_hash_values(hash)
  hash.each do |key, value|
    hash[key] = Native(value)
  end
end
define_rule(name, options = {}) click to toggle source
# File lib/react/validator.rb, line 71
def define_rule(name, options = {})
  rules[name] = coerce_native_hash_values(options)
  props_wrapper.define_param(name, options[:type])
end
defined_props(props) click to toggle source
# File lib/react/validator.rb, line 59
def defined_props(props)
  props.select { |name| rules.keys.include?(name) }
end
rules() click to toggle source
# File lib/react/validator.rb, line 67
def rules
  @rules ||= { children: { required: false } }
end
type_check(prop_name, value, klass, allow_nil) click to toggle source
# File lib/react/validator.rb, line 93
def type_check(prop_name, value, klass, allow_nil)
  return if allow_nil && value.nil?
  return if value.is_a?(klass)
  return if klass.respond_to?(:_react_param_conversion) &&
    klass._react_param_conversion(value, :validate_only)
  errors << "Provided prop #{prop_name} could not be converted to #{klass}"
end
validate_allowed(prop_name, value) click to toggle source
# File lib/react/validator.rb, line 101
def validate_allowed(prop_name, value)
  return unless values = rules[prop_name][:values]
  return if values.include?(value)
  errors << "Value `#{value}` for prop `#{prop_name}` is not an allowed value"
end
validate_required(props) click to toggle source
# File lib/react/validator.rb, line 107
def validate_required(props)
  (rules.keys - props.keys).each do |name|
    next unless rules[name][:required]
    errors << "Required prop `#{name}` was not specified"
  end
end
validate_types(prop_name, value) click to toggle source
# File lib/react/validator.rb, line 80
def validate_types(prop_name, value)
  return unless klass = rules[prop_name][:type]
  if !klass.is_a?(Array)
    allow_nil = !!rules[prop_name][:allow_nil]
    type_check("`#{prop_name}`", value, klass, allow_nil)
  elsif klass.length > 0
    validate_value_array(prop_name, value)
  else
    allow_nil = !!rules[prop_name][:allow_nil]
    type_check("`#{prop_name}`", value, Array, allow_nil)
  end
end
validate_undefined(props) click to toggle source
# File lib/react/validator.rb, line 114
def validate_undefined(props)
  (props.keys - rules.keys).each do |prop_name|
    errors <<  "Provided prop `#{prop_name}` not specified in spec"
  end
end
validate_value_array(name, value) click to toggle source
# File lib/react/validator.rb, line 120
def validate_value_array(name, value)
  klass = rules[name][:type]
  allow_nil = !!rules[name][:allow_nil]
  value.each_with_index do |item, index|
    type_check("`#{name}`[#{index}]", Native(item), klass[0], allow_nil)
  end
rescue NoMethodError
  errors << "Provided prop `#{name}` was not an Array"
end