module SnFoil::Searcher

Attributes

scope[R]

Public Class Methods

new(scope: nil) click to toggle source
# File lib/sn_foil/searcher.rb, line 43
def initialize(scope: nil)
  @scope = scope || model.all
end

Public Instance Methods

booleans(*fields) click to toggle source
# File lib/sn_foil/searcher.rb, line 31
def booleans(*fields)
  @i_booleans ||= []
  @i_booleans |= fields.map(&:to_sym)
end
filter(method = nil, **options, &block) click to toggle source
# File lib/sn_foil/searcher.rb, line 20
def filter(method = nil, **options, &block)
  raise ArgumentError, 'filter requires either a method name or a block' if method.nil? && block.nil?

  (@i_filters ||= []) << {
    method: method,
    block: block,
    if: options[:if],
    unless: options[:unless]
  }
end
filters() click to toggle source
# File lib/sn_foil/searcher.rb, line 60
def filters
  self.class.i_filters || []
end
model(klass = nil) click to toggle source
# File lib/sn_foil/searcher.rb, line 12
def model(klass = nil)
  @i_model = klass
end
setup(setup_method = nil, &setup_block) click to toggle source
# File lib/sn_foil/searcher.rb, line 16
def setup(setup_method = nil, &setup_block)
  @i_setup = setup_method || setup_block
end

Private Instance Methods

apply_filter(i_filter, filtered_scope, params) click to toggle source
# File lib/sn_foil/searcher.rb, line 86
def apply_filter(i_filter, filtered_scope, params)
  return filtered_scope unless filter_valid?(i_filter, params)

  return send(i_filter[:method], filtered_scope, params) if i_filter[:method]

  instance_exec filtered_scope, params, &i_filter[:block]
end
apply_filters(filtered_scope, params) click to toggle source
# File lib/sn_foil/searcher.rb, line 80
def apply_filters(filtered_scope, params)
  filters&.reduce(filtered_scope) do |i_scope, i_filter|
    apply_filter(i_filter, i_scope, params)
  end
end
apply_setup(filtered_scope, params) click to toggle source
# File lib/sn_foil/searcher.rb, line 70
def apply_setup(filtered_scope, params)
  return filtered_scope if setup.nil?

  if setup.is_a?(Symbol) || setup.is_a?(String)
    send(setup, filtered_scope, params)
  else
    instance_exec filtered_scope, params, &setup
  end
end
filter_valid?(i_filter, params) click to toggle source
# File lib/sn_foil/searcher.rb, line 94
def filter_valid?(i_filter, params)
  return false if !i_filter[:if].nil? && i_filter[:if].call(params) == false
  return false if !i_filter[:unless].nil? && i_filter[:unless].call(params) == true

  true
end
transform_params_booleans(params) click to toggle source
# File lib/sn_foil/searcher.rb, line 101
def transform_params_booleans(params)
  params.map do |key, value|
    value = if booleans.include?(key.to_sym)
              value_to_boolean(value)
            else
              value
            end
    [key, value]
  end.to_h
end
value_to_boolean(value) click to toggle source
# File lib/sn_foil/searcher.rb, line 112
def value_to_boolean(value)
  string_val = value.to_s
  if value == true || %w[true 1].include?(string_val)
    true
  elsif value == false || %w[false 0].include?(string_val)
    false
  else
    value
  end
end