honey_format 0.12.0 → 0.13.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/LICENSE.txt +1 -1
- data/README.md +184 -66
- data/bin/benchmark +23 -52
- data/exe/honey_format +20 -59
- data/honey_format.gemspec +2 -2
- data/lib/honey_format.rb +31 -0
- data/lib/honey_format/cli/benchmark_cli.rb +124 -0
- data/lib/honey_format/cli/cli.rb +81 -0
- data/lib/honey_format/cli/result_writer.rb +38 -0
- data/lib/honey_format/configuration.rb +26 -0
- data/lib/honey_format/csv.rb +49 -52
- data/lib/honey_format/errors.rb +6 -2
- data/lib/honey_format/header.rb +27 -29
- data/lib/honey_format/{convert_header_value.rb → header_column_converter.rb} +9 -6
- data/lib/honey_format/matrix.rb +90 -0
- data/lib/honey_format/row.rb +1 -1
- data/lib/honey_format/row_builder.rb +27 -6
- data/lib/honey_format/rows.rb +12 -5
- data/lib/honey_format/value_converter.rb +112 -0
- data/lib/honey_format/version.rb +1 -1
- metadata +12 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c4d5fc0d404dc7820a766b51307451f8900497495e51b42414498c569dbf782
|
4
|
+
data.tar.gz: 96faa29782adeb254a1a8c3e9a4a2a2f19bd88d261bce4a96675ad9f234d6ae4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6dd3cd150abd94f14b9f4416b2dc5d42756b1901f963144e8850cafe344ce657443f188d32d4cc008437a3d42430cda9b02a0d25f741f0417ede3b838cc848a8
|
7
|
+
data.tar.gz: 0ec2641fc7346b44376460a8587a70248f7f61d249d3277e6a9a50f7d2f2f8b7ad8225f4f1bb4e1d797ee6adc85242026acb71ec9c8526499f403b86bd608d6c
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
# HEAD
|
2
|
+
|
3
|
+
# v0.13.0
|
4
|
+
|
5
|
+
:warning: This release contains some backwards compatible changes.
|
6
|
+
|
7
|
+
* Extract `Matrix` super class from `CSV`
|
8
|
+
* Add `Header#empty?` and `Rows#empty?`
|
9
|
+
* Value converters [[#PR15](https://github.com/buren/honey_format/pull/15)]
|
10
|
+
+ Convert column value to number, date, etc..
|
11
|
+
+ Additional converters in [[#PR20](https://github.com/buren/honey_format/pull/20)]
|
12
|
+
* Add support for CSV row delimiter and quote character [[#PR15](https://github.com/buren/honey_format/pull/15)]
|
13
|
+
* :warning: `CSV#header` now returns an instance of `Header` instead of an array of the original header columns [[#PR15](https://github.com/buren/honey_format/pull/15)]
|
14
|
+
* Add `--[no-]rows-only` CLI option
|
15
|
+
* Rename `--[no-]only-header` CLI option to `--[no-]header-only`
|
16
|
+
|
1
17
|
# v0.12.0
|
2
18
|
|
3
19
|
* Add `--[no-]only-header` option to CLI
|
data/LICENSE.txt
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
The MIT License (MIT)
|
2
2
|
|
3
|
-
Copyright (c)
|
3
|
+
Copyright (c) 2018 Jacob Burenstam Linder
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
@@ -1,28 +1,40 @@
|
|
1
|
-
# HoneyFormat [](https://travis-ci.org/buren/honey_format) [](https://codeclimate.com/github/buren/honey_format) [](
|
1
|
+
# HoneyFormat [](https://travis-ci.org/buren/honey_format) [](https://codeclimate.com/github/buren/honey_format) [](https://www.rubydoc.info/gems/honey_format/)
|
2
2
|
|
3
|
-
|
3
|
+
> Makes working with CSVs as smooth as honey.
|
4
|
+
|
5
|
+
Proper objects for CSV headers and rows, convert column values, filter columns and rows, small(-ish) perfomance overhead, no dependencies other than Ruby stdlib.
|
4
6
|
|
5
7
|
## Features
|
6
8
|
|
7
9
|
- Proper objects for CSV header and rows
|
8
|
-
- Convert column values
|
10
|
+
- Convert column values
|
11
|
+
- Pass your own custom row builder
|
9
12
|
- Convert header column names
|
10
|
-
-
|
11
|
-
- [CLI](#cli)
|
13
|
+
- Filter what columns and rows are included in CSV output
|
14
|
+
- [CLI](#cli) - Simple command line interface
|
15
|
+
- Only ~5-10% overhead from using Ruby CSV, see [benchmarks](#benchmark)
|
12
16
|
- Has no dependencies other than Ruby stdlib
|
13
17
|
- Supports Ruby >= 2.3
|
14
18
|
|
15
|
-
|
19
|
+
Read the [usage section](#usage), [RubyDoc](https://www.rubydoc.info/gems/honey_format/) or [examples/ directory](https://github.com/buren/honey_format/tree/master/examples) for how to use this gem.
|
20
|
+
|
21
|
+
## Quick use
|
16
22
|
|
17
|
-
See [examples/](https://github.com/buren/honey_format/tree/master/examples) for more examples.
|
18
23
|
|
19
24
|
```ruby
|
20
|
-
csv_string =
|
21
|
-
|
22
|
-
|
25
|
+
csv_string = <<-CSV
|
26
|
+
Id,Username,Email
|
27
|
+
1,buren,buren@example.com
|
28
|
+
2,jacob,jacob@example.com
|
29
|
+
CSV
|
30
|
+
csv = HoneyFormat::CSV.new(csv_string, type_map: { id: :integer })
|
31
|
+
csv.columns # => [:id, :username]
|
23
32
|
user = csv.rows # => [#<struct id="1", username="buren">]
|
24
|
-
user.id # =>
|
33
|
+
user.id # => 1
|
25
34
|
user.username # => "buren"
|
35
|
+
|
36
|
+
csv.to_csv(columns: [:id, :username]) { |row| row.id < 2 }
|
37
|
+
# => "id,username\n1,buren\n"
|
26
38
|
```
|
27
39
|
|
28
40
|
## Installation
|
@@ -45,21 +57,73 @@ $ gem install honey_format
|
|
45
57
|
|
46
58
|
## Usage
|
47
59
|
|
48
|
-
By default assumes a header in the CSV file
|
60
|
+
By default assumes a header in the CSV file
|
49
61
|
|
50
62
|
```ruby
|
51
63
|
csv_string = "Id,Username\n1,buren"
|
52
64
|
csv = HoneyFormat::CSV.new(csv_string)
|
53
|
-
csv.header # => ["Id", "Username"]
|
54
|
-
csv.columns # => [:id, :username]
|
55
65
|
|
66
|
+
# Header
|
67
|
+
header = csv.header
|
68
|
+
header.original # => ["Id", "Username"]
|
69
|
+
header.columns # => [:id, :username]
|
70
|
+
|
71
|
+
|
72
|
+
# Rows
|
56
73
|
rows = csv.rows # => [#<struct id="1", username="buren">]
|
57
74
|
user = rows.first
|
58
75
|
user.id # => "1"
|
59
76
|
user.username # => "buren"
|
60
77
|
```
|
61
78
|
|
62
|
-
|
79
|
+
Set delimiter & quote character
|
80
|
+
```ruby
|
81
|
+
csv_string = "name;id|'John Doe';42"
|
82
|
+
csv = HoneyFormat::CSV.new(
|
83
|
+
csv_string,
|
84
|
+
delimiter: ';',
|
85
|
+
row_delimiter: '|',
|
86
|
+
quote_character: "'",
|
87
|
+
)
|
88
|
+
```
|
89
|
+
|
90
|
+
__Type converters__
|
91
|
+
|
92
|
+
> Type converters are great if you want to convert column values, like numbers and dates.
|
93
|
+
|
94
|
+
There are a few default type converters
|
95
|
+
```ruby
|
96
|
+
csv_string = "Id,Username\n1,buren"
|
97
|
+
type_map = { id: :integer }
|
98
|
+
csv = HoneyFormat::CSV.new(csv_string, type_map: type_map)
|
99
|
+
csv.rows.first.id # => 1
|
100
|
+
```
|
101
|
+
|
102
|
+
Add your own converter
|
103
|
+
```ruby
|
104
|
+
HoneyFormat.configure do |config|
|
105
|
+
config.converter.register :upcased, proc { |v| v.upcase }
|
106
|
+
end
|
107
|
+
|
108
|
+
csv_string = "Id,Username\n1,buren"
|
109
|
+
type_map = { username: :upcased }
|
110
|
+
csv = HoneyFormat::CSV.new(csv_string, type_map: type_map)
|
111
|
+
csv.rows.first.username # => "BUREN"
|
112
|
+
```
|
113
|
+
|
114
|
+
Access registered converters
|
115
|
+
```ruby
|
116
|
+
decimal_converter = HoneyFormat.value_converter[:decimal]
|
117
|
+
decimal_converter.call('1.1') # => 1.1
|
118
|
+
```
|
119
|
+
|
120
|
+
See [`ValueConverter::DEFAULT_CONVERTERS`](https://github.com/buren/honey_format/tree/master/lib/honey_format/value_converter.rb) for a complete list of the default ones.
|
121
|
+
|
122
|
+
__Row builder__
|
123
|
+
|
124
|
+
> Pass your own row builder if you want more control of the entire row or if you want to return your own row object.
|
125
|
+
|
126
|
+
Custom row builder
|
63
127
|
```ruby
|
64
128
|
csv_string = "Id,Username\n1,buren"
|
65
129
|
upcaser = ->(row) { row.tap { |r| r.username.upcase! } }
|
@@ -67,26 +131,38 @@ csv = HoneyFormat::CSV.new(csv_string, row_builder: upcaser)
|
|
67
131
|
csv.rows # => [#<struct id="1", username="BUREN">]
|
68
132
|
```
|
69
133
|
|
70
|
-
|
134
|
+
As long as the row builder responds to `#call` you can pass anything you like
|
71
135
|
```ruby
|
72
136
|
class Anonymizer
|
73
|
-
def
|
137
|
+
def call(row)
|
138
|
+
@cache ||= {}
|
74
139
|
# Return an object you want to represent the row
|
75
140
|
row.tap do |r|
|
76
|
-
|
77
|
-
r.email
|
78
|
-
r.
|
141
|
+
# given the same value make sure to return the same anonymized value every time
|
142
|
+
@cache[r.email] ||= "#{SecureRandom.hex(6)}@example.com"
|
143
|
+
r.email = @cache[r.email]
|
79
144
|
r.payment_id = '<scrubbed>'
|
80
145
|
end
|
81
146
|
end
|
82
147
|
end
|
83
148
|
|
84
|
-
csv_string =
|
85
|
-
|
86
|
-
|
149
|
+
csv_string = <<~CSV
|
150
|
+
Email,Payment ID
|
151
|
+
buren@example.com,123
|
152
|
+
buren@example.com,998
|
153
|
+
CSV
|
154
|
+
csv = HoneyFormat::CSV.new(csv_string, row_builder: Anonymizer.new)
|
155
|
+
csv.rows.to_csv(columns: [:email])
|
156
|
+
# => 8f6ed70a7f98@example.com
|
157
|
+
# 8f6ed70a7f98@example.com
|
158
|
+
# 0db96f350cea@example.com
|
87
159
|
```
|
88
160
|
|
89
|
-
|
161
|
+
__Output CSV__
|
162
|
+
|
163
|
+
> Makes it super easy to output a subset of columns/rows.
|
164
|
+
|
165
|
+
Manipulate the rows before output
|
90
166
|
```ruby
|
91
167
|
csv_string = "Id,Username\n1,buren"
|
92
168
|
csv = HoneyFormat::CSV.new(csv_string)
|
@@ -94,35 +170,33 @@ csv.rows.each { |row| row.id = nil }
|
|
94
170
|
csv.to_csv # => "id,username\n,buren\n"
|
95
171
|
```
|
96
172
|
|
97
|
-
Output a subset of columns
|
173
|
+
Output a subset of columns
|
98
174
|
```ruby
|
99
175
|
csv_string = "Id, Username, Country\n1,buren,Sweden"
|
100
176
|
csv = HoneyFormat::CSV.new(csv_string)
|
101
177
|
csv.to_csv(columns: [:id, :country]) # => "id,country\nburen,Sweden\n"
|
102
178
|
```
|
103
179
|
|
104
|
-
Output a subset of rows
|
180
|
+
Output a subset of rows
|
105
181
|
```ruby
|
106
182
|
csv_string = "Name, Country\nburen,Sweden\njacob,Denmark"
|
107
183
|
csv = HoneyFormat::CSV.new(csv_string)
|
108
184
|
csv.to_csv { |row| row.country == 'Sweden' } # => "name,country\nburen,Sweden\n"
|
109
185
|
```
|
110
186
|
|
111
|
-
|
112
|
-
```ruby
|
113
|
-
HoneyFormat::CSV.new(csv_string, delimiter: ';')
|
114
|
-
```
|
187
|
+
__Headers__
|
115
188
|
|
116
|
-
|
189
|
+
> By default generates method-like names for each header column, but also gives you full control: define them or convert them.
|
190
|
+
|
191
|
+
By default assumes a header in the CSV file.
|
117
192
|
```ruby
|
118
193
|
csv_string = "Id,Username\n1,buren"
|
119
|
-
|
120
|
-
HoneyFormat::CSV.new(csv_string, valid_columns: [:something, :username])
|
121
|
-
# => HoneyFormat::UnknownHeaderColumnError (column :id not in [:something, :username])
|
194
|
+
csv = HoneyFormat::CSV.new(csv_string)
|
122
195
|
|
123
|
-
#
|
124
|
-
|
125
|
-
|
196
|
+
# Header
|
197
|
+
header = csv.header
|
198
|
+
header.original # => ["Id", "Username"]
|
199
|
+
header.columns # => [:id, :username]
|
126
200
|
```
|
127
201
|
|
128
202
|
Define header
|
@@ -132,32 +206,33 @@ csv = HoneyFormat::CSV.new(csv_string, header: ['Id', 'Username'])
|
|
132
206
|
csv.rows.first.username # => "buren"
|
133
207
|
```
|
134
208
|
|
135
|
-
|
136
|
-
things can get a little awkward..
|
209
|
+
Set default header converter
|
137
210
|
```ruby
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
# "ÅÄÖ".downcase # => "ÅÄÖ"
|
142
|
-
user.ÅÄÖ # => "Swedish characters"
|
143
|
-
# while on Ruby > 2.3
|
144
|
-
user.åäö
|
211
|
+
HoneyFormat.configure do |config|
|
212
|
+
config.header_converter = proc { |v| v.downcase }
|
213
|
+
end
|
145
214
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
215
|
+
# you can get the default one with
|
216
|
+
header_converter = HoneyFormat.value_converter[:header_column]
|
217
|
+
header_converter.call('First name') # => "first_name"
|
218
|
+
```
|
219
|
+
|
220
|
+
Use any value converter as the header converter
|
221
|
+
```ruby
|
222
|
+
csv_string = "Id,Username\n1,buren"
|
223
|
+
csv = HoneyFormat::CSV.new(csv_string, header_converter: :upcase)
|
224
|
+
csv.columns # => [:ID, :USERNAME]
|
151
225
|
```
|
152
226
|
|
153
227
|
Pass your own header converter
|
154
228
|
```ruby
|
155
229
|
map = { 'First^Name' => :first_name }
|
156
|
-
converter = ->(column) { map.fetch(column, column) }
|
230
|
+
converter = ->(column) { map.fetch(column, column.downcase) }
|
157
231
|
|
158
|
-
csv_string = "First^Name\
|
232
|
+
csv_string = "ID,First^Name\n1,Jacob"
|
159
233
|
user = HoneyFormat::CSV.new(csv_string, header_converter: converter).rows.first
|
160
234
|
user.first_name # => "Jacob"
|
235
|
+
user.id # => "1"
|
161
236
|
```
|
162
237
|
|
163
238
|
Missing header values
|
@@ -168,9 +243,30 @@ user = csv.rows.first
|
|
168
243
|
user.column1 # => "val1"
|
169
244
|
```
|
170
245
|
|
171
|
-
|
246
|
+
If your header contains special chars and/or chars that can't be part of Ruby method names,
|
247
|
+
things can get a little awkward..
|
248
|
+
```ruby
|
249
|
+
csv_string = "ÅÄÖ\nSwedish characters"
|
250
|
+
user = HoneyFormat::CSV.new(csv_string).rows.first
|
251
|
+
# Note that these chars aren't "downcased" in Ruby 2.3 and older versions of Ruby,
|
252
|
+
# "ÅÄÖ".downcase # => "ÅÄÖ"
|
253
|
+
user.ÅÄÖ # => "Swedish characters"
|
254
|
+
# while on Ruby > 2.3
|
255
|
+
user.åäö
|
256
|
+
|
257
|
+
csv_string = "First^Name\nJacob"
|
258
|
+
user = HoneyFormat::CSV.new(csv_string).rows.first
|
259
|
+
user.public_send(:"first^name") # => "Jacob"
|
260
|
+
# or
|
261
|
+
user['first^name'] # => "Jacob"
|
262
|
+
```
|
263
|
+
|
264
|
+
__Errors__
|
265
|
+
|
266
|
+
> When you need that some extra safety.
|
267
|
+
|
268
|
+
If you want to there are some errors you can rescue
|
172
269
|
```ruby
|
173
|
-
# there are two error super classes
|
174
270
|
begin
|
175
271
|
HoneyFormat::CSV.new(csv_string)
|
176
272
|
rescue HoneyFormat::HeaderError => e
|
@@ -184,13 +280,17 @@ end
|
|
184
280
|
|
185
281
|
You can see all [available errors here](https://www.rubydoc.info/gems/honey_format/HoneyFormat/Errors).
|
186
282
|
|
187
|
-
If you want to see more usage examples check out the `spec/`
|
283
|
+
If you want to see more usage examples check out the [`examples/`](https://github.com/buren/honey_format/tree/master/examples) and [`spec/`](https://github.com/buren/honey_format/tree/master/spec) directories.
|
188
284
|
|
189
285
|
## CLI
|
190
286
|
|
287
|
+
> Perfect when you want to get something simple done quickly.
|
288
|
+
|
191
289
|
```
|
192
290
|
Usage: honey_format [file.csv] [options]
|
193
291
|
--csv=input.csv CSV file
|
292
|
+
--[no-]header-only Print only the header
|
293
|
+
--[no-]rows-only Print only the rows
|
194
294
|
--columns=id,name Select columns.
|
195
295
|
--output=output.csv CSV output (STDOUT otherwise)
|
196
296
|
--delimiter=, CSV delimiter (default: ,)
|
@@ -198,30 +298,48 @@ Usage: honey_format [file.csv] [options]
|
|
198
298
|
--version Show version
|
199
299
|
```
|
200
300
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
301
|
+
Output a subset of columns to a new file
|
302
|
+
```
|
303
|
+
# input.csv
|
304
|
+
id,name,username
|
305
|
+
1,jacob,buren
|
306
|
+
```
|
206
307
|
|
207
308
|
```
|
208
|
-
$
|
309
|
+
$ honey_format input.csv --columns=id,username > output.csv
|
209
310
|
```
|
210
311
|
|
312
|
+
|
313
|
+
## Benchmark
|
314
|
+
|
315
|
+
_Note_: This gem, adds some overhead to parsing a CSV string, typically ~5-10%. I've included some benchmarks below, your mileage may vary..
|
316
|
+
|
211
317
|
204KB (1k lines)
|
212
318
|
|
213
319
|
```
|
214
|
-
|
215
|
-
|
320
|
+
CSV no options: 51.0 i/s
|
321
|
+
CSV with header: 36.1 i/s - 1.41x slower
|
322
|
+
HoneyFormat::CSV: 48.7 i/s - 1.05x slower
|
216
323
|
```
|
217
324
|
|
218
325
|
2MB (10k lines)
|
219
326
|
|
220
327
|
```
|
221
|
-
|
222
|
-
|
328
|
+
CSV no options: 5.1 i/s
|
329
|
+
CSV with header: 3.6 i/s - 1.42x slower
|
330
|
+
HoneyFormat::CSV: 4.9 i/s - 1.05x slower
|
223
331
|
```
|
224
332
|
|
333
|
+
You can run the benchmarks yourself
|
334
|
+
```
|
335
|
+
Usage: bin/benchmark [file.csv] [options]
|
336
|
+
--csv=[file1.csv] CSV file(s)
|
337
|
+
--[no-]verbose Verbose output
|
338
|
+
--lines-multipliers=[1,2,10] Multiply the rows in the CSV file (default: 1)
|
339
|
+
--time=[30] Benchmark time (default: 30)
|
340
|
+
--warmup=[30] Benchmark warmup (default: 30)
|
341
|
+
-h, --help How to use
|
342
|
+
```
|
225
343
|
|
226
344
|
## Development
|
227
345
|
|
data/bin/benchmark
CHANGED
@@ -4,72 +4,43 @@ require 'honey_format'
|
|
4
4
|
|
5
5
|
require 'benchmark/ips'
|
6
6
|
require 'csv'
|
7
|
-
require 'optparse'
|
8
7
|
|
9
|
-
|
10
|
-
benchmark_time = 30
|
11
|
-
benchmark_warmup = 5
|
12
|
-
lines_multipliers = [1]
|
8
|
+
require 'honey_format/cli/benchmark_cli'
|
13
9
|
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
cli = HoneyFormat::BenchmarkCLI.new
|
11
|
+
Writer = cli.writer
|
12
|
+
options = cli.options
|
17
13
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
parser.on("--lines-multipliers=[1,10,50]", Array, "Multiply the rows in the CSV file (default: 1)") do |value|
|
23
|
-
lines_multipliers = value.map do |v|
|
24
|
-
Integer(v).tap do |int|
|
25
|
-
unless int >= 1
|
26
|
-
raise(ArgumentError, '--lines-multiplier must be 1 or greater')
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
parser.on("--time=[30]", String, "Benchmark time (default: 30)") do |value|
|
33
|
-
benchmark_time = Integer(value)
|
34
|
-
end
|
35
|
-
|
36
|
-
parser.on("--warmup=[30]", String, "Benchmark warmup (default: 30)") do |value|
|
37
|
-
benchmark_warmup = Integer(value)
|
38
|
-
end
|
39
|
-
|
40
|
-
parser.on("-h", "--help", "How to use") do
|
41
|
-
puts parser
|
42
|
-
exit
|
43
|
-
end
|
14
|
+
input_path = options[:input_path]
|
15
|
+
benchmark_time = options[:benchmark_time]
|
16
|
+
benchmark_warmup = options[:benchmark_warmup]
|
17
|
+
lines_multipliers = options[:lines_multipliers]
|
44
18
|
|
45
|
-
|
46
|
-
|
47
|
-
puts parser
|
48
|
-
exit
|
49
|
-
end
|
50
|
-
end.parse!
|
19
|
+
original_csv = input_path ? File.read(input_path) : cli.fetch_default_benchmark_csv
|
20
|
+
original_csv_lines = original_csv.lines
|
51
21
|
|
52
|
-
|
22
|
+
runtime_seconds = cli.expected_runtime_seconds(report_count: 3)
|
23
|
+
Writer.puts "Expected runtime: ~#{runtime_seconds} seconds.", verbose: true
|
53
24
|
|
54
|
-
lines_multipliers.
|
55
|
-
|
56
|
-
|
57
|
-
rows = orignial_csv_lines[1..-1] * lines_multiplier
|
58
|
-
csv = orignial_csv_lines.first + rows.join
|
59
|
-
end
|
25
|
+
lines_multipliers.each_with_index do |lines_multiplier, index|
|
26
|
+
rows = original_csv_lines[1..-1] * lines_multiplier
|
27
|
+
csv = original_csv_lines.first + rows.join
|
60
28
|
|
61
29
|
line_count = csv.lines.length
|
62
30
|
|
63
|
-
puts "==
|
31
|
+
Writer.puts "== Benchmark #{index + 1} of #{lines_multipliers.length} =="
|
32
|
+
Writer.puts "path #{cli.used_input_path}"
|
33
|
+
Writer.puts "lines #{line_count}"
|
34
|
+
Writer.puts "multiplier #{lines_multiplier}"
|
35
|
+
|
64
36
|
Benchmark.ips do |x|
|
65
37
|
x.time = benchmark_time
|
66
38
|
x.warmup = benchmark_warmup
|
67
39
|
|
68
|
-
x.report('
|
69
|
-
x.report('
|
70
|
-
x.report('HoneyFormat::CSV')
|
40
|
+
x.report('CSV no options') { CSV.parse(csv) }
|
41
|
+
x.report('CSV with header') { CSV.parse(csv, headers: true) }
|
42
|
+
x.report('HoneyFormat::CSV') { HoneyFormat::CSV.new(csv).rows }
|
71
43
|
|
72
44
|
x.compare!
|
73
45
|
end
|
74
|
-
puts "== [END] Benchmark for #{line_count} lines =="
|
75
46
|
end
|