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