better_csv 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 73d4dd59073d34d88c4f1231e95ff418a2708545
4
- data.tar.gz: d2011882c778c8b533e38abd9cf6474a788fad95
3
+ metadata.gz: 78ea9ac04ffb87e0c08555153c9c07e33395474e
4
+ data.tar.gz: aa956345ae39f51deecd33da3b60a5e24832434a
5
5
  SHA512:
6
- metadata.gz: b2de90420f81cb1f00ab7fca759bb00f9328eb95936ab7da44c0739c8f413c6d499a57c3cc9bfd5f7954e82785a206e755b67dc9d06551d3c75d0356f2f0bd89
7
- data.tar.gz: a6d063c6ed9662de82ce18c2505003dc494afa8999628c8a9cf79153a82cd9c8089ef59ae13b0a3b85b38bc9465d5952c6121853bbdb8d502b921d668b1809a1
6
+ metadata.gz: 6e7ac40b1d13fd3ce9dc45fa08d6be7014e631e60f36202d3f5ab709ba532508f8ed0ec38b99b4bdf3f2afedede4281d6dfd91ed8231d4b557dc173d65da08ec
7
+ data.tar.gz: eca4e231629e3c8682f00361621a64b9b02e43f9486e669599e05c0c657716d700bfdca75312338c0450bbec9980ec12d6306175cbe4ce3c532b424a90970417
data/lib/better_csv.rb CHANGED
@@ -1,15 +1,51 @@
1
1
  require "better_csv/version"
2
2
 
3
3
  module BetterCsv
4
- def self.parse(str)
4
+ OPTIONS = [:split_by_comma]
5
+
6
+ def self.escape_row value, options: []
7
+ case value
8
+ when Array
9
+ value.collect{|v| "\"#{v.to_s.gsub(/"/,'\"')}\""}
10
+ when Hash
11
+ value.values.collect{|v| "\"#{v.to_s.gsub(/"/,'\"')}\""}
12
+ else
13
+ if options.include?(:split_by_comma) and value.to_s.include?(',')
14
+ escape_row(value.to_s.split(',')) #TODO: split by only non escaped comma.
15
+ else
16
+ ["\"#{value.to_s.gsub(/"/,'\"')}\""]
17
+ end
18
+ end
19
+ end
20
+
21
+ def self.escape array, options: []
22
+ case array
23
+ when Array
24
+ array.collect{|v| escape_row(v, options: options)}
25
+ when Hash
26
+ array.values.collect{|v| escape_row(v, options: options)}
27
+ else
28
+ [escape_row(array.to_s, options: options)]
29
+ end
30
+ end
31
+
32
+ def self.build array, options: []
33
+ escape(array, options: options).collect{|a| a.join(',')}.join("\n")
34
+ end
35
+
36
+ def self.[] array
37
+ escape(array).collect{|a| a.join(',')}.join("\n")
38
+ end
39
+
40
+ def self.parse str
5
41
  in_literal = false
6
42
  csv = Array.new
7
43
 
8
- line = []
9
- token = ""
10
- back = ""
44
+ line = []
45
+ token = ""
46
+ back = ""
11
47
  current = ""
12
- first = true
48
+ first = true
13
49
  str.each_char do |c|
14
50
  current = c
15
51
  if first
@@ -35,7 +71,7 @@ module BetterCsv
35
71
 
36
72
  if current == "\n" and not in_literal
37
73
  line << token
38
- csv << line
74
+ csv << line
39
75
  token = ""
40
76
  yield(line) if block_given?
41
77
  line = Array.new
@@ -1,3 +1,3 @@
1
1
  module BetterCsv
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -5,171 +5,214 @@ describe BetterCsv do
5
5
  expect(BetterCsv::VERSION).not_to be nil
6
6
  end
7
7
 
8
- context 'on basic csv test' do
9
- str = 'a,b,c,d,e,f,g'
10
- equal = [['a','b','c','d','e','f','g']]
11
-
12
- describe "sepalated with simply ',' == #{str} " do
13
- it "shuld be #{equal.to_s}" do
14
- expect(BetterCsv.parse(str)).to eq(equal)
8
+ context 'parse' do
9
+ context 'on basic csv test' do
10
+ str = 'a,b,c,d,e,f,g'
11
+ equal = [['a','b','c','d','e','f','g']]
12
+
13
+ describe "sepalated with simply ',' == #{str} " do
14
+ it "shuld be #{equal.to_s}" do
15
+ expect(BetterCsv.parse(str)).to eq(equal)
16
+ end
15
17
  end
