honey_format 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d0c2df26f96e590dfd9c65b15c99b9cb17227c02b434e09acd5afc0477b4e5ba
4
- data.tar.gz: 59acd72d13e5474e22b47f35beb6961de6a38c7104b1a6f73bfb85f99d301a75
3
+ metadata.gz: a39f797b080a1d5ff641f7f477cdfe2d181cf599e0ab3e05a3e1d69e21ebb94b
4
+ data.tar.gz: 2701ce31bf31e19229d11d6ff6f817de24c9d24165d27904c30cd8bc7f6b9752
5
5
  SHA512:
6
- metadata.gz: 549b7fd83a6d787d0d5aef97fbec94a33fb6fbca040e2523d7a30724c2e56b81669f71d8464eac6ab428ef4552e4ca4bb614b4d2046aa0bd6d2d527b3a1a17b1
7
- data.tar.gz: 6889ec68257b31887b4e804766c281b0547f93d8feb8720214670d79cf2636f40920633181ce7597d66e7ae381bac34dc32e1f449bccac19be73eab24c29b539
6
+ metadata.gz: cedc41b03b37daa7199cd11d6f2b4fd72599ae31adac8c7379c3dd396f364215cf5eff2376d09c975482ae44491aa74d7042e3c90b4bfb36ddc156a51b32c372
7
+ data.tar.gz: 45ec386f47253fd4a1e5c6e86cd99f7e381abe93be65fb4fc766fb2b3fdc29f84c4037209af68cf75ad1fbc10621d539b04976bc8e579eac9398fc8251755b2e
data/README.md CHANGED
@@ -43,31 +43,35 @@ csv = HoneyFormat::CSV.new(csv_string)
43
43
  csv.header # => ["Id", "Username"]
44
44
  csv.column # => [:id, :username]
45
45
 
46
- include HoneyFormat
47
- # If included you can use the HoneyCSV shorthand
48
- csv = HoneyCSV.new(csv_string)
49
46
  rows = csv.rows # => [#<struct id="1", username="buren">]
50
47
  user = rows.first
51
48
  user.id # => "1"
52
49
  user.username # => "buren"
53
50
  ```
54
51
 
52
+ ```ruby
53
+ csv_string = "Id, Username\n 1, buren"
54
+ uppercase_strings = ->(o) { o.is_a?(String) ? o.upcase : o }
55
+ csv = HoneyFormat::CSV.new(csv_string, row_builder: uppercase_strings)
56
+ csv.rows # => [#<struct id="1", username="BUREN">]
57
+ ```
58
+
55
59
  Validate CSV header
56
60
  ```ruby
57
61
  csv_string = "Id, Username\n 1, buren"
58
62
  # Invalid
59
- HoneyCSV.new(csv_string, valid_columns: [:something, :username])
63
+ HoneyFormat::CSV.new(csv_string, valid_columns: [:something, :username])
60
64
  # => #<HoneyFormat::MissingCSVHeaderColumnError: key :id ("Id") not in [:something, :username]>
61
65
 
62
66
  # Valid
63
- csv = HoneyCSV.new(csv_string, valid_columns: [:id, :username])
67
+ csv = HoneyFormat::CSV.new(csv_string, valid_columns: [:id, :username])
64
68
  csv.rows.first.username # => "buren"
65
69
  ```
66
70
 
67
71
  Define header
68
72
  ```ruby
69
73
  csv_string = "1, buren"
70
- csv = HoneyCSV.new(csv_string, header: ['Id', 'Username'])
74
+ csv = HoneyFormat::CSV.new(csv_string, header: ['Id', 'Username'])
71
75
  csv.rows.first.username # => "buren"
72
76
  ```
73
77
 
@@ -75,13 +79,13 @@ If your header contains special chars and/or chars that can't be part of Ruby me
75
79
  things get a little awkward..
76
80
  ```ruby
77
81
  csv_string = "ÅÄÖ\nSwedish characters"
78
- user = HoneyCSV.new(csv_string).rows.first
82
+ user = HoneyFormat::CSV.new(csv_string).rows.first
79
83
  # Note that these chars aren't "downcased",
80
84
  # "ÅÄÖ".downcase # => "ÅÄÖ"
81
85
  user.ÅÄÖ # => "Swedish characters"
82
86
 
83
87
  csv_string = "First-Name\nJacob"
84
- user = HoneyCSV.new(csv_string).rows.first
88
+ user = HoneyFormat::CSV.new(csv_string).rows.first
85
89
  user.public_send(:"first-name") # => "Jacob"
86
90
  ```
87
91
 
@@ -11,13 +11,15 @@ module HoneyFormat
11
11
  # @param [String] csv string.
12
12
  # @param [Array] valid_columns valid array of symbols representing valid columns.
13
13
  # @param [Array] header optional argument for CSV header
14
+ # @param [#call] row_builder will be called for each parsed row
14
15
  # @raise [MissingCSVHeaderError] raised when header is missing (empty or nil).
15
16
  # @raise [MissingCSVHeaderColumnError] raised when header column is missing.
16
17
  # @raise [UnknownCSVHeaderColumnError] raised when column is not in valid list.
17
- def initialize(csv, delimiter: ',', header: nil, valid_columns: :all, header_converter: ConvertHeaderValue)
18
+ def initialize(csv, delimiter: ',', header: nil, valid_columns: :all, header_converter: ConvertHeaderValue, row_builder: nil)
18
19
  csv = ::CSV.parse(csv, col_sep: delimiter)
19
20
  @csv_body = csv
20
21
  @header = Header.new(header || csv.shift, valid: valid_columns, converter: header_converter)
22
+ @row_builder = row_builder
21
23
  end
22
24
 
23
25
  # @return [Array] of strings for sanitized header.
@@ -33,7 +35,7 @@ module HoneyFormat
33
35
  # @return [Array] of rows.
34
36
  # @raise [InvalidRowLengthError] raised when there are more row elements longer than columns
35
37
  def rows
36
- @rows ||= Rows.new(@csv_body, columns).to_a
38
+ @rows ||= Rows.new(@csv_body, columns, builder: @row_builder).to_a
37
39
  end
38
40
 
39
41
  # @yield [row] block to receive the row.
@@ -7,10 +7,11 @@ module HoneyFormat
7
7
  # @raise [EmptyColumnsError] raised when there are no columns.
8
8
  # @example Create new row
9
9
  # Row.new!([:id])
10
- def initialize(columns)
10
+ def initialize(columns, builder: nil)
11
11
  validate_columns!(columns)
12
12
  @klass = Struct.new(*columns)
13
13
  @columns = columns
14
+ @builder = builder
14
15
  end
15
16
 
16
17
  # Returns a Struct.
@@ -21,7 +22,7 @@ module HoneyFormat
21
22
  # r = Row.new!([:id])
22
23
  # r.build(['1']).id #=> '1'
23
24
  def build(row)
24
- @klass.new(*row)
25
+ @klass.new(*row).tap { |o| @builder && @builder.call(o) }
25
26
  rescue ArgumentError, 'struct size differs'
26
27
  fail_for_struct_size_diff!(row)
27
28
  end
@@ -7,8 +7,8 @@ module HoneyFormat
7
7
  # @return [Rows] new instance of Rows.
8
8
  # @param [Array] rows the array of rows.
9
9
  # @param [Array] columns the array of column symbols.
10
- def initialize(rows, columns)
11
- @rows = prepare_rows(Row.new(columns), rows)
10
+ def initialize(rows, columns, builder: nil)
11
+ @rows = prepare_rows(Row.new(columns, builder: builder), rows)
12
12
  end
13
13
 
14
14
  # Returns rows as array.
@@ -22,9 +22,9 @@ module HoneyFormat
22
22
  def prepare_rows(builder, rows)
23
23
  built_rows = []
24
24
  rows.each do |row|
25
- unless row.first.nil? # The Ruby CSV library returns empty lines as [nil], ignore them..
26
- built_rows << builder.build(Sanitize.array!(row))
27
- end
25
+ # ignore empty rows - the Ruby CSV library can return empty lines as [nil]
26
+ next if row.empty? || row.nil? || row == [nil]
27
+ built_rows << builder.build(Sanitize.array!(row))
28
28
  end
29
29
  built_rows
30
30
  end
@@ -1,4 +1,4 @@
1
1
  module HoneyFormat
2
2
  # Gem version
3
- VERSION = '0.3.0'
3
+ VERSION = '0.4.0'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honey_format
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacob Burenstam
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-27 00:00:00.000000000 Z
11
+ date: 2018-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler