easycsv 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/easycsv/builder.rb +60 -0
- data/lib/easycsv/coma_separator.rb +11 -0
- data/lib/easycsv/data.rb +36 -0
- data/lib/easycsv/double_quote_wrapper.rb +11 -0
- data/lib/easycsv.rb +3 -0
- data/spec/easycsv/builder_spec.rb +83 -0
- data/spec/easycsv/coma_separator_spec.rb +14 -0
- data/spec/easycsv/data_spec.rb +78 -0
- data/spec/easycsv/double_quote_wrapper_spec.rb +14 -0
- metadata +56 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 88fb5ff3bb9bbb9fbda05d3bb4240d497de6fc9e
|
4
|
+
data.tar.gz: 377a3a4903ff82e57ee19aeaea0908215b8a4496
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8f920a498f0ba6ba049b8874a16fd5d7e12e59f4eb8249f5269aaac83a74d179aad4a345a42adca9dede5dd4aa5bda9e14056b42dc74458718f3c591b4ce8f09
|
7
|
+
data.tar.gz: 0f0a29761904bdbe1cdb388a096c63cf596c6bd133c707f4a4470a23f9995272e81b6cc8e2cb973fbaa26b4fb0b9c43bfb0383aa1f45405e51d3e33614c7f470
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require_relative "data"
|
2
|
+
|
3
|
+
module EasyCSV
|
4
|
+
class Builder
|
5
|
+
attr_accessor :wrapper, :separator, :file_path, :data
|
6
|
+
def self.build(&block)
|
7
|
+
builder = new
|
8
|
+
builder.instance_eval(&block)
|
9
|
+
builder.build
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@data = Data.new
|
14
|
+
@wrapper = DoubleQuoteWrapper
|
15
|
+
@separator = ComaSeparator
|
16
|
+
end
|
17
|
+
|
18
|
+
def build
|
19
|
+
File.open(@file_path, "w") do |f|
|
20
|
+
f.write header_row
|
21
|
+
f.write data_rows
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def set_column_separator(separator)
|
26
|
+
@separator = separator
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_path(path)
|
30
|
+
@file_path = path
|
31
|
+
end
|
32
|
+
|
33
|
+
def method_missing(m, *args, &block)
|
34
|
+
@data.send(m, *args, &block)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def header_row
|
40
|
+
separate( wrap(@data.headers) ) + "\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
def data_rows
|
44
|
+
@data.rows.map{|r| build_row(r)}.join "\n"
|
45
|
+
end
|
46
|
+
|
47
|
+
def build_row(r)
|
48
|
+
row = @data.calls.map{|c| r.send(c)}
|
49
|
+
separate( wrap(row) )
|
50
|
+
end
|
51
|
+
|
52
|
+
def wrap(row)
|
53
|
+
@wrapper.new(row).wrap
|
54
|
+
end
|
55
|
+
|
56
|
+
def separate(row)
|
57
|
+
@separator.new(row).separate
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/easycsv/data.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require "delegate"
|
2
|
+
|
3
|
+
module EasyCSV
|
4
|
+
class Data < Struct.new(:columns, :rows)
|
5
|
+
def initialize
|
6
|
+
super(Array.new, Array.new)
|
7
|
+
end
|
8
|
+
|
9
|
+
def headers
|
10
|
+
columns.map(&:header_name)
|
11
|
+
end
|
12
|
+
|
13
|
+
def calls
|
14
|
+
columns.map(&:method_call)
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_column(header_name, method_call)
|
18
|
+
columns.push(Column.new(header_name, method_call))
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_columns(column_pairs)
|
22
|
+
column_pairs.each {|pair| add_column(*pair)}
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_row(data_model)
|
26
|
+
rows.push(Row.new(data_model))
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_rows(data_models)
|
30
|
+
data_models.each{|d| add_row(d)}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
Column = Struct.new(:method_call, :header_name)
|
35
|
+
class Row < SimpleDelegator; end
|
36
|
+
end
|
data/lib/easycsv.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require_relative "../../lib/easycsv/builder"
|
2
|
+
|
3
|
+
describe EasyCSV::Builder do
|
4
|
+
let(:builder) { described_class.new }
|
5
|
+
|
6
|
+
describe "#wrapper" do
|
7
|
+
subject { builder.wrapper }
|
8
|
+
|
9
|
+
context "default" do
|
10
|
+
it { should eq EasyCSV::DoubleQuoteWrapper }
|
11
|
+
end
|
12
|
+
|
13
|
+
context "setting a separator" do
|
14
|
+
let(:wrapper) { Class.new }
|
15
|
+
before { builder.wrapper = wrapper }
|
16
|
+
it { should eq wrapper }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#separator" do
|
21
|
+
subject { builder.separator }
|
22
|
+
|
23
|
+
context "default" do
|
24
|
+
it { should eq EasyCSV::ComaSeparator }
|
25
|
+
end
|
26
|
+
|
27
|
+
context "setting a separator" do
|
28
|
+
let(:separator) { Class.new }
|
29
|
+
before { builder.separator = separator }
|
30
|
+
it { should eq separator }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#file_path" do
|
35
|
+
subject { builder.file_path }
|
36
|
+
|
37
|
+
context "with a path '~/csv.csv'" do
|
38
|
+
before { builder.file_path = "~/csv.csv" }
|
39
|
+
it { should eq "~/csv.csv" }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#build" do
|
44
|
+
let(:path) { "/tmp/test_file.csv" }
|
45
|
+
let(:object_1) { double(foo: "Bar", herp: "Derp") }
|
46
|
+
let(:object_2) { double(foo: "A", herp: "B") }
|
47
|
+
let(:result) { "\"Foo\",\"Herp\"\n\"Bar\",\"Derp\"\n\"A\",\"B\"" }
|
48
|
+
|
49
|
+
after { `rm #{path}` }
|
50
|
+
|
51
|
+
context "normal mode" do
|
52
|
+
it "should write the file" do
|
53
|
+
builder.file_path = path
|
54
|
+
builder.add_column(:foo, "Foo")
|
55
|
+
builder.add_column(:herp, "Herp")
|
56
|
+
builder.add_row(object_1)
|
57
|
+
builder.add_row(object_2)
|
58
|
+
|
59
|
+
builder.build
|
60
|
+
|
61
|
+
File.read(path).should eq(result)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "block mode" do
|
66
|
+
it "should write the file" do
|
67
|
+
b_path = path
|
68
|
+
b_object_1 = object_1
|
69
|
+
b_object_2 = object_2
|
70
|
+
|
71
|
+
described_class.build do
|
72
|
+
set_path(b_path)
|
73
|
+
add_column(:foo, "Foo")
|
74
|
+
add_column(:herp, "Herp")
|
75
|
+
add_row(b_object_1)
|
76
|
+
add_row(b_object_2)
|
77
|
+
end
|
78
|
+
|
79
|
+
File.read(b_path).should eq(result)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative '../../lib/easycsv/coma_separator'
|
2
|
+
|
3
|
+
describe EasyCSV::ComaSeparator do
|
4
|
+
describe '#separate' do
|
5
|
+
subject { described_class.new(row).separate }
|
6
|
+
let(:row) { ['Foo', 'Bar'] }
|
7
|
+
|
8
|
+
context "given an array ['Foo', 'Bar']" do
|
9
|
+
let(:result) { "Foo,Bar" }
|
10
|
+
|
11
|
+
it { should eq(result) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require_relative "../../lib/easycsv/data"
|
2
|
+
|
3
|
+
describe EasyCSV::Data do
|
4
|
+
let(:data) { described_class.new }
|
5
|
+
|
6
|
+
describe "#add_column" do
|
7
|
+
it "should add a column object" do
|
8
|
+
data.add_column(:call, "header name")
|
9
|
+
data.add_column(:call, "header name 2")
|
10
|
+
data.columns.count.should eq 2
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#add_columns" do
|
15
|
+
it "should add an array of pairs to the columns" do
|
16
|
+
data.add_columns([ [:call, "header name"], [:call2, "header name 2"] ])
|
17
|
+
data.columns.count.should eq 2
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#add_row" do
|
22
|
+
it "should add a row object" do
|
23
|
+
data.add_row(double)
|
24
|
+
data.add_row(double)
|
25
|
+
data.rows.count.should eq 2
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#add_rows" do
|
30
|
+
it "should add everything from an array to rows" do
|
31
|
+
data.add_rows( [double, double] )
|
32
|
+
data.add_rows( [double] )
|
33
|
+
data.rows.count.should eq 3
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#headers" do
|
38
|
+
subject { data.headers }
|
39
|
+
context "with no columns" do
|
40
|
+
let(:results) { Array.new }
|
41
|
+
it { should eq(results) }
|
42
|
+
end
|
43
|
+
|
44
|
+
context "with column with header 'Foo'" do
|
45
|
+
let(:results) { ["Foo"] }
|
46
|
+
before { data.add_column(:foo, "Foo") }
|
47
|
+
it { should eq(results) }
|
48
|
+
end
|
49
|
+
|
50
|
+
context "with columns with headers 'Foo', 'Bar'" do
|
51
|
+
let(:results) { ["Foo", "Bar"] }
|
52
|
+
before { data.add_column(:foo, "Foo") }
|
53
|
+
before { data.add_column(:foo, "Bar") }
|
54
|
+
it { should eq(results) }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#calls" do
|
59
|
+
subject { data.calls }
|
60
|
+
context "with no columns" do
|
61
|
+
let(:results) { Array.new }
|
62
|
+
it { should eq(results) }
|
63
|
+
end
|
64
|
+
|
65
|
+
context "with column with call 'Foo'" do
|
66
|
+
let(:results) { [:foo] }
|
67
|
+
before { data.add_column(:foo, "Foo") }
|
68
|
+
it { should eq(results) }
|
69
|
+
end
|
70
|
+
|
71
|
+
context "with columns with calls :foo, :bar" do
|
72
|
+
let(:results) { [:foo, :bar] }
|
73
|
+
before { data.add_column(:foo, "Foo") }
|
74
|
+
before { data.add_column(:bar, "Bar") }
|
75
|
+
it { should eq(results) }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative '../../lib/easycsv/double_quote_wrapper'
|
2
|
+
|
3
|
+
describe EasyCSV::DoubleQuoteWrapper do
|
4
|
+
describe "#wrap" do
|
5
|
+
subject { described_class.new(row).wrap }
|
6
|
+
let(:row) { ["entry", "yrtne"] }
|
7
|
+
|
8
|
+
context 'given an array ["entry", "yrtne"]' do
|
9
|
+
let(:result) { ["\"entry\"", "\"yrtne\""] }
|
10
|
+
|
11
|
+
it { should eq(result) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: easycsv
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kelly Stannard
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-14 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: easier csv creation
|
14
|
+
email: kwstannard@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/easycsv/builder.rb
|
20
|
+
- lib/easycsv/coma_separator.rb
|
21
|
+
- lib/easycsv/data.rb
|
22
|
+
- lib/easycsv/double_quote_wrapper.rb
|
23
|
+
- lib/easycsv.rb
|
24
|
+
- spec/easycsv/builder_spec.rb
|
25
|
+
- spec/easycsv/coma_separator_spec.rb
|
26
|
+
- spec/easycsv/data_spec.rb
|
27
|
+
- spec/easycsv/double_quote_wrapper_spec.rb
|
28
|
+
homepage: https://github.com/lendkey/cassava
|
29
|
+
licenses:
|
30
|
+
- MIT
|
31
|
+
metadata: {}
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
requirements: []
|
47
|
+
rubyforge_project:
|
48
|
+
rubygems_version: 2.0.3
|
49
|
+
signing_key:
|
50
|
+
specification_version: 4
|
51
|
+
summary: easier csv creation
|
52
|
+
test_files:
|
53
|
+
- spec/easycsv/builder_spec.rb
|
54
|
+
- spec/easycsv/coma_separator_spec.rb
|
55
|
+
- spec/easycsv/data_spec.rb
|
56
|
+
- spec/easycsv/double_quote_wrapper_spec.rb
|