Skip to content

Instantly share code, notes, and snippets.

@dreamr
Last active December 23, 2015 17:59
Show Gist options
  • Save dreamr/6672090 to your computer and use it in GitHub Desktop.
Save dreamr/6672090 to your computer and use it in GitHub Desktop.
ruby self trick - learning aid for the jr devs
require "forwardable"
class Items
include Enumerable
extend Forwardable
def_delegators :@all, :each, :map, :inject,
:reduce, :select, :reject
attr_reader :all, :filtered
def initialize(items=[])
@filtered = @all = items.flatten
end
def filter(opts)
@filtered ||= opts.map {|k,v|
@all.select {|item| item.send(k) == v }
}.flatten
self
end
def <<(*item)
@all = [@all + [item]].flatten
end
def to_a
@all.to_a.flatten || @filtered.to_a.flatten
end
end
require 'ostruct'
class Item < OpenStruct
end
require 'minitest/autorun'
describe Items do
subject { Items }
let(:items) {[
Item.new(name: "awesome", group: "agroup" ),
Item.new(name: "cooler", group: "agroup")
]}
it "must accept an array in the initializer" do
assert subject.new([])
end
it "must allow enumeration" do
subject.new(items).each_with_index do |item, i|
item.must_equal items[i]
end
end
describe "#filter" do
subject { Items.new(items) }
it "it filters the results in #filtered" do
subject.filter(
{ name: "awesome" }
).filtered[0].name.must_equal "awesome"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment