honey_format 0.16.0 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.hound.yml +3 -0
  3. data/.rubocop.yml +7 -0
  4. data/.ruby-style-guide.yml +264 -0
  5. data/CHANGELOG.md +15 -0
  6. data/Gemfile +2 -0
  7. data/README.md +63 -15
  8. data/Rakefile +2 -0
  9. data/bin/benchmark +2 -0
  10. data/bin/console +1 -0
  11. data/exe/honey_format +1 -0
  12. data/honey_format.gemspec +5 -4
  13. data/lib/honey_format/cli/benchmark_cli.rb +15 -13
  14. data/lib/honey_format/cli/cli.rb +17 -12
  15. data/lib/honey_format/cli/result_writer.rb +2 -0
  16. data/lib/honey_format/configuration.rb +114 -11
  17. data/lib/honey_format/converters/convert_boolean.rb +24 -0
  18. data/lib/honey_format/converters/convert_date_and_time.rb +30 -0
  19. data/lib/honey_format/converters/convert_number.rb +33 -0
  20. data/lib/honey_format/converters/convert_string.rb +42 -0
  21. data/lib/honey_format/converters/converters.rb +12 -0
  22. data/lib/honey_format/converters/header_column_converter.rb +57 -0
  23. data/lib/honey_format/csv.rb +22 -14
  24. data/lib/honey_format/errors.rb +8 -2
  25. data/lib/honey_format/helpers/helpers.rb +41 -0
  26. data/lib/honey_format/{header.rb → matrix/header.rb} +48 -12
  27. data/lib/honey_format/matrix/matrix.rb +104 -0
  28. data/lib/honey_format/{row.rb → matrix/row.rb} +6 -3
  29. data/lib/honey_format/{row_builder.rb → matrix/row_builder.rb} +5 -4
  30. data/lib/honey_format/{rows.rb → matrix/rows.rb} +7 -4
  31. data/lib/honey_format/matrix.rb +6 -89
  32. data/lib/honey_format/registry.rb +99 -0
  33. data/lib/honey_format/version.rb +4 -2
  34. data/lib/honey_format.rb +14 -6
  35. metadata +34 -24
  36. data/lib/honey_format/header_column_converter.rb +0 -40
  37. data/lib/honey_format/value_converter.rb +0 -117
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9afe55f28e5bdd981ecf3a73fc49c52a145442c8ebf3e0c5da2e18c4d43eea6
4
- data.tar.gz: 3943032cb540bb1ce70b2cb21e99e5288d42ba06b261e08e125c0f9d895c67ae
3
+ metadata.gz: 997883e33f720a7dc6c0d3f2a552b4dcd68cfa1bac8be23d5a36332c83bf0e32
4
+ data.tar.gz: dd522a2171b7befc1e41e80022dade22d18d3d9228c8b40eb6b7d3f8d032005b
5
5
  SHA512:
6
- metadata.gz: 1476f913fa1eabc823295cc327b13ba188fb5be82e76e72e6b3d60f8d80bbda098cb4170a2d7e081026dcf9a5fdfd0f9ce0d632e5d37f064ae744c8f5ebacd34
7
- data.tar.gz: e957fbd91dd47ca60bd4581b754c6667992cdc96ac79c6f66171f90d9647db6f08387c6e6cedf0681efc5b18535fc37eb75fcb0039b3fd4fa0a6973337c49c71
6
+ metadata.gz: c6e15af7156b78f97f02e1e42f9c961116ad7e09428ccaa6eb7b0651d93f162f2417381d034b82eaefa843d0b5aceab1cfb824347db1701ed5186d575c6d88eb
7
+ data.tar.gz: dfa13256a8446d9b7f6bedf4505e9c275268999098befd62a81174ef5d682185ea4e379e07b870e3554ecdb983714bac31b1175422dd750dc07d6997b52233b9
data/.hound.yml ADDED
@@ -0,0 +1,3 @@
1
+ ruby:
2
+ config_file: .ruby-style-guide.yml
3
+ fail_on_violations: true
data/.rubocop.yml ADDED
@@ -0,0 +1,7 @@
1
+ inherit_from: .ruby-style-guide.yml
2
+ AllCops:
3
+ UseCache: true
4
+ CacheRootDirectory: tmp
5
+ Exclude:
6
+ - 'tmp/*.rb'
7
+ - 'db/schema.rb'
@@ -0,0 +1,264 @@
1
+ Rails:
2
+ Enabled: false
3
+ AllCops:
4
+ TargetRubyVersion: 2.3
5
+ Exclude:
6
+ - "vendor/**/*"
7
+ UseCache: true
8
+ Style/CollectionMethods:
9
+ Description: Preferred collection methods.
10
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#map-find-select-reduce-size
11
+ Enabled: true
12
+ PreferredMethods:
13
+ collect: map
14
+ collect!: map!
15
+ find: detect
16
+ find_all: select
17
+ reduce: inject
18
+ Style/RedundantFreeze:
19
+ Description: "Checks usages of Object#freeze on immutable objects."
20
+ Enabled: false
21
+ Layout/DotPosition:
22
+ Description: Checks the position of the dot in multi-line method calls.
23
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains
24
+ Enabled: true
25
+ EnforcedStyle: trailing
26
+ SupportedStyles:
27
+ - leading
28
+ - trailing
29
+ Naming/FileName:
30
+ Description: Use snake_case for source file names.
31
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#snake-case-files
32
+ Enabled: false
33
+ Exclude: []
34
+ Naming/MemoizedInstanceVariableName:
35
+ Description: Memoized method name should match memo instance variable name.
36
+ Enabled: false
37
+ Naming/UncommunicativeMethodParamName:
38
+ Description: >-
39
+ Checks for method parameter names that contain capital letters,
40
+ end in numbers, or do not meet a minimal length.
41
+ Enabled: false
42
+ Style/GuardClause:
43
+ Description: Check for conditionals that can be replaced with guard clauses
44
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals
45
+ Enabled: true
46
+ MinBodyLength: 3
47
+ Style/IfUnlessModifier:
48
+ Description: Favor modifier if/unless usage when you have a single-line body.
49
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier
50
+ Enabled: false
51
+ Style/OptionHash:
52
+ Description: Don't use option hashes when you can use keyword arguments.
53
+ Enabled: false
54
+ Style/PercentLiteralDelimiters:
55
+ Description: Use `%`-literal delimiters consistently
56
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#percent-literal-braces
57
+ Enabled: false
58
+ PreferredDelimiters:
59
+ "%": "()"
60
+ "%i": "()"
61
+ "%q": "()"
62
+ "%Q": "()"
63
+ "%r": "{}"
64
+ "%s": "()"
65
+ "%w": "()"
66
+ "%W": "()"
67
+ "%x": "()"
68
+ Naming/PredicateName:
69
+ Description: Check the names of predicate methods.
70
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#bool-methods-qmark
71
+ Enabled: true
72
+ NamePrefix:
73
+ - is_
74
+ - has_
75
+ - have_
76
+ NamePrefixBlacklist:
77
+ - is_
78
+ Exclude:
79
+ - spec/**/*
80
+ Style/RaiseArgs:
81
+ Description: Checks the arguments passed to raise/fail.
82
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#exception-class-messages
83
+ Enabled: false
84
+ EnforcedStyle: exploded
85
+ SupportedStyles:
86
+ - compact
87
+ - exploded
88
+ Style/SignalException:
89
+ Description: Checks for proper usage of fail and raise.
90
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#fail-method
91
+ Enabled: false
92
+ EnforcedStyle: semantic
93
+ SupportedStyles:
94
+ - only_raise
95
+ - only_fail
96
+ - semantic
97
+ Style/SingleLineBlockParams:
98
+ Description: Enforces the names of some block params.
99
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#reduce-blocks
100
+ Enabled: false
101
+ Methods:
102
+ - reduce:
103
+ - a
104
+ - e
105
+ - inject:
106
+ - a
107
+ - e
108
+ Style/TrivialAccessors:
109
+ Enabled: false
110
+ Style/SingleLineMethods:
111
+ Description: Avoid single-line methods.
112
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-single-line-methods
113
+ Enabled: false
114
+ AllowIfMethodIsEmpty: true
115
+ Style/StringLiterals:
116
+ Description: Checks if uses of quotes match the configured preference.
117
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#consistent-string-literals
118
+ Enabled: true
119
+ EnforcedStyle: single_quotes
120
+ SupportedStyles:
121
+ - single_quotes
122
+ - double_quotes
123
+ Style/MixinUsage:
124
+ Enabled: true
125
+ Exclude:
126
+ - exe/*
127
+ Style/StringLiteralsInInterpolation:
128
+ Description: Checks if uses of quotes inside expressions in interpolated strings
129
+ match the configured preference.
130
+ Enabled: true
131
+ EnforcedStyle: single_quotes
132
+ SupportedStyles:
133
+ - single_quotes
134
+ - double_quotes
135
+ Style/TrailingCommaInArrayLiteral:
136
+ Description: Checks for trailing comma in parameter lists and literals.
137
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas
138
+ Enabled: true
139
+ EnforcedStyleForMultiline: comma
140
+ Style/TrailingCommaInHashLiteral:
141
+ Description: Checks for trailing comma in parameter lists and literals.
142
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas
143
+ Enabled: true
144
+ EnforcedStyleForMultiline: comma
145
+ Metrics/AbcSize:
146
+ Description: A calculated magnitude based on number of assignments, branches, and
147
+ conditions.
148
+ Enabled: false
149
+ Max: 15
150
+ Metrics/ClassLength:
151
+ Description: Avoid classes longer than 100 lines of code.
152
+ Enabled: false
153
+ CountComments: false
154
+ Max: 100
155
+ Metrics/ModuleLength:
156
+ CountComments: false
157
+ Max: 100
158
+ Description: Avoid modules longer than 100 lines of code.
159
+ Enabled: false
160
+ Metrics/CyclomaticComplexity:
161
+ Description: A complexity metric that is strongly correlated to the number of test
162
+ cases needed to validate a method.
163
+ Enabled: false
164
+ Max: 6
165
+ Metrics/MethodLength:
166
+ Description: Avoid methods longer than 10 lines of code.
167
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#short-methods
168
+ Enabled: false
169
+ CountComments: false
170
+ Max: 10
171
+ Metrics/ParameterLists:
172
+ Description: Avoid parameter lists longer than three or four parameters.
173
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#too-many-params
174
+ Enabled: false
175
+ Max: 5
176
+ CountKeywordArgs: true
177
+ Metrics/PerceivedComplexity:
178
+ Description: A complexity metric geared towards measuring complexity for a human
179
+ reader.
180
+ Enabled: false
181
+ Max: 7
182
+ Metrics/LineLength:
183
+ Description: Maximum line length
184
+ Enabled: true
185
+ Max: 95
186
+ Exclude:
187
+ - lib/honey_format/cli/*
188
+ - Gemfile
189
+ - honey_format.gemspec
190
+ - spec/**/*
191
+ Metrics/BlockLength:
192
+ Enabled: true
193
+ Exclude:
194
+ - lib/honey_format/cli/*
195
+ - spec/**/*
196
+ Lint/AssignmentInCondition:
197
+ Description: Don't use assignment in conditions.
198
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#safe-assignment-in-condition
199
+ Enabled: false
200
+ AllowSafeAssignment: true
201
+ Style/InlineComment:
202
+ Description: Avoid inline comments.
203
+ Enabled: false
204
+ Naming/AccessorMethodName:
205
+ Description: Check the naming of accessor methods for get_/set_.
206
+ Enabled: false
207
+ Style/Alias:
208
+ Description: Use alias_method instead of alias.
209
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#alias-method
210
+ Enabled: false
211
+ Style/Documentation:
212
+ Description: Document classes and non-namespace modules.
213
+ Enabled: false
214
+ Style/DoubleNegation:
215
+ Description: Checks for uses of double negation (!!).
216
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-bang-bang
217
+ Enabled: false
218
+ Style/EachWithObject:
219
+ Description: Prefer `each_with_object` over `inject` or `reduce`.
220
+ Enabled: false
221
+ Style/EmptyLiteral:
222
+ Description: Prefer literals to Array.new/Hash.new/String.new.
223
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#literal-array-hash
224
+ Enabled: false
225
+ Style/ModuleFunction:
226
+ Description: Checks for usage of `extend self` in modules.
227
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#module-function
228
+ Enabled: false
229
+ Style/OneLineConditional:
230
+ Description: Favor the ternary operator(?:) over if/then/else/end constructs.
231
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#ternary-operator
232
+ Enabled: false
233
+ Style/PerlBackrefs:
234
+ Description: Avoid Perl-style regex back references.
235
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-perl-regexp-last-matchers
236
+ Enabled: false
237
+ Style/Send:
238
+ Description: Prefer `Object#__send__` or `Object#public_send` to `send`, as `send`
239
+ may overlap with existing methods.
240
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#prefer-public-send
241
+ Enabled: false
242
+ Style/SpecialGlobalVars:
243
+ Description: Avoid Perl-style global variables.
244
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-cryptic-perlisms
245
+ Enabled: false
246
+ Style/VariableInterpolation:
247
+ Description: Don't interpolate global, instance and class variables directly in
248
+ strings.
249
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#curlies-interpolate
250
+ Enabled: false
251
+ Style/WhenThen:
252
+ Description: Use when x then ... for one-line cases.
253
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#one-line-cases
254
+ Enabled: false
255
+ Lint/EachWithObjectArgument:
256
+ Description: Check for immutable argument given to each_with_object.
257
+ Enabled: true
258
+ Lint/HandleExceptions:
259
+ Description: Don't suppress exception.
260
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions
261
+ Enabled: false
262
+ Lint/LiteralInInterpolation:
263
+ Description: Checks for literals used in interpolation.
264
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # HEAD
2
2
 