16
18
  end
17
- end
18
19
 
19
- context 'on missing first value csv test' do
20
- str = ',b,c,d,e,f,g'
21
- equal = [['','b','c','d','e','f','g']]
20
+ context 'on missing first value csv test' do
21
+ str = ',b,c,d,e,f,g'
22
+ equal = [['','b','c','d','e','f','g']]
22
23
 
23
- describe "sepalated with simply ',' == #{str} " do
24
- it "shuld be #{equal.to_s}" do
25
- expect(BetterCsv.parse(str)).to eq(equal)
24
+ describe "sepalated with simply ',' == #{str} " do
25
+ it "shuld be #{equal.to_s}" do
26
+ expect(BetterCsv.parse(str)).to eq(equal)
27
+ end
26
28
  end
27
29
  end
28
- end
29
30
 
30
- context 'on missing last value csv test' do
31
- str = 'b,c,d,e,f,g,'
32
- equal = [['b','c','d','e','f','g','']]
31
+ context 'on missing last value csv test' do
32
+ str = 'b,c,d,e,f,g,'
33
+ equal = [['b','c','d','e','f','g','']]
33
34
 
34
- describe "sepalated with simply ',' == #{str} " do
35
- it "shuld be #{equal.to_s}" do
36
- expect(BetterCsv.parse(str)).to eq(equal)
35
+ describe "sepalated with simply ',' == #{str} " do
36
+ it "shuld be #{equal.to_s}" do
37
+ expect(BetterCsv.parse(str)).to eq(equal)
38
+ end
37
39
  end
38
40
  end
39
- end
40
41
 
41
- context 'on missing last value csv in more than 1 line csv test' do
42
- str = "b,c,d,e,f,g,\nh,i,j,k,l,m,"
43
- equal = [['b','c','d','e','f','g',''],['h','i','j','k','l','m','']]
42
+ context 'on missing last value csv in more than 1 line csv test' do
43
+ str = "b,c,d,e,f,g,\nh,i,j,k,l,m,"
44
+ equal = [['b','c','d','e','f','g',''],['h','i','j','k','l','m','']]
44
45
 
45
- describe "sepalated with simply ',' == #{str} " do
46
- it "shuld be #{equal.to_s}" do
47
- expect(BetterCsv.parse(str)).to eq(equal)
46
+ describe "sepalated with simply ',' == #{str} " do
47
+ it "shuld be #{equal.to_s}" do
48
+ expect(BetterCsv.parse(str)).to eq(equal)
49
+ end
48
50
  end
49
51
  end
50
- end
51
52
 
52
- context 'on missing first value in more than 1 line csv test' do
53
- str = ",b,c,d,e,f,g\n,h,i,j,k,l,m"
54
- equal = [['','b','c','d','e','f','g'],['','h','i','j','k','l','m']]
53
+ context 'on missing first value in more than 1 line csv test' do
54
+ str = ",b,c,d,e,f,g\n,h,i,j,k,l,m"
55
+ equal = [['','b','c','d','e','f','g'],['','h','i','j','k','l','m']]
55
56
 
56
- describe "sepalated with simply ',' == #{str} " do
57
- it "shuld be #{equal.to_s}" do
58
- expect(BetterCsv.parse(str)).to eq(equal)
57
+ describe "sepalated with simply ',' == #{str} " do
58
+ it "shuld be #{equal.to_s}" do
59
+ expect(BetterCsv.parse(str)).to eq(equal)
60
+ end
59
61
  end
60
62
  end
61
- end
62
63
 
63
- context 'on including nil csv test' do
64
- str = 'a,b,,,,f,g'
65
- equal = [['a','b',"","","",'f','g']]
64
+ context 'on including nil csv test' do
65
+ str = 'a,b,,,,f,g'
66
+ equal = [['a','b',"","","",'f','g']]
66
67
 
67
- describe "sepalated with simply ',' == #{str} " do
68
- it "shuld be #{equal.to_s}" do
69
- expect(BetterCsv.parse(str)).to eq(equal)
68
+ describe "sepalated with simply ',' == #{str} " do
69
+ it "shuld be #{equal.to_s}" do
70
+ expect(BetterCsv.parse(str)).to eq(equal)
71
+ end
70
72
  end
71
73
  end
72
- end
73
74
 
