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 +4 -4
- data/README.md +12 -8
- data/lib/honey_format/csv.rb +4 -2
- data/lib/honey_format/row.rb +3 -2
- data/lib/honey_format/rows.rb +5 -5
- data/lib/honey_format/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a39f797b080a1d5ff641f7f477cdfe2d181cf599e0ab3e05a3e1d69e21ebb94b
|
4
|
+
data.tar.gz: 2701ce31bf31e19229d11d6ff6f817de24c9d24165d27904c30cd8bc7f6b9752
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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 =
|
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 =
|
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 =
|
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 =
|
88
|
+
user = HoneyFormat::CSV.new(csv_string).rows.first
|
85
89
|
user.public_send(:"first-name") # => "Jacob"
|
86
90
|
```
|
87
91
|
|
data/lib/honey_format/csv.rb
CHANGED
@@ -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.
|
data/lib/honey_format/row.rb
CHANGED
@@ -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
|
data/lib/honey_format/rows.rb
CHANGED
@@ -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
|
-
|
26
|
-
|
27
|
-
|
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
|
data/lib/honey_format/version.rb
CHANGED
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.
|
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-
|
11
|
+
date: 2018-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|