honey_format 0.9.0 → 0.10.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/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
|
- - ">="
|