class Skimming::Skimmer

Attributes

collection[R]
item_name[R]
skimming_instances[R]
subject[R]

Public Class Methods

new(subject, collection, item_name, skimming_instances) click to toggle source
# File lib/skimming/skimmer.rb, line 5
def initialize(subject, collection, item_name, skimming_instances)
  @subject = subject
  @collection = collection
  @item_name = calculate_item_name
  @skimming_instances = skimming_instances
end

Public Instance Methods

skim() click to toggle source
# File lib/skimming/skimmer.rb, line 12
def skim
  set_instance_variables

  filters_rules = subject.filters.for_item(item_name).map(&:rules).flatten.map(&:statement)

  return collection if filters_rules.empty?

  skimming_result = collection.select do |collection_item|
    instance_variable_set("@#{item_name.downcase}", collection_item)

    filters_rules.all? { |rule| eval rule }
  end

  skimming_result
end

Private Instance Methods

calculate_item_name() click to toggle source
# File lib/skimming/skimmer.rb, line 30
def calculate_item_name
  return item_name.to_s.classify if item_name

  items_classes = collection.map(&:class).uniq

  raise "Invalid collection: contains items with different classes (#{items.classes.join(', ')}). Use same class items or specify their item_name." unless items_classes.count == 1

  items_classes.first.name.demodulize
end
set_instance_variables() click to toggle source
# File lib/skimming/skimmer.rb, line 40
def set_instance_variables
  instance_variable_set("@#{subject.class.name.downcase}", subject)

  skimming_instances.each do |instance_name, instance_object|
    instance_variable_set("@#{instance_name}", instance_object)
  end
end