master
Jason Staten 5 years ago
parent 476ea5e6fa
commit 8a36632ddd

@ -0,0 +1,58 @@
require 'forwardable'
#---
# Excerpted from "Seven Languages in Seven Weeks",
# published by The Pragmatic Bookshelf.
# Copyrights apply to this code. It may not be used to create training material,
# courses, books, articles, and the like. Contact us if you are in doubt.
# We make no guarantees that this code is fit for any purpose.
# Visit http://www.pragmaticprogrammer.com/titles/btlang for more book information.
#---
module ActsAsCsv
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def acts_as_csv
include InstanceMethods
end
end
module InstanceMethods
extend Forwardable
include Enumerable
def read
@csv_contents = []
filename = self.class.to_s.downcase + '.txt'
file = File.new(filename)
@headers = file.gets.chomp.split(',')
file.each do |row|
@csv_contents << CsvRow.new(@headers, row.chomp.split(','))
end
end
attr_accessor :headers, :csv_contents
def_delegators :@csv_contents, :each
def initialize
read
end
end
class CsvRow < Struct.new(:headers, :cells)
def method_missing(name)
self.cells[self.headers.index(name.to_s)]
end
end
end
class RubyCsv # no inheritance! You can mix it in
include ActsAsCsv
acts_as_csv
end
m = RubyCsv.new
puts m.headers.inspect
puts m.csv_contents.inspect
m.each {|row| puts row.one}

@ -0,0 +1,3 @@
one,two
lions,tigers
bears,sheep
Loading…
Cancel
Save