honey_format 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -1
- data/README.md +7 -0
- data/honey_format.gemspec +2 -0
- data/lib/honey_format/convert_header_value.rb +1 -0
- data/lib/honey_format/csv.rb +17 -7
- data/lib/honey_format/header.rb +2 -1
- data/lib/honey_format/row.rb +3 -1
- data/lib/honey_format/row_builder.rb +1 -0
- data/lib/honey_format/rows.rb +20 -2
- 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: e5d7c212e16b346e58a80617576ff6c39b1938885b8a66ad7a91c1b7654897cf
|
4
|
+
data.tar.gz: e70bee6d2a69eb8624a35d69300c0e0f02772e88f0237a94f64fa6a13d0c409f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a0af309f8e7f31f725cd9b3d391ee27c4ebf858d31498f39dad99e78cf55ebcd8541a347fb2937fa51a52a0b43405b611943f52dda8040a9124ada30f3a2b54
|
7
|
+
data.tar.gz: 9c6a89db6da810c78dfe2c74b0fb1ea175b4e62392226bd84e92c53ce5529049190e5c99cdb518dc358f5a98d4385fc3554add7407d2f5c809e3966631ffc467
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -91,6 +91,13 @@ csv = HoneyFormat::CSV.new(csv_string)
|
|
91
91
|
csv.to_csv(columns: [:id, :country]) # => "id,country\nburen,Sweden\n"
|
92
92
|
```
|
93
93
|
|
94
|
+
Output a subset of rows to CSV
|
95
|
+
```ruby
|
96
|
+
csv_string = "Name, Country\nburen,Sweden\njacob,Denmark"
|
97
|
+
csv = HoneyFormat::CSV.new(csv_string)
|
98
|
+
csv.to_csv { |row| row.country == 'Sweden' } # => "name,country\nburen,Sweden\n"
|
99
|
+
```
|
100
|
+
|
94
101
|
You can of course set the delimiter
|
95
102
|
```ruby
|
96
103
|
HoneyFormat::CSV.new(csv_string, delimiter: ';')
|
data/honey_format.gemspec
CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
+
spec.required_ruby_version = '>= 2.3.0'
|
22
|
+
|
21
23
|
spec.add_development_dependency 'bundler', '~> 1.10'
|
22
24
|
spec.add_development_dependency 'rake', '~> 10.0'
|
23
25
|
spec.add_development_dependency 'benchmark-ips'
|
@@ -16,6 +16,7 @@ module HoneyFormat
|
|
16
16
|
# Returns converted value and mutates the argument.
|
17
17
|
# @return [Symbol] the cleaned header column.
|
18
18
|
# @param [String] column the string to be cleaned.
|
19
|
+
# @param [Integer] column index.
|
19
20
|
# @example Convert simple header
|
20
21
|
# ConvertHeaderValue.call(" User name ") #=> "user_name"
|
21
22
|
# @example Convert complex header
|
data/lib/honey_format/csv.rb
CHANGED
@@ -7,9 +7,11 @@ module HoneyFormat
|
|
7
7
|
# Represents CSV.
|
8
8
|
class CSV
|
9
9
|
# @return [CSV] a new instance of CSV.
|
10
|
-
# @param [String] csv string
|
11
|
-
# @param [
|
12
|
-
# @param [Array<String>] header optional argument
|
10
|
+
# @param [String] csv the CSV string
|
11
|
+
# @param [String] delimiter the CSV delimiter
|
12
|
+
# @param [Array<String>] header optional argument that represents CSV header, required if the CSV file lacks a header row.
|
13
|
+
# @param [Array<Symbol>] valid_columns array of symbols representing valid columns, if empty all will be considered valid.
|
14
|
+
# @param [#call] header_converter converts header columns.
|
13
15
|
# @param [#call] row_builder will be called for each parsed row.
|
14
16
|
# @raise [HeaderError] super class of errors raised when there is a CSV header error.
|
15
17
|
# @raise [MissingHeaderError] raised when header is missing (empty or nil).
|
@@ -38,13 +40,12 @@ module HoneyFormat
|
|
38
40
|
end
|
39
41
|
|
40
42
|
# @return [Array] of rows.
|
41
|
-
# @raise [InvalidRowLengthError] raised when there are more row elements longer than columns
|
42
43
|
def rows
|
43
44
|
@rows
|
44
45
|
end
|
45
46
|
|
46
47
|
# @yield [row] The given block will be passed for every row.
|
47
|
-
# @yieldparam [Row]
|
48
|
+
# @yieldparam [Row] row in the CSV.
|
48
49
|
# @return [Enumerator] If no block is given, an enumerator object will be returned.
|
49
50
|
def each_row
|
50
51
|
return rows.each unless block_given?
|
@@ -53,9 +54,18 @@ module HoneyFormat
|
|
53
54
|
end
|
54
55
|
|
55
56
|
# Convert CSV object as CSV-string.
|
57
|
+
# @param columns [Array<Symbol>, Set<Symbol>, NilClass] the columns to output, nil means all columns (default: nil)
|
58
|
+
# @yield [row] The given block will be passed for every row - return truthy if you want the row to be included in the output
|
59
|
+
# @yieldparam [Row] row
|
56
60
|
# @return [String] CSV-string representation.
|
57
|
-
|
58
|
-
|
61
|
+
# @example with selected columns
|
62
|
+
# csv.to_csv(columns: [:id, :country])
|
63
|
+
# @example with selected rows
|
64
|
+
# csv.to_csv { |row| row.country == 'Sweden' }
|
65
|
+
# @example with both selected columns and rows
|
66
|
+
# csv.to_csv(columns: [:id, :country]) { |row| row.country == 'Sweden' }
|
67
|
+
def to_csv(columns: nil, &block)
|
68
|
+
@header.to_csv(columns: columns) + @rows.to_csv(columns: columns, &block)
|
59
69
|
end
|
60
70
|
end
|
61
71
|
end
|
data/lib/honey_format/header.rb
CHANGED
@@ -10,6 +10,7 @@ module HoneyFormat
|
|
10
10
|
# @param [Array<String>] header array of strings.
|
11
11
|
# @param [Array<Symbol, String>] valid array representing the valid columns, if empty all columns will be considered valid.
|
12
12
|
# @param converter [#call] header converter that implements a #call method that takes one column (string) argument.
|
13
|
+
# @raise [HeaderError] super class of errors raised when there is a CSV header error.
|
13
14
|
# @raise [MissingHeaderColumnError] raised when header is missing
|
14
15
|
# @raise [UnknownHeaderColumnError] raised when column is not in valid list.
|
15
16
|
# @example Instantiate a header with a customer converter
|
@@ -32,7 +33,7 @@ module HoneyFormat
|
|
32
33
|
end
|
33
34
|
|
34
35
|
# @yield [row] The given block will be passed for every column.
|
35
|
-
# @yieldparam [Row] a
|
36
|
+
# @yieldparam [Row] a column in the CSV header.
|
36
37
|
# @return [Enumerator]
|
37
38
|
# If no block is given, an enumerator object will be returned.
|
38
39
|
def each(&block)
|
data/lib/honey_format/row.rb
CHANGED
@@ -7,7 +7,9 @@ module HoneyFormat
|
|
7
7
|
# @return [Row] a new instance of Row.
|
8
8
|
# @param [Array] columns an array of symbols.
|
9
9
|
# @param builder [#call, #to_csv] optional row builder
|
10
|
+
# @raise [RowError] super class of errors raised when there is a row error.
|
10
11
|
# @raise [EmptyRowColumnsError] raised when there are no columns.
|
12
|
+
# @raise [InvalidRowLengthError] raised when row has more columns than header columns.
|
11
13
|
# @example Create new row
|
12
14
|
# Row.new!([:id])
|
13
15
|
def initialize(columns, builder: nil)
|
@@ -22,7 +24,7 @@ module HoneyFormat
|
|
22
24
|
end
|
23
25
|
|
24
26
|
# Returns a Struct.
|
25
|
-
# @return [
|
27
|
+
# @return [Object] a new instance of built row.
|
26
28
|
# @param row [Array] the row array.
|
27
29
|
# @raise [InvalidRowLengthError] raised when there are more row elements longer than columns
|
28
30
|
# @example Build new row
|
@@ -8,6 +8,7 @@ module HoneyFormat
|
|
8
8
|
end
|
9
9
|
|
10
10
|
# Represent row as CSV
|
11
|
+
# @param columns [Array<Symbol>, Set<Symbol>, NilClass] the columns to output, nil means all columns (default: nil)
|
11
12
|
# @return [String] CSV-string representation.
|
12
13
|
def to_csv(columns: nil)
|
13
14
|
attributes = members
|
data/lib/honey_format/rows.rb
CHANGED
@@ -10,6 +10,9 @@ module HoneyFormat
|
|
10
10
|
# @return [Rows] new instance of Rows.
|
11
11
|
# @param [Array] rows the array of rows.
|
12
12
|
# @param [Array] columns the array of column symbols.
|
13
|
+
# @raise [RowError] super class of errors raised when there is a row error.
|
14
|
+
# @raise [EmptyRowColumnsError] raised when there are no columns.
|
15
|
+
# @raise [InvalidRowLengthError] raised when row has more columns than header columns.
|
13
16
|
def initialize(rows, columns, builder: nil)
|
14
17
|
@rows = prepare_rows(Row.new(columns, builder: builder), rows)
|
15
18
|
end
|
@@ -35,11 +38,26 @@ module HoneyFormat
|
|
35
38
|
end
|
36
39
|
alias_method :size, :length
|
37
40
|
|
41
|
+
# @param columns [Array<Symbol>, Set<Symbol>, NilClass] the columns to output, nil means all columns (default: nil)
|
42
|
+
# @yield [row] each row - return truthy if you want the row to be included in the output
|
43
|
+
# @yieldparam [Row] row
|
38
44
|
# @return [String] CSV-string representation.
|
39
|
-
|
45
|
+
# @example with selected columns
|
46
|
+
# rows.to_csv(columns: [:id, :country])
|
47
|
+
# @example with selected rows
|
48
|
+
# rows.to_csv { |row| row.country == 'Sweden' }
|
49
|
+
# @example with both selected columns and rows
|
50
|
+
# csv.to_csv(columns: [:id, :country]) { |row| row.country == 'Sweden' }
|
51
|
+
def to_csv(columns: nil, &block)
|
40
52
|
# Convert columns to Set for performance
|
41
53
|
columns = Set.new(columns) if columns
|
42
|
-
|
54
|
+
csv_rows = []
|
55
|
+
each do |row|
|
56
|
+
if !block || block.call(row)
|
57
|
+
csv_rows << row.to_csv(columns: columns)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
csv_rows.join
|
43
61
|
end
|
44
62
|
|
45
63
|
private
|
data/lib/honey_format/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: honey_format
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jacob Burenstam
|
@@ -137,7 +137,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
137
137
|
requirements:
|
138
138
|
- - ">="
|
139
139
|
- !ruby/object:Gem::Version
|
140
|
-
version:
|
140
|
+
version: 2.3.0
|
141
141
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - ">="
|