class Wayfarer::Routing::QueryRule

@private

Public Class Methods

new(field_constraints, opts = {}, &proc) click to toggle source
Calls superclass method
# File lib/wayfarer/routing/query_rule.rb, line 9
def initialize(field_constraints, opts = {}, &proc)
  @field_constraints = field_constraints
  super(opts, &proc)
end

Private Instance Methods

match!(uri) click to toggle source
# File lib/wayfarer/routing/query_rule.rb, line 16
def match!(uri)
  CGI.parse(uri.query).none? do |field, vals| violates?(field, vals) end
rescue NoMethodError
  # `CGI::parse` throws a `NoMethodError` if `uri.query` is an empty
  # string
  false
end
violates?(field, vals) click to toggle source

rubocop:disable Lint/AssignmentInCondition

# File lib/wayfarer/routing/query_rule.rb, line 25
def violates?(field, vals)
  return false unless constraint = @field_constraints[field.to_sym]
  violates_constraint?(constraint, vals)
end
violates_constraint?(constraint, vals) click to toggle source

rubocop:enable Lint/AssignmentInCondition

# File lib/wayfarer/routing/query_rule.rb, line 31
def violates_constraint?(constraint, vals)
  case constraint
  when String  then violates_string?(constraint, vals)
  when Integer then violates_integer?(constraint, vals)
  when Regexp  then violates_regexp?(constraint, vals)
  when Range   then violates_range?(constraint, vals)
  end
end
violates_integer?(int, vals) click to toggle source
# File lib/wayfarer/routing/query_rule.rb, line 44
def violates_integer?(int, vals)
  vals.none? do |val| int == Integer(val) end
rescue ArgumentError
  true
end
violates_range?(range, vals) click to toggle source
# File lib/wayfarer/routing/query_rule.rb, line 54
def violates_range?(range, vals)
  vals.none? { |val| range.include?(val.to_i) }
end
violates_regexp?(regexp, vals) click to toggle source
# File lib/wayfarer/routing/query_rule.rb, line 50
def violates_regexp?(regexp, vals)
  vals.none? { |val| regexp.match(val) }
end
violates_string?(str, vals) click to toggle source
# File lib/wayfarer/routing/query_rule.rb, line 40
def violates_string?(str, vals)
  vals.none? { |val| str == val }
end