class Twfy::Validation

Public Class Methods

new(params = {}, against = {}) click to toggle source
# File lib/twfy/validation.rb, line 11
def initialize(params = {}, against = {})
  @params  = params
  @against = against
end
run(params = {}, against = {}) click to toggle source
# File lib/twfy/validation.rb, line 7
def self.run(params = {}, against = {})
  new(params, against).check!
end

Public Instance Methods

check!() click to toggle source
# File lib/twfy/validation.rb, line 16
def check!
  unless missing.empty?
    raise ServiceArgumentError, "Missing required params #{missing.inspect}"
  end
  unless extra.empty?
    raise ServiceArgumentError, "Unknown params #{extra.inspect}"
  end
  check_one_required!
end

Private Instance Methods

allowed() click to toggle source
# File lib/twfy/validation.rb, line 32
def allowed
  @allowed ||= allowed_with_dependencies
end
allowed_with_dependencies() click to toggle source
# File lib/twfy/validation.rb, line 44
def allowed_with_dependencies
  base = list(@against[:allow])
  dependencies_allowed.each_with_object(base) do |(key, dependent_keys), memo|
    if provided.include?(key)
      memo.push(*list(dependent_keys))
    end
  end
end
check_one_required!() click to toggle source
# File lib/twfy/validation.rb, line 69
def check_one_required!
  count = one_required_count
  if count
    if count < 1
      raise ServiceArgumentError, "Need exactly one of #{one_required.inspect}"
    elsif count > 1
      raise ServiceArgumentError, "Only one of #{one_required.inspect} allowed"
    end
  end
end
dependencies_allowed() click to toggle source
# File lib/twfy/validation.rb, line 40
def dependencies_allowed
  @dependencies_allowed ||= @against[:allow_dependencies] || {}
end
extra() click to toggle source
# File lib/twfy/validation.rb, line 65
def extra
  @extra ||= provided - (required + allowed + one_required)
end
list(candidate) click to toggle source
# File lib/twfy/validation.rb, line 57
def list(candidate)
  Array(candidate).dup.compact
end
missing() click to toggle source
# File lib/twfy/validation.rb, line 61
def missing
  @missing ||= required - provided
end
one_required() click to toggle source
# File lib/twfy/validation.rb, line 36
def one_required
  @one_required ||= list(@against[:require_one_of])
end
one_required_count() click to toggle source
# File lib/twfy/validation.rb, line 80
def one_required_count
  if one_required.any?
    provided.select { |item| one_required.include?(item) }.size
  end
end
provided() click to toggle source
# File lib/twfy/validation.rb, line 53
def provided
  @provided ||= @params.keys.map(&:to_sym)
end
required() click to toggle source
# File lib/twfy/validation.rb, line 28
def required
  @required ||= list(@against[:require])
end