74
- context 'on including "" csv test' do
75
- str = 'a,b,,"d",,f,g'
76
- equal = [['a','b',"",'d',"",'f','g']]
75
+ context 'on including "" csv test' do
76
+ str = 'a,b,,"d",,f,g'
77
+ equal = [['a','b',"",'d',"",'f','g']]
77
78
 
78
- describe "sepalated with simply ',' == #{str} " do
79
- it "shuld be #{equal.to_s}" do
80
- expect(BetterCsv.parse(str)).to eq(equal)
79
+ describe "sepalated with simply ',' == #{str} " do
80
+ it "shuld be #{equal.to_s}" do
81
+ expect(BetterCsv.parse(str)).to eq(equal)
82
+ end
81
83
  end
82
84
  end
83
- end
84
85
 
85
- context 'on including "" in first csv test' do
86
- str = '"a",b,,d,,f,g'
87
- equal = [['a','b',"",'d',"",'f','g']]
86
+ context 'on including "" in first csv test' do
87
+ str = '"a",b,,d,,f,g'
88
+ equal = [['a','b',"",'d',"",'f','g']]
88
89
 
89
- describe "sepalated with simply ',' == #{str} " do
90
- it "shuld be #{equal.to_s}" do
91
- expect(BetterCsv.parse(str)).to eq(equal)
90
+ describe "sepalated with simply ',' == #{str} " do
91
+ it "shuld be #{equal.to_s}" do
92
+ expect(BetterCsv.parse(str)).to eq(equal)
93
+ end
92
94
  end
93
95
  end
94
- end
95
96
 
96
- context 'on including "" in last csv test' do
97
- str = 'a,b,,d,,f,"g"'
98
- equal = [['a','b',"",'d',"",'f','g']]
97
+ context 'on including "" in last csv test' do
98
+ str = 'a,b,,d,,f,"g"'
99
+ equal = [['a','b',"",'d',"",'f','g']]
99
100
 
100
- describe "sepalated with simply ',' == #{str} " do
101
- it "shuld be #{equal.to_s}" do
102
- expect(BetterCsv.parse(str)).to eq(equal)
101
+ describe "sepalated with simply ',' == #{str} " do
102
+ it "shuld be #{equal.to_s}" do
103
+ expect(BetterCsv.parse(str)).to eq(equal)
104
+ end
103
105
  end
104
106
  end
105
- end
106
107
 
107
- context 'on including return in "" csv test' do
108
- str = %Q(a,b,,"d1\nd2",,f,g)
109
- equal = [['a','b',"","d1\nd2","",'f','g']]
108
+ context 'on including return in "" csv test' do
109
+ str = %Q(a,b,,"d1\nd2",,f,g)
110
+ equal = [['a','b',"","d1\nd2","",'f','g']]
110
111
 
111
- describe "sepalated with simply ',' == #{str} " do
112
- it "shuld be #{equal.to_s}" do
113
- expect(BetterCsv.parse(str)).to eq(equal)
112
+ describe "sepalated with simply ',' == #{str} " do
113
+ it "shuld be #{equal.to_s}" do
114
+ expect(BetterCsv.parse(str)).to eq(equal)
115
+ end
114
116
  end
115
- end
116
117
 
117
- describe "each value has native return." do
118
- it 'shuld be "d1\nd2"' do
119
- expect(BetterCsv.parse(str)[0][3]).to eq("d1\nd2")
118
+ describe "each value has native return." do
119
+ it 'shuld be "d1\nd2"' do
120
+ expect(BetterCsv.parse(str)[0][3]).to eq("d1\nd2")
121
+ end
120
122
  end
121
123
  end
122
- end
123
124
 
124
125
 
125
- context 'on including comma, in "" csv test' do
126
- str = %Q(a,b,,"d1,d2",,f,g)
127
- equal = [['a','b',"","d1,d2","",'f','g']]
126
+ context 'on including comma, in "" csv test' do
127
+ str = %Q(a,b,,"d1,d2",,f,g)
128
+ equal = [['a','b',"","d1,d2","",'f','g']]
128
129
 
129
- describe "sepalated with simply ',' == #{str} " do
130
- it "shuld be #{equal.to_s}" do
131
- expect(BetterCsv.parse(str)).to eq(equal)
130
+ describe "sepalated with simply ',' == #{str} " do
131
+ it "shuld be #{equal.to_s}" do
132
+ expect(BetterCsv.parse(str)).to eq(equal)
133
+ end
132
134
  end
133
135
  end
134
- end
135
136
 
136
- context 'on including comma, in "" csv on multiple lines' do
137
- str = <<-EOS
137
+ context 'on including comma, in "" csv on multiple lines' do
138
+ str = <<-EOS
138
139
  a,b,,"d1,d2",,f,g
139
140
  a,b,,"d1,d2",,f,g
140
- EOS
141
- equal = [['a','b',"","d1,d2","",'f','g'],['a','b',"","d1,d2","",'f','g']]
141
+ EOS
142
+ equal = [['a','b',"","d1,d2","",'f','g'],['a','b',"","d1,d2","",'f','g']]
142
143
 
143
- describe "sepalated with simply ',' == #{str} " do
144
- it "shuld be #{equal.to_s}" do
145
- expect(BetterCsv.parse(str)).to eq(equal)
144
+ describe "sepalated with simply ',' == #{str} " do
145
+ it "shuld be #{equal.to_s}" do
146
+ expect(BetterCsv.parse(str)).to eq(equal)
147
+ end
146
148
  end
147
149
  end
148
- end
149
150
 
150
- context 'on including comma, in "" csv on multiple lines with yield block' do
151
- str = <<-EOS
151
+ context 'on including comma, in "" csv on multiple lines with yield block' do
152
+ str = <<-EOS
152
153
  a,b,,"d1,d2",,f,g
153
154
  a,b,,"d1,d2",,f,g
154
- EOS
155
- equal = [['a','b',"","d1,d2","",'f','g'],['a','b',"","d1,d2","",'f','g']]
156
- describe "sepalated with simply ',' == #{str} " do
157
- it "shuld be raise no error" do
158
- expect{
159
- BetterCsv.parse(str) do |line|
160
- p line
161
- end
162
- }.to_not raise_error
155
+ EOS
156
+ equal = [['a','b',"","d1,d2","",'f','g'],['a','b',"","d1,d2","",'f','g']]
157
+ describe "sepalated with simply ',' == #{str} " do
158
+ it "shuld be raise no error" do
159
+ expect{
160
+ BetterCsv.parse(str) do |line|
161
+ p line
162
+ end
163
+ }.to_not raise_error
164
+ end
165
+
166
+ it "shuld be #{equal.to_s}" do
167
+ expect{
168
+ BetterCsv.parse(str) do |line|
169
+ p line
170
+ end
171
+ }.to_not raise_error
172
+ end
163
173
  end
174
+ end
175
+ end
164
176
 
165
- it "shuld be #{equal.to_s}" do
166
- expect{
167
- BetterCsv.parse(str) do |line|
168
- p line
169
- end
170
- }.to_not raise_error
177
+ context 'build' do
178
+ context 'on array' do
179
+ it 'should be 2 rows, and 3 values' do
180
+ eq_str = '"a","b","c"
181
+ "d","e","f"'
182
+ expect(BetterCsv[[["a","b","c"],['d','e','f']]]).to eq(eq_str)
183
+ end
184
+ end
185
+
186
+ context 'on string without any comma' do
187
+ it 'should be 1 rows, and 1 values' do
188
+ eq_str = '"abc"'
189
+ expect(BetterCsv["abc"]).to eq(eq_str)
190
+ end
191
+ end
192
+
193
+ context 'on string with 2 commas.' do
194
+ it 'should be 1 rows, and 3 values' do
195
+ eq_str = '"a","b","c"'
196
+ expect(BetterCsv.build("a,b,c", options:[:split_by_comma])).to eq(eq_str)
197
+ end
198
+ end
199
+
200
+ context 'on hash with integer' do
201
+ it 'should be 3 rows, and 1 each values' do
202
+ eq_str = '"10"
203
+ "20"
204
+ "30"'
205
+ expect(BetterCsv[{a: 10, b: 20, c: 30}]).to eq(eq_str)
171
206
  end
172
207
  end
173
- end
174
208
 
209
+ context 'on hash that parcialy including string with comma' do
210
+ it 'should be 3 rows, and 3,1,1 values' do
211
+ eq_str = '"a","b","c"
212
+ "20"
213
+ "30"'
214
+ expect(BetterCsv.build({a: "a,b,c", b: 20, c: 30}, options: [:split_by_comma])).to eq(eq_str)
215
+ end
216
+ end
217
+ end
175
218
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: better_csv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tatumaki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-04 00:00:00.000000000 Z
11
+ date: 2015-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler