csv_monster 0.1.1 → 0.2.0

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.
data/lib/csv_monster.rb CHANGED
@@ -40,7 +40,7 @@ class CSVMonster
40
40
  content.length
41
41
  end
42
42
 
43
- def split split_count
43
+ def split(split_count)
44
44
  header, *entries = self.content
45
45
  splits = []
46
46
 
@@ -57,6 +57,8 @@ class CSVMonster
57
57
  splits
58
58
  end
59
59
 
60
+ alias_method :'/', :split
61
+
60
62
  def write! outfile = nil
61
63
  outfile ||= default_outfile_name
62
64
  CSV.open(outfile, "wb") do |csv|
@@ -1,3 +1,3 @@
1
1
  class CSVMonster
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -18,60 +18,80 @@ end
18
18
 
19
19
  describe CSVMonster do
20
20
  describe "#+" do
21
- let(:csv_monster) { described_class.new sample_csv_filepath }
22
- let(:another_csv_monster) { described_class.new another_sample_csv_filepath }
21
+ let(:csv_monster) { described_class.new(sample_csv_filepath) }
22
+ let(:another_csv_monster) { described_class.new(another_sample_csv_filepath) }
23
23
 
24
- subject { csv_monster + another_csv_monster }
24
+ subject { csv_monster + another_csv_monster }
25
25
 
26
26
  it "yields a new instance with the combination of the two's content" do
27
- expect(csv_monster.content).to eq [["header_1", "header_2"],
28
- ["row_1_column_1_entry", "row_1_column_2_entry"],
29
- ["row_2_column_1_entry", "row_2_column_2_entry"]]
30
-
31
- expect(another_csv_monster.content).to eq [["header_1", "header_2"],
32
- ["row_1_column_1_entry_diff_content", "row_1_column_2_entry_diff_content"],
33
- ["row_2_column_1_entry_diff_content", "row_2_column_2_entry_diff_content"]]
27
+ expect(csv_monster.content).to eq(
28
+ [
29
+ ["header_1", "header_2"],
30
+ ["row_1_column_1_entry", "row_1_column_2_entry"],
31
+ ["row_2_column_1_entry", "row_2_column_2_entry"]
32
+ ]
33
+ )
34
+
35
+ expect(another_csv_monster.content).to eq(
36
+ [
37
+ ["header_1", "header_2"],
38
+ ["row_1_column_1_entry_diff_content", "row_1_column_2_entry_diff_content"],
39
+ ["row_2_column_1_entry_diff_content", "row_2_column_2_entry_diff_content"]
40
+ ]
41
+ )
34
42
 
35
43
  result = subject
36
44
 
37
- expect(csv_monster.content).to eq [["header_1", "header_2"],
38
- ["row_1_column_1_entry", "row_1_column_2_entry"],
39
- ["row_2_column_1_entry", "row_2_column_2_entry"]]
40
-
41
- expect(another_csv_monster.content).to eq [["header_1", "header_2"],
42
- ["row_1_column_1_entry_diff_content", "row_1_column_2_entry_diff_content"],
43
- ["row_2_column_1_entry_diff_content", "row_2_column_2_entry_diff_content"]]
44
-
45
- expect(result.content).to eq [["header_1", "header_2"],
46
- ["row_1_column_1_entry", "row_1_column_2_entry"],
47
- ["row_2_column_1_entry", "row_2_column_2_entry"],
48
- ["row_1_column_1_entry_diff_content", "row_1_column_2_entry_diff_content"],
49
- ["row_2_column_1_entry_diff_content", "row_2_column_2_entry_diff_content"]]
45
+ expect(csv_monster.content).to eq(
46
+ [
47
+ ["header_1", "header_2"],
48
+ ["row_1_column_1_entry", "row_1_column_2_entry"],
49
+ ["row_2_column_1_entry", "row_2_column_2_entry"]
50
+ ]
51
+ )
52
+
53
+ expect(another_csv_monster.content).to eq(
54
+ [
55
+ ["header_1", "header_2"],
56
+ ["row_1_column_1_entry_diff_content", "row_1_column_2_entry_diff_content"],
57
+ ["row_2_column_1_entry_diff_content", "row_2_column_2_entry_diff_content"]
58
+ ]
59
+ )
60
+
61
+ expect(result.content).to eq(
62
+ [
63
+ ["header_1", "header_2"],
64
+ ["row_1_column_1_entry", "row_1_column_2_entry"],
65
+ ["row_2_column_1_entry", "row_2_column_2_entry"],
66
+ ["row_1_column_1_entry_diff_content", "row_1_column_2_entry_diff_content"],
67
+ ["row_2_column_1_entry_diff_content", "row_2_column_2_entry_diff_content"]
68
+ ]
69
+ )
50
70
  end
51
71
  end
52
72
 
53
73
  describe "#==" do
54
- let(:csv_monster) { described_class.new }
74
+ let(:csv_monster) { described_class.new }
55
75
  let(:another_csv_monster) { described_class.new }
56
76
 
57
77
  context "when the content is the same" do
58
78
  before do
59
- csv_monster.filepaths = sample_csv_filepath
79
+ csv_monster.filepaths = sample_csv_filepath
60
80
  another_csv_monster.filepaths = sample_csv_filepath
61
81
  end
62
82
 
63
83
  subject { csv_monster == another_csv_monster }
64
- it { expect(subject).to be_true }
84
+ it { expect(subject).to be_true }
65
85
  end
66
86
 
67
87
  context "when the content is different" do
68
88
  before do
69
- csv_monster.filepaths = sample_csv_filepath
89
+ csv_monster.filepaths = sample_csv_filepath
70
90
  another_csv_monster.filepaths = another_sample_csv_filepath
71
91
  end
72
92
 
73
93
  subject { csv_monster == another_csv_monster }
74
- it { expect(subject).to be_false }
94
+ it { expect(subject).to be_false }
75
95
  end
76
96
  end
77
97
 
@@ -79,33 +99,101 @@ describe CSVMonster do
79
99
  let(:csv_monster) { described_class.new }
80
100
 
81
101
  context "with a single csv file" do
82
- before { csv_monster.filepaths = sample_csv_filepath }
102
+ before { csv_monster.filepaths = sample_csv_filepath }
83
103
  subject { csv_monster.content }
84
- it { expect(subject).to eq [["header_1", "header_2"],
85
- ["row_1_column_1_entry", "row_1_column_2_entry"],
86
- ["row_2_column_1_entry", "row_2_column_2_entry"]] }
104
+ it {
105
+ expect(subject).to eq(
106
+ [
107
+ ["header_1", "header_2"],
108
+ ["row_1_column_1_entry", "row_1_column_2_entry"],
109
+ ["row_2_column_1_entry", "row_2_column_2_entry"]
110
+ ]
111
+ )
112
+ }
87
113
  end
88
114
 
89
115
  context "with multiple csv files" do
90
- before { csv_monster.filepaths = [sample_csv_filepath, another_sample_csv_filepath] }
116
+ before { csv_monster.filepaths = [sample_csv_filepath, another_sample_csv_filepath] }
91
117
  subject { csv_monster.content }
92
118
 
93
119
  it "combines the content, removing headers from all but the first" do
94
- expect(subject).to eq [["header_1", "header_2"],
95
- ["row_1_column_1_entry", "row_1_column_2_entry"],
96
- ["row_2_column_1_entry", "row_2_column_2_entry"],
97
- ["row_1_column_1_entry_diff_content", "row_1_column_2_entry_diff_content"],
98
- ["row_2_column_1_entry_diff_content", "row_2_column_2_entry_diff_content"]]
120
+ expect(subject).to eq(
121
+ [
122
+ ["header_1", "header_2"],
123
+ ["row_1_column_1_entry", "row_1_column_2_entry"],
124
+ ["row_2_column_1_entry", "row_2_column_2_entry"],
125
+ ["row_1_column_1_entry_diff_content", "row_1_column_2_entry_diff_content"],
126
+ ["row_2_column_1_entry_diff_content", "row_2_column_2_entry_diff_content"]
127
+ ]
128
+ )
99
129
  end