3
+ ## v0.17.0
4
+
5
+ :warning: This release contains some backwards compatible changes.
6
+
7
+ * Add global config for CSV `delimiter`, `row_delimiter`, `quote_character` and `skip_lines`
8
+ * Add `header_deduplicator` support to Matrix & CSV
9
+ * Make `HeaderColumnConverter` normalization even more aggressive [PR#32](https://github.com/buren/honey_format/pull/32)
10
+ - :warning: Backwards incompatible
11
+ * Add `blank` type [PR#34](https://github.com/buren/honey_format/pull/34)
12
+ * Rename `ValueConverter` => `Registry` and generalize implementation
13
+ * Rename `UnknownValueTypeError` => `UnknownTypeError`
14
+ - :warning: Backwards incompatible
15
+ * Allow unregister of existing value converters
16
+ * Add `hex` and `blank` converters to registry
17
+
3
18
  ## v0.16.0
4
19
 
5
20
  * Add `--type-map` option to CLI
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in honey_format.gemspec
data/README.md CHANGED
@@ -7,10 +7,10 @@ Proper objects for CSV headers and rows, convert column values, filter columns a
7
7
  ## Features
8
8
 
9
9
  - Proper objects for CSV header and rows
10
- - Convert column values
10
+ - Convert row and header column values
11
11
  - Pass your own custom row builder
12
- - Convert header column names
13
12
  - Filter what columns and rows are included in CSV output
13
+ - Gracefully handle missing and duplicated header columns
14
14
  - [CLI](#cli) - Simple command line interface
15
15
  - Only ~5-10% overhead from using Ruby CSV, see [benchmarks](#benchmark)
16
16
  - Has no dependencies other than Ruby stdlib
@@ -20,7 +20,6 @@ Read the [usage section](#usage), [RubyDoc](https://www.rubydoc.info/gems/honey
20
20
 
21
21
  ## Quick use
22
22
 
23
-
24
23
  ```ruby
25
24
  csv_string = <<-CSV
26
25
  Id,Username,Email
@@ -29,7 +28,7 @@ Id,Username,Email
29
28
  CSV
30
29
  csv = HoneyFormat::CSV.new(csv_string, type_map: { id: :integer })
31
30
  csv.columns # => [:id, :username]
32
- user = csv.rows # => [#<Row id="1", username="buren">]
31
+ user = csv.rows # => [#<Row id=1, username="buren">]
33
32
  user.id # => 1
34
33
  user.username # => "buren"
35
34
 
@@ -66,7 +65,7 @@ csv = HoneyFormat::CSV.new(csv_string)
66
65
  # Header
67
66
  header = csv.header
68
67
  header.original # => ["Id", "Username"]
69
- header.columns # => [:id, :username]
68
+ header.columns # => [:id, :username]
70
69
 
71
70
 
72
71
  # Rows
@@ -102,7 +101,7 @@ csv.rows.first.id # => 1
102
101
  Add your own converter
103
102
  ```ruby
104
103
  HoneyFormat.configure do |config|
105
- config.converter.register :upcased, proc { |v| v.upcase }
104
+ config.converter_registry.register :upcased, proc { |v| v.upcase }
106
105
  end
107
106
 
108
107
  csv_string = "Id,Username\n1,buren"
@@ -111,13 +110,22 @@ csv = HoneyFormat::CSV.new(csv_string, type_map: type_map)
111
110
  csv.rows.first.username # => "BUREN"
112
111
  ```
113
112
 
113
+ Remove registered converter
114
+ ```ruby
115
+ HoneyFormat.configure do |config|
116
+ config.converter_registry.unregister :upcase
117
+ # now you're free to register your own
118
+ config.converter_registry.register :upcase, proc { |v| v.upcase if v }
119
+ end
120
+ ```
121
+
114
122
  Access registered converters
115
123
  ```ruby
116
- decimal_converter = HoneyFormat.value_converter[:decimal]
124
+ decimal_converter = HoneyFormat.converter_registry[:decimal]
117
125
  decimal_converter.call('1.1') # => 1.1
118
126
  ```
119
127
 
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.
128
+ See [`Configuration#default_converters`](https://github.com/buren/honey_format/tree/master/lib/honey_format/configuration.rb#L38) for a complete list of the default ones.
121
129
 
122
130
  __Row builder__
123
131
 
@@ -196,7 +204,7 @@ csv = HoneyFormat::CSV.new(csv_string)
196
204
  # Header
197
205
  header = csv.header
198
206
  header.original # => ["Id", "Username"]
199
- header.columns # => [:id, :username]
207
+ header.columns # => [:id, :username]
200
208
  ```
201
209
 
202
210
  Define header
@@ -213,11 +221,11 @@ HoneyFormat.configure do |config|
213
221
  end
214
222
 
215
223
  # you can get the default one with
216
- header_converter = HoneyFormat.value_converter[:header_column]
224
+ header_converter = HoneyFormat.converter_registry[:header_column]
217
225
  header_converter.call('First name') # => "first_name"
218
226
  ```
219
227
 
220
- Use any value converter as the header converter
228
+ Use any converter registry as the header converter
221
229
  ```ruby
222
230
  csv_string = "Id,Username\n1,buren"
223
231
  csv = HoneyFormat::CSV.new(csv_string, header_converter: :upcase)
@@ -232,7 +240,7 @@ converter = ->(column) { map.fetch(column, column.downcase) }
232
240
  csv_string = "ID,First^Name\n1,Jacob"
233
241
  user = HoneyFormat::CSV.new(csv_string, header_converter: converter).rows.first
234
242
  user.first_name # => "Jacob"
235
- user.id # => "1"
243
+ user.id # => "1"
236
244
  ```
237
245
 
238
246
  Missing header values
@@ -243,6 +251,23 @@ user = csv.rows.first
243
251
  user.column1 # => "val1"
244
252
  ```
245
253
 
254
+ Duplicated header values
255
+ ```ruby
256
+ csv_string = <<~CSV
257
+ email,email,name
258
+ john@example.com,jane@example.com,John
259
+ CSV
260
+ # :deduplicate is the default value
261
+ csv = HoneyFormat::CSV.new(csv_string, header_deduplicator: :deduplicate)
262
+ user = csv.rows.first
263
+ user.email # => john@example.com
264
+ user.email1 # => jane@example.com
265
+
266
+ # you can also choose to raise an error instead
267
+ HoneyFormat::CSV.new(csv_string, header_deduplicator: :raise)
268
+ # => HoneyFormat::DuplicateHeaderColumnError
269
+ ```
270
+
246
271
  If your header contains special chars and/or chars that can't be part of Ruby method names,
247
272
  things can get a little awkward..
248
273
  ```ruby
@@ -280,8 +305,6 @@ end
280
305
 
281
306
  You can see all [available errors here](https://www.rubydoc.info/gems/honey_format/HoneyFormat/Errors).
282
307
 
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.
284
-
285
308
  __Skip lines__
286
309
 
287
310
  > Skip comments and/or other unwanted lines from being parsed.
@@ -298,6 +321,31 @@ csv = HoneyFormat::CSV.new(csv_string, skip_lines: regexp)
298
321
  csv.rows.length # => 2
299
322
  ```
300
323
 
324
+ __Matrix__
325
+
326
+ > Use whats under the hood.
327
+
328
+ Actually `HoneyFormat::CSV` is a very thin wrapper around `HoneyFormat::Matrix`.
329
+ You can use `Matrix` directly it support all options that aren't specifically tied to parsing a CSV.
330
+
331
+ Example
332
+ ```ruby
333
+ data = [
334
+ %w[name id],
335
+ %w[jacob 1]
336
+ ]
337
+ type_map = {
338
+ id: :integer,
339
+ name: :upcase
340
+ }
341
+
342
+ matrix = HoneyFormat::Matrix.new(data, type_map: { id: :integer, name: :upcase })
343
+ matrix.columns # => [:name, :id]
344
+ matrix.rows.to_a # => [#<Row name="JACOB", id=1>]
345
+ matrix.to_csv # => "name,id\nJACOB,1\n"
346
+ ```
347
+
348
+ 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 and of course [on RubyDoc](https://www.rubydoc.info/gems/honey_format/).
301
349
 
302
350
  ## CLI
303
351
 
@@ -330,7 +378,7 @@ $ honey_format input.csv --columns=id,username > output.csv
330
378
 
331
379
  ## Benchmark
332
380
 
333
- _Note_: This gem, adds some overhead to parsing a CSV string, typically ~5-10%. I've included some benchmarks below, your mileage may vary..
381
+ _Note_: This gem, adds some overhead to parsing a CSV string, typically ~5-10%. I've included some benchmarks below, your mileage may vary.. The benchmarks have been run with Ruby 2.5.
334
382
 
335
383
  204KB (1k lines)
336
384
 
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
data/bin/benchmark CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
2
4
  require 'bundler/setup'
3
5
  require 'honey_format'
4
6
 
data/bin/console CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'honey_format'
data/exe/honey_format CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  # for dev purposes
4
5
  require 'bundler/setup' if ENV['HONEY_FORMAT_GEM_DEV']
data/honey_format.gemspec CHANGED
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'honey_format/version'
5
6
 
@@ -21,10 +22,10 @@ Gem::Specification.new do |spec|
21
22
 
22
23
  spec.required_ruby_version = '>= 2.3.0'
23
24
 
25
+ spec.add_development_dependency 'benchmark-ips'
24
26
  spec.add_development_dependency 'bundler', '~> 1.10'
27
+ spec.add_development_dependency 'byebug'
25
28
  spec.add_development_dependency 'rake', '~> 10.0'
26
- spec.add_development_dependency 'benchmark-ips'
27
29
  spec.add_development_dependency 'rspec'
28
30
  spec.add_development_dependency 'simplecov'
29
- spec.add_development_dependency 'byebug'
30
31
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'optparse'
2
4
  require 'honey_format/cli/result_writer'
3
5
 
@@ -7,9 +9,9 @@ module HoneyFormat
7
9
  # @attr_reader [CLIResultWriter] writer the CLI result writer
8
10
  class BenchmarkCLI
9
11
  # CSV default test data location
10
- CSV_TEST_DATA_URL = 'https://gist.github.com/buren/b669dd82fa37e37672da2cab33c8a830/raw/54ba14a698941ff61f3b854b66df0a7782c79c85/csv_1000_rows.csv'
12
+ CSV_TEST_DATA_URL = 'https://gist.github.com/buren/b669dd82fa37e37672da2cab33c8a830/raw/54ba14a698941ff61f3b854b66df0a7782c79c85/csv_1000_rows.csv'.freeze
11
13
  # CSV default test data cache location
12
- CSV_TEST_DATA_CACHE_PATH = '/tmp/honey-format-benchmark-test.csv'
14
+ CSV_TEST_DATA_CACHE_PATH = '/tmp/honey-format-benchmark-test.csv'.freeze
13
15
 
14
16
  attr_reader :writer, :options
15
17
 
@@ -44,7 +46,7 @@ module HoneyFormat
44
46
  def fetch_default_benchmark_csv
45
47
  cache_path = CSV_TEST_DATA_CACHE_PATH
46
48
 
47
- if File.exists?(cache_path)
49
+ if File.exist?(cache_path)
48
50
  writer.puts "Cache file found at #{cache_path}.", verbose: true
49
51
  @used_input_path = cache_path
50
52
  return File.read(cache_path)
@@ -52,7 +54,7 @@ module HoneyFormat
52
54
 
53
55
  writer.print 'Downloading test data file from GitHub..', verbose: true
54
56
  require 'open-uri'
55
- open(CSV_TEST_DATA_URL).read.tap do |csv|
57
+ open(CSV_TEST_DATA_URL).read.tap do |csv| # rubocop:disable Security/Open
56
58
  @used_input_path = CSV_TEST_DATA_URL
57
59
  writer.puts 'done!', verbose: true
58
60
  File.write(cache_path, csv)
@@ -71,18 +73,18 @@ module HoneyFormat
71
73
  verbose = false
72
74
 
73
75
  OptionParser.new do |parser|
74
- parser.banner = "Usage: bin/benchmark [file.csv] [options]"
75
- parser.default_argv = ARGV
76
+ parser.banner = 'Usage: bin/benchmark [file.csv] [options]'
77
+ parser.default_argv = argv
76
78
 
77
- parser.on("--csv=[file1.csv]", String, "CSV file(s)") do |value|
79
+ parser.on('--csv=[file1.csv]', String, 'CSV file(s)') do |value|
78
80
  input_path = value
79
81
  end
80
82
 
81
- parser.on("--[no-]verbose", "Verbose output") do |value|
83
+ parser.on('--[no-]verbose', 'Verbose output') do |value|
82
84
  verbose = value
83
85
  end
84
86
 
85
- parser.on("--lines-multipliers=[1,10,50]", Array, "Multiply the rows in the CSV file (default: 1)") do |value|
87
+ parser.on('--lines-multipliers=[1,10,50]', Array, 'Multiply the rows in the CSV file (default: 1)') do |value|
86
88
  lines_multipliers = value.map do |v|
87
89
  Integer(v).tap do |int|
88
90
  unless int >= 1
@@ -92,21 +94,21 @@ module HoneyFormat
92
94
  end
93
95
  end
94
96
 
95
- parser.on("--time=[30]", String, "Benchmark time (default: 30)") do |value|
97
+ parser.on('--time=[30]', String, 'Benchmark time (default: 30)') do |value|
96
98
  benchmark_time = Integer(value)
97
99
  end
98
100
 
99
- parser.on("--warmup=[30]", String, "Benchmark warmup (default: 30)") do |value|
101
+ parser.on('--warmup=[30]', String, 'Benchmark warmup (default: 30)') do |value|
100
102
  benchmark_warmup = Integer(value)
101
103
  end
102
104
 
103
- parser.on("-h", "--help", "How to use") do
105
+ parser.on('-h', '--help', 'How to use') do
104
106
  puts parser
105
107
  exit
106
108
  end
107
109
 
108
110
  # No argument, shows at tail. This will print an options summary.
109
- parser.on_tail("-h", "--help", "Show this message") do
111
+ parser.on_tail('-h', '--help', 'Show this message') do
110
112
  puts parser
111
113
  exit
112
114
  end