honey_format 0.3.0 → 0.4.0

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
  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