100
130
  end
101
131
  end
102
132
 
103
133
  describe "#content_length" do
104
- let(:csv_monster) { described_class.new sample_csv_filepath }
105
- subject { csv_monster.content_length }
134
+ let(:csv_monster) { described_class.new(sample_csv_filepath) }
135
+ subject { csv_monster.content_length }
106
136
 
107
137
  it "equals the number of entries" do
108
- expect(subject).to eq 3
138
+ expect(subject).to eq(3)
139
+ end
140
+ end
141
+
142
+ describe "#/" do
143
+ let(:number_of_splits) { 2 }
144
+
145
+ context "with an even number of records (excluding header)" do
146
+ let(:csv_monster) { described_class.new(sample_csv_filepath) }
147
+
148
+ subject { csv_monster / number_of_splits }
149
+
150
+ it "leaves the original instance unchanged" do
151
+ expect(csv_monster.content).to eq(
152
+ [
153
+ ["header_1", "header_2"],
154
+ ["row_1_column_1_entry", "row_1_column_2_entry"],
155
+ ["row_2_column_1_entry", "row_2_column_2_entry"]
156
+ ]
157
+ )
158
+
159
+ subject
160
+
161
+ expect(csv_monster.content).to eq(
162
+ [
163
+ ["header_1", "header_2"],
164
+ ["row_1_column_1_entry", "row_1_column_2_entry"],
165
+ ["row_2_column_1_entry", "row_2_column_2_entry"]
166
+ ]
167
+ )
168
+ end
169
+
170
+ it "returns the specified number of objects of the same type" do
171
+ result = subject
172
+
173
+ expect(result.length).to eq(number_of_splits)
174
+
175
+ expect(result[0]).to be_an_instance_of(described_class)
176
+ expect(result[1]).to be_an_instance_of(described_class)
177
+ end
178
+
179
+
180
+ it "splits the content amongst the parts evenly" do
181
+ result = subject
182
+
183
+ expect(result[0].content).to eq(
184
+ [
185
+ ["header_1", "header_2"],
186
+ ["row_1_column_1_entry", "row_1_column_2_entry"]
187
+ ]
188
+ )
189
+
190
+ expect(result[1].content).to eq(
191
+ [
192
+ ["header_1", "header_2"],
193
+ ["row_2_column_1_entry", "row_2_column_2_entry"]
194
+ ]
195
+ )
196
+ end
109
197
  end
110
198
  end
111
199
 
@@ -113,106 +201,138 @@ describe CSVMonster do
113
201
  let(:number_of_splits) { 2 }
114
202
 
115
203
  context "with an even number of records (excluding header)" do
116
- let(:csv_monster) { described_class.new sample_csv_filepath }
204
+ let(:csv_monster) { described_class.new(sample_csv_filepath) }
117
205
 
118
206
  subject { csv_monster.split(number_of_splits) }
119
207
 
120
208
  it "leaves the original instance unchanged" do
121
- expect(csv_monster.content).to eq [["header_1", "header_2"],
122
- ["row_1_column_1_entry", "row_1_column_2_entry"],
123
- ["row_2_column_1_entry", "row_2_column_2_entry"]]
209
+ expect(csv_monster.content).to eq(
210
+ [
211
+ ["header_1", "header_2"],
212
+ ["row_1_column_1_entry", "row_1_column_2_entry"],
213
+ ["row_2_column_1_entry", "row_2_column_2_entry"]
214
+ ]
215
+ )
124
216
 
125
217
  subject
126
218
 
127
- expect(csv_monster.content).to eq [["header_1", "header_2"],
128
- ["row_1_column_1_entry", "row_1_column_2_entry"],
129
- ["row_2_column_1_entry", "row_2_column_2_entry"]]
219
+ expect(csv_monster.content).to eq(
220
+ [
221
+ ["header_1", "header_2"],
222
+ ["row_1_column_1_entry", "row_1_column_2_entry"],
223
+ ["row_2_column_1_entry", "row_2_column_2_entry"]
224
+ ]
225
+ )
130
226
  end
131
227
 
132
228
  it "returns the specified number of objects of the same type" do
133
229
  result = subject
134
230
 
135
- expect(result.length).to eq number_of_splits
231
+ expect(result.length).to eq(number_of_splits)
136
232
 
137
- expect(result[0]).to be_an_instance_of described_class
138
- expect(result[1]).to be_an_instance_of described_class
233
+ expect(result[0]).to be_an_instance_of(described_class)
234
+ expect(result[1]).to be_an_instance_of(described_class)
139
235
  end
140
236
 
141
237
 
142
238
  it "splits the content amongst the parts evenly" do
143
239
  result = subject
144
240
 
145
- expect(result[0].content).to eq [["header_1", "header_2"],
146
- ["row_1_column_1_entry", "row_1_column_2_entry"]]
147
-
148
- expect(result[1].content).to eq [["header_1", "header_2"],
149
- ["row_2_column_1_entry", "row_2_column_2_entry"]]
241
+ expect(result[0].content).to eq(
242
+ [
243
+ ["header_1", "header_2"],
244
+ ["row_1_column_1_entry", "row_1_column_2_entry"]
245
+ ]
246
+ )
247
+
248
+ expect(result[1].content).to eq(
249
+ [
250
+ ["header_1", "header_2"],
251
+ ["row_2_column_1_entry", "row_2_column_2_entry"]
252
+ ]
253
+ )
150
254
  end
151
255
  end
152
256
 
153
257
  context "with an odd number of records (excluding header)" do
154
- let(:csv_monster) { described_class.new odd_number_of_records_csv_filepath }
258
+ let(:csv_monster) { described_class.new(odd_number_of_records_csv_filepath) }
155
259
 
156
260
  subject { csv_monster.split(number_of_splits) }
157
261
 
158
262
  it "leaves the original instance unchanged" do
159
- expect(csv_monster.content).to eq [["header_1", "header_2"],
160
- ["odd_row_1_column_1_entry", "odd_row_1_column_2_entry"],
161
- ["odd_row_2_column_1_entry", "odd_row_2_column_2_entry"],
162
- ["odd_row_3_column_1_entry", "odd_row_3_column_2_entry"],
163
- ["odd_row_4_column_1_entry", "odd_row_4_column_2_entry"],
164
- ["odd_row_5_column_1_entry", "odd_row_5_column_2_entry"]]
263
+ expect(csv_monster.content).to eq(
264
+ [
265
+ ["header_1", "header_2"],
266
+ ["odd_row_1_column_1_entry", "odd_row_1_column_2_entry"],
267
+ ["odd_row_2_column_1_entry", "odd_row_2_column_2_entry"],
268
+ ["odd_row_3_column_1_entry", "odd_row_3_column_2_entry"],
269
+ ["odd_row_4_column_1_entry", "odd_row_4_column_2_entry"],
270
+ ["odd_row_5_column_1_entry", "odd_row_5_column_2_entry"]
271
+ ]
272
+ )
165
273
 
166
274
  subject
167
275
 
168
- expect(csv_monster.content).to eq [["header_1", "header_2"],
169
- ["odd_row_1_column_1_entry", "odd_row_1_column_2_entry"],
170
- ["odd_row_2_column_1_entry", "odd_row_2_column_2_entry"],
171
- ["odd_row_3_column_1_entry", "odd_row_3_column_2_entry"],
172
- ["odd_row_4_column_1_entry", "odd_row_4_column_2_entry"],
173
- ["odd_row_5_column_1_entry", "odd_row_5_column_2_entry"]]
276
+ expect(csv_monster.content).to eq(
277
+ [
278
+ ["header_1", "header_2"],
279
+ ["odd_row_1_column_1_entry", "odd_row_1_column_2_entry"],
280
+ ["odd_row_2_column_1_entry", "odd_row_2_column_2_entry"],
281
+ ["odd_row_3_column_1_entry", "odd_row_3_column_2_entry"],
282
+ ["odd_row_4_column_1_entry", "odd_row_4_column_2_entry"],
283
+ ["odd_row_5_column_1_entry", "odd_row_5_column_2_entry"]
284
+ ]
285
+ )
174
286
  end
175
287
 
176
288
  it "returns the specified number of objects of the same type" do
177
289
  result = subject
178
- expect(result.length).to eq number_of_splits
179
- expect(result[0]).to be_an_instance_of described_class
180
- expect(result[1]).to be_an_instance_of described_class
290
+ expect(result.length).to eq(number_of_splits)
291
+ expect(result[0]).to be_an_instance_of(described_class)
292
+ expect(result[1]).to be_an_instance_of(described_class)
181
293
  end
182
294
 
183
295
  it "splits the content amongst the parts approximately evenly" do
184
296
  result = subject
185
297
 
186
- expect(result[0].content).to eq [["header_1", "header_2"],
187
- ["odd_row_1_column_1_entry", "odd_row_1_column_2_entry"],
188
- ["odd_row_2_column_1_entry", "odd_row_2_column_2_entry"]]
189
-
190
- expect(result[1].content).to eq [["header_1", "header_2"],
191
- ["odd_row_3_column_1_entry", "odd_row_3_column_2_entry"],
192
- ["odd_row_4_column_1_entry", "odd_row_4_column_2_entry"],
193
- ["odd_row_5_column_1_entry", "odd_row_5_column_2_entry"]]
298
+ expect(result[0].content).to eq(
299
+ [
300
+ ["header_1", "header_2"],
301
+ ["odd_row_1_column_1_entry", "odd_row_1_column_2_entry"],
302
+ ["odd_row_2_column_1_entry", "odd_row_2_column_2_entry"]
303
+ ]
304
+ )
305
+
306
+ expect(result[1].content).to eq(
307
+ [
308
+ ["header_1", "header_2"],
309
+ ["odd_row_3_column_1_entry", "odd_row_3_column_2_entry"],
310
+ ["odd_row_4_column_1_entry", "odd_row_4_column_2_entry"],
311
+ ["odd_row_5_column_1_entry", "odd_row_5_column_2_entry"]
312
+ ]
313
+ )
194
314
  end
195
315
  end
196
316
  end
197
317
 
198
318
  describe "#write!" do
199
- let(:infile) { sample_csv_filepath }
200
- let(:outfile) { File.expand_path(File.join("..", "support", "test", "write_sample.csv"), __FILE__) }
201
- let(:csv_monster) { described_class.new infile }
319
+ let(:infile) { sample_csv_filepath }
320
+ let(:outfile) { File.expand_path(File.join("..", "support", "test", "write_sample.csv"), __FILE__) }
321
+ let(:csv_monster) { described_class.new(infile) }
202
322
 
203
- before { safely_rm outfile }
204
- after { safely_rm outfile }
323
+ before { safely_rm(outfile) }
324
+ after { safely_rm(outfile) }
205
325
 
206
- subject { csv_monster.write! outfile }
326
+ subject { csv_monster.write!(outfile) }
207
327
 
208
328
  it "returns the file path it wrote to" do
209
- expect(subject).to eq outfile
329
+ expect(subject).to eq(outfile)
210
330
  end
211
331
 
212
332
  it "writes the file to the specified location" do
213
- expect(File.exists? outfile).to be_false
333
+ expect(File.exists?(outfile)).to be_false
214
334
  subject
215
- expect(FileUtils.identical? infile, outfile).to be_true
335
+ expect(FileUtils.identical?(infile, outfile)).to be_true
216
336
  end
217
337
  end
218
338
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csv_monster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -88,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
88
  version: '0'
89
89
  requirements: []
90
90
  rubyforge_project:
91
- rubygems_version: 1.8.24
91
+ rubygems_version: 1.8.21
92
92
  signing_key:
93
93
  specification_version: 3
94
94
  summary: A monster of a CSV util