exporter = Exporter.new
exporter.header = ["Firstname", "Lastname", "Email"]
[%w(Vincent Durand vincent@foo.com), %w(Bob Marley bob@foo.com)].each do |user|
exporter.add user
end
exporter.to_csv('ISO-8859-15//IGNORE', 'UTF-8')
Last active
December 14, 2015 01:18
-
-
Save madwork/5004883 to your computer and use it in GitHub Desktop.
Simple CSV Exporter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'iconv' | |
class Exporter | |
def initialize(separator = ';') | |
@separator = separator | |
@header = [] | |
@body = [] | |
end | |
def header=(columns) | |
@header = columns.flatten | |
end | |
# Add value to body | |
# | |
# @param [Array] values | |
# @return [Array] @body | |
def add(values) | |
@body << values.flatten.join(@separator) | |
end | |
alias_method :<<, :add | |
# Build CSV | |
# Iconv (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/iconv/rdoc/Iconv.html) | |
# | |
# @param [String] to | |
# @param [String] from | |
# @return [String] | |
def to_csv(to, from) | |
csv = Iconv.new(to, from) | |
csv.iconv header_as_string + body_as_string | |
end | |
private | |
def body_as_string | |
@body.join("\n") | |
end | |
def header_as_string | |
@header.join(@separator).concat("\n") | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'minitest/autorun' | |
require File.join(File.expand_path(File.dirname(__FILE__)), 'exporter.rb') | |
class TestExporter < MiniTest::Unit::TestCase | |
def setup | |
@exporter = Exporter.new | |
@exporter.header = ["Foo", "Bar"] | |
@exporter.add [1, 2] | |
end | |
def test_should_set_header | |
assert_equal ["Foo", "Bar"], @exporter.instance_variable_get('@header') | |
end | |
def test_should_set_body | |
assert_equal ["1;2"], @exporter.instance_variable_get('@body') | |
end | |
def test_should_add_to_body | |
@exporter.add [3, 4] | |
assert_equal ["1;2", "3;4"], @exporter.instance_variable_get('@body') | |
end | |
def test_should_add_to_body_with_aliased_method | |
@exporter << [3, 4] | |
assert_equal ["1;2", "3;4"], @exporter.instance_variable_get('@body') | |
end | |
def test_should_export_to_csv | |
assert_equal "Foo;Bar\n1;2", @exporter.to_csv('ISO-8859-15//IGNORE', 'UTF-8') | |
end | |
def test_should_export_to_csv_with_empty | |
assert_equal "\n", Exporter.new.to_csv('ISO-8859-15//IGNORE', 'UTF-8') | |
end | |
def test_should_set_header_with_non_flatten_array | |
@exporter.header = ["Foo", ["Name1", "Name2"], "Bar"] | |
assert_equal ["Foo", "Name1", "Name2", "Bar"], @exporter.instance_variable_get('@header') | |
end | |
def test_should_raise_error_with_invalid_header_paramter | |
assert_raises(NoMethodError) { @exporter.header = "Foo" } | |
end | |
def test_should_raise_error_with_invalid_body_paramter | |
assert_raises(NoMethodError) { @exporter << "Foo" } | |
end | |
def test_should_get_header_as_string | |
assert_equal "Foo;Bar\n", @exporter.send(:header_as_string) | |
end | |
def test_should_get_body_as_string | |
@exporter.add [2, 3] | |
assert_equal "1;2\n2;3", @exporter.send(:body_as_string) | |
end | |
def test_should_customize_separator | |
@exporter = Exporter.new(':') | |
@exporter.header = ["Foo", "Bar"] | |
@exporter.add [1, 2] | |
assert_equal "Foo:Bar\n1:2", @exporter.to_csv('ISO-8859-15//IGNORE', 'UTF-8') | